【问题标题】:Is it possible to access fragment's UI elements from activitiy's onCreate是否可以从活动的 onCreate 访问片段 UI 元素
【发布时间】:2014-06-16 21:35:45
【问题描述】:

正如标题所说:是否有可能在活动的 onCreate() 方法中初始化所有 UI 元素的当前可见片段? 我正在使用处理业务逻辑和 UI 事件的单独控制器类实现模型、视图和控制器的分离。因此他们需要对当前片段的引用。这些控制器在活动的 onCreate() 方法中初始化,因此我需要该方法中的初始化片段。

我欢迎任何形式的建议:)

编辑:

添加一些代码以便更好地理解: 我正在使用 dagger 进行依赖注入,并希望在 onCreate() 方法中执行此操作。正如我之前所说,我的控制器需要一个 mapView 元素。这就是为什么我想要一个初始化了 mapView 元素的片段。

MapActivity#onCreate(Bundle):

public void onCreate(Bundle savedInstance) {
    super.onCreate(savedInstance);
    setContentView(R.layout.activity_layout);

    MyMapFragment fragment = new MyMapFragment();
    getFragmentManager().beginTransaction()
        .add(R.id.activity_container, fragment, "fragment")
        .commit();

    ObjectGraph.create(new Module(fragment.getMapView())).inject(this);
}    

activity_layout.xml

<android.support.v4.widget.DrawerLayout>
    <FrameLayout
        android:id="@+id/activity_container"
        ... />
    <ListView .../>
</android.support.v4.widget.DrawerLayout>

fragment_layout.xml

<RelativeLayout>
    <org.osmdroid.map.MapView 
        android:id"@+id/mapview"
        ... />
    <Button .../>
</RelativeLayout>

第二次编辑: 所以这似乎是不可能的......是的反对票^^

【问题讨论】:

  • 你想做的事是不可能的。再次检查 Fragments 和 Activity 的生命周期。
  • 关于片段和活动的生命周期如何交互的信息很少,所以我认为 onCreateView() 会在片段创建时被正确调用...

标签: android android-fragments


【解决方案1】:

默认情况下,没有。在活动onCreate() 运行时,该片段尚未附加到活动。

访问片段视图的正确位置是片段本身。考虑在片段的生命周期内将控制器分配放在片段中,例如onCreateView()onViewCreated()

可以使用executePendingTransactions() 显式运行排队的片段事务,或者在活动生命周期中运行super.onStart() 之后隐式运行。之后,片段视图可以在活动视图层次结构中访问。

【讨论】:

  • 不能在片段中执行此操作,因为活动是注入的起点......我认为除了使用片段中的回调之外还有另一种选择。这对我来说似乎是一个笨拙的解决方案......
【解决方案2】:

你可以在activity中创建一个接口并在Fragment上实现它...

【讨论】:

  • 对不起,这对我来说太神秘了;)
  • 你知道Interface..如何创建和使用它吗??
  • 是的,我知道接口以及如何实现它们。你能详细说明一下你会做什么吗?
  • 1.在 Oncreate...2 中创建一个片段。实现这个onFragment..3.在片段类的实现中更新片段UI..
  • 对不起,我还是不明白你的做法是什么。
【解决方案3】:

在您的 onCreate 方法中添加以下内容(我以 textview 为例):

while (fragment.getView() == null) {

        }
rootView = fragment.getView();
TextView myView = (TextView) rootView.findViewById(R.id.text_view);

确保在片段的onCreateView 方法中返回rootView,如下所示:

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_activity,
                container, false);
        return rootView;
    }

我知道让您的片段从主要活动中访问其视图的想法很糟糕。然而,这个解决方案可能会给你你想要的。

【讨论】:

  • 这将永远阻塞 UI 线程,并且应用程序被“应用程序无响应”杀死。
  • @laalto 我认为它会在while循环中停留一段时间,直到活动收到片段rootView。它不会永远阻止该应用程序。我不知道您的意思是不是不能保证从片段中返回 rootView。你怎么看?
  • 片段事务将在您阻塞的同一 UI 线程上执行。
  • 不会创建视图,因为 Android 仅在一个线程上运行。你会永远阻止那个线程
猜你喜欢
  • 1970-01-01
  • 2022-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-30
  • 1970-01-01
相关资源
最近更新 更多