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

时间:2015-07-20 08:48:13

标签: android android-fragments android-activity

我有一个主要片段,里面有一个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检索数据的正确阶段是什么?

3 个答案:

答案 0 :(得分:8)

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

另外"正确"是有争议的,因为你可以在各种地方做到这一点,不同的开发人员会给你不同的答案,但让我试着为你提供一些有用的信息。

附加/分离回调:

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

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

同样有用的是:

public void onActivityCreated (Bundle savedInstanceState)

此方法称为 AFTER Activity.onCreate方法。如果你依赖于那里发生的一些初始化,这是非常重要的。

同样重要的是要记住,在片段交易发生的那一刻,Fragment.onCreate发生在Activity.onCreate之后,并且在轮换之前它发生在它之前。

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

答案 1 :(得分:0)

来自文档:

public void onActivityCreated (Bundle savedInstanceState)

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

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

答案 2 :(得分:0)

要获取活动的参考,请创建fragmentActivity的本地对象并获取您的活动参考,如下所示。

    private FragmentActivity fragmentActivity;

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