FragmentPagerAdapter的第二个片段中的访问受限

时间:2018-07-09 19:44:26

标签: java android android-fragments fragment

我有两个相似的onViewCreated结构片段

//1st
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    textDebug1 = getActivity().findViewById(R.id.view_debug1); //from layout1
    textDebug2 = getActivity().findViewById(R.id.view_debug2); //from layout2
//2nd
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    textDebug1 = getActivity().findViewById(R.id.view_debug1); //<--gives  error; layout1
    textDebug2 = getActivity().findViewById(R.id.view_debug2); //from layout2
在我的onCreateView中,

我有相同的行但布局不同。

     View rootView = inflater.inflate(R.layout.activity_frag_main, container, false);

TextView位于不同的布局上,如果我选择加载第一个片段,则代码运行良好,但是如果我选择2nd运行第一个片段,则getActivity()返回null。如果两者的创建相同,可能会导致什么?

2 个答案:

答案 0 :(得分:2)

如果您查看Fragment的生命周期,您会发现这里有一个onAttach()onDetach()方法。他们指的是碎片的状态。由于您使用的是ViewPager,因此您的片段可能会被分离,而getActivity()可能会返回null

on this article所述,这是ViewPager中的片段发生的情况:

  

当页面不再可见或与可见页面相邻时,   ViewPager要求适配器销毁它。然而   FragmentPagerAdapter不会完全破坏片段。它呼吁    FragmentTransaction.detach(fragment),它会破坏片段的   整个视图层次结构,而不是对象。下次ViewPager   希望该页面可以检索相同的片段对象并查看   被重建。在此过程中,再次调用onCreateView(),这是   初始化视图的逻辑所属的地方。

on the docs所述:

  

警告:如果您在Fragment中需要一个Context对象,则可以调用getContext()。但是,只有在将片段附加到活动时,才应小心调用getContext()。 当片段尚未附加或在其生命周期结束时分离时,getContext()将返回null

您可以尝试的一件事是保留片段实例。在片段的onCreate()中,尝试调用方法setRetainInstance(true);

此外,在SO上检查this answerthis other one,这可能对您的用例有用。

答案 1 :(得分:0)

@Mauker通过onAttach()提出的另一种解决方案

getActivity() returns null on fragment?

但不是将每个adding mcontext=getContext();的{​​{1}}都添加到自己的Fragment的类扩展中

FragmentPagerAdapter