什么时候片段最终附加到活动?

Iva*_*ono 12 android android-fragments android-activity

我有一个主要片段,里面有一个viewpager.此viewpager有2页(列表片段).当我启动激活时,会显示主片段,并且还会显示第一个分页片段.此分页片段使用db显示数据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());
    }
}
Run Code Online (Sandbox Code Playgroud)

界面是:

public interface IPagedFragment {
    void onShown(FragmentActivity activity);
}
Run Code Online (Sandbox Code Playgroud)

我的第一个问题是我必须将活动作为参数传递,因为在onShown调用时,活动仍为空.

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

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

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

Bud*_*ius 10

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

"正确"也是值得商榷的,因为你可以在不同的地方做到这一点,不同的开发人员会给你不同的答案,但让我试着为你提供一些有用的信息.

附加/分离回调:

public void onAttach(Activity activity);
public void onDetach();
Run Code Online (Sandbox Code Playgroud)

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

同样有用的是:

public void onActivityCreated (Bundle savedInstanceState)
Run Code Online (Sandbox Code Playgroud)

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

此外,重要的是要记住,在片段事务发生的那一刻,Fragment.onCreate发生Activity.onCreate在旋转之后和旋转期间发生它.

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