稍后调用时,片段视图属性为null

时间:2015-02-01 09:20:27

标签: java android android-fragments

我有一个带有viewPager的FirstFragment(ViewPager包含几个TestFragments)。 FirstFragment还包含一个按钮。当我点击按钮时,我想更改当前TestFragment的UI。

不幸的是,当我调用getView()或尝试访问存储的属性(View rootView)时。它们都返回null。

我该如何处理?

class FirstFragment extends Fragment{
    private ViewPager mViewPager;
    private TestAdapter testAdapter;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.first_layout, container, false);
        testAdapter = new TestAdapter(getFragmentManager());
        mViewPager = (ViewPager) view.findViewById(R.id.pager);
        mViewPager.setAdapter(testAdapter);

        mViewPager.setAdapter(questionPagerAdapter);
        view.findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ((TestFragment)testAdapter.getItem(mViewPager.getCurrentItem())).doSomethingOnFragmentUI();
            }
        });
        return view;
    }
}


class TestFragment extends Fragment{
    private View rootView;
    @Override
    public View onCreateView(LayoutInflater inflater,
                             ViewGroup container, Bundle savedInstanceState) {
        rootView = inflater.inflate(R.layout.my_layout, container, false);
        return rootView;
    }
    public void doSomethingOnFragmentUI(){
        if(rootView != null){
            //rootView is always null at this point
        }
    }
}

请注意,viewPager会创建一个新片段,每次调用.getItem()。我没有缓存碎片。当我停止在HashMap中“缓存”片段时出现了这个问题(FirstFragment保留了引用)。

1 个答案:

答案 0 :(得分:1)

这样你就可以解决一个问题:

  1. 使用Fragments中的Fragments时,需要调用getChildFragmentManager()
  2. 永远不要在PagerAdapter中调用getItem(),除非您准确地知道自己在做什么。它意味着被系统调用,而不是由你调用。如果您真的想从外部调用寻呼机中的碎片,可以使用以下方法:https://stackoverflow.com/a/15261142/535762
  3. 希望涵盖所有。 : - )