我有两个相似的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
。如果两者的创建相同,可能会导致什么?
答案 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 answer和this other one,这可能对您的用例有用。
答案 1 :(得分:0)
@Mauker通过onAttach()
提出的另一种解决方案
getActivity() returns null on fragment?
但不是将每个adding mcontext=getContext();
的{{1}}都添加到自己的Fragment
的类扩展中
FragmentPagerAdapter