什么时候 Fragment 最终被附加到 Activity?

12

我有一个包含ViewPager的主Fragment。这个ViewPager有两个页面(列表片段)。当我启动Activity时,显示主Fragment并显示第一个页面的片段。此页面片段使用AsyncTask从数据库中显示数据。

在主Fragment中,我有:

@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);
}
我遇到的第一个问题是必须将activity作为参数传递,因为当调用onShown时,activity仍然为空。此外,分页片段使用类似于LoginActivity示例中的进度条逻辑。我还遇到以下异常:IllegalStateException: Fragment PagedFragment1{4201f758} not attached to Activity at android.support.v4.app.Fragment.getResources(Fragment.java:620)。因此,一旦分页片段完全可用于UI,正确的阶段开始从数据库检索数据是什么?
3个回答

11

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

此外,“正确”的位置是有争议的,因为您可以在各种位置进行操作,不同的开发人员会给出不同的答案,但让我尝试提供一些有用的信息。

关于附加/分离回调:

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

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

此外,还有一个有用的:

public void onActivityCreated (Bundle savedInstanceState)

这个方法被称为AFTER Activity.onCreate 方法。如果您依赖于在此处发生的某些初始化操作,则非常重要。

同时,请记住,在片段事务发生的时刻,Fragment.onCreate 发生在 Activity.onCreate 之后,在旋转期间则发生在之前。

作为一个经验法则,我使用 Fragment.onStart() / Fragment.onStop() 来获取/监听数据。在这些调用中,所有的UI都已经创建好了,该片段已经附加到活动上,并且如果有对话框/弹出窗口,这些回调函数不会被调用(暂停/恢复会被调用)。


只是一个备忘录:onActivityCreated(Bundle)已被弃用。可以使用activity.lifecycle.addObserver(...)代替。 - kot331107

0

0
要获取您的Activity引用,请创建一个fragmentActivity的本地对象,并如下所示获取您的Activity引用。
    private FragmentActivity fragmentActivity;

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接