2015-07-20 56 views
5

我有一个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在android.support.v4.app.Fragment.getResources(Fragment.java:620)

未连接到活动 那么,一旦页面片段完全可用于UI,开始从db中检索数据的正确阶段是什么?

回答

6

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

也是“正确”是值得商榷的,你可以在不同的地方做,不同的开发商会给你不同的答案,但让我尝试为您提供一些有用的信息。

的附连/分离回调:

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

这两种方法来getActivity()任何调用将返回非空活性的片段被连接到之间。您可以忽略它们,并使用一个private boolean isAttached来跟踪该呼叫的。

同样有用的是:

public void onActivityCreated (Bundle savedInstanceState) 

调用此方法AFTERActivity.onCreate方法。如果你依赖于一些初始化所发生有非常重要的。

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

根据经验,一般情况下我使用Fragment.onStart()/Fragment.onStop()来获得/听的数据。在这些调用中,所有UI都已创建,片段被附加到活动,并且如果存在对话框/弹出窗口(暂停/恢复),则不会调用这些回调。

0

为了让您的活动的参考,创建fragmentActivity的本地对象,让你活动的参考,如下图所示。

private FragmentActivity fragmentActivity; 

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