【问题标题】:When is fragment finally attached to activity?片段何时最终附加到活动?
【发布时间】:2015-07-20 08:48:12
【问题描述】:

我有一个主片段,里面有一个 viewpager。这个 viewpager 有 2 个页面(列表片段)。当我开始活动时,会显示主要片段,并且我还显示第一个分页片段。这个分页片段使用AsyncTask 显示来自数据库的数据。

在我的主要片段中:

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    onPageSelected(0);
}

@Override
public void onPageSelected(int position) {
    Fragment fragment = (Fragment) pagerAdapter.instantiateItem(viewPager, position);
    if (fragment instanceof IPagedFragment) {
        ((IPagedFragment) fragment).onShown(getActivity());
    }
}

界面是:

public interface IPagedFragment {
    void onShown(FragmentActivity activity);
}

我遇到的第一个问题是我必须将活动作为参数传递,因为当onShown 被调用时,活动仍然为空。

此外,分页片段使用类似于 LoginActivity 示例的进度条逻辑。我也得到以下异常:

IllegalStateException:片段 PagedFragment1{4201f758} 未附加到 Activity 在 android.support.v4.app.Fragment.getResources(Fragment.java:620)

那么,一旦分页片段对 UI 完全可用,开始从 db 检索数据的正确阶段是什么?

【问题讨论】:

    标签: android android-fragments android-activity


    【解决方案1】:

    像您这样的问题是一些开发人员开始质疑片段是否真的那么好或有用的原因。

    “正确”也值得商榷,因为您可以在不同的地方执行此操作,并且不同的开发人员会给您不同的答案,但让我尝试为您提供一些有用的信息。

    附加/分离回调:

    public void onAttach(Activity activity);
    public void onDetach();
    

    在这两种方法之间,任何对getActivity() 的调用都将返回片段连接到的非空活动。您可以覆盖它们并使用private boolean isAttached 来跟踪该呼叫。

    同样有用的是:

    public void onActivityCreated (Bundle savedInstanceState)
    

    此方法在Activity.onCreate 方法之后称为。如果您依赖于那里发生的一些初始化,这一点非常重要。

    另外重要的是要记住,在片段事务发生的那一刻,Fragment.onCreate 发生在 Activity.onCreate 之后,而在轮换期间它发生在它之前。

    一般来说,我使用Fragment.onStart() / Fragment.onStop() 来获取/收听数据。在这些调用中,所有 UI 都已创建,片段已附加到 Activity,如果有对话框/弹出窗口(暂停/恢复),则不会调用这些回调

    【讨论】:

    • 只是一个备忘录:onActivityCreated(Bundle) 已被弃用。可以使用 activity.lifecycle.addObserver(...) 代替
    【解决方案2】:

    来自文档:

    public void onActivityCreated (Bundle savedInstanceState)
    

    [...] 告诉片段何时与新活动实例完全关联。

    来源:http://developer.android.com/reference/android/app/Fragment.html#onActivityCreated(android.os.Bundle)

    【讨论】:

      【解决方案3】:

      要获取您的活动的引用,请创建一个片段活动的本地对象并获取您的活动引用,如下所示。

          private FragmentActivity fragmentActivity;
      
          @Override
          public void onAttach(Activity activity) {
              super.onAttach(activity);
              fragmentActivity=activity;
          }
      

      【讨论】:

        猜你喜欢
        • 2021-09-02
        • 2015-04-24
        • 2018-01-05
        • 1970-01-01
        • 2021-09-16
        • 2014-04-13
        • 2012-12-01
        • 1970-01-01
        相关资源
        最近更新 更多