片段视图 属性 稍后调用时为空
Fragment view property is null when called later
我有一个带有 viewPager 的 FirstFragment(ViewPager 包含几个 TestFragment)。 FirstFragment 还包含一个按钮。我想在单击按钮时更改当前 TestFragment 的 UI。
不幸的是,当我调用 getView() 或尝试访问存储的 属性(查看 rootView)时。他们都 return 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() 时创建一个新片段。我不缓存片段。当我停止 "caching" HashMap 中的片段(FirstFragment 保留引用)时出现此问题。
这样您就可以解决问题:
- 在 Fragments 中使用 Fragments 时需要调用
getChildFragmentManager()
。
- 切勿在 PagerAdapter 中调用 getItem(),除非您确切地知道自己在做什么。它应该由系统调用,而不是由您调用。如果你真的想从外部调用你的寻呼机中的片段,你可以使用这种方法:
希望涵盖所有内容。 :-)
我有一个带有 viewPager 的 FirstFragment(ViewPager 包含几个 TestFragment)。 FirstFragment 还包含一个按钮。我想在单击按钮时更改当前 TestFragment 的 UI。
不幸的是,当我调用 getView() 或尝试访问存储的 属性(查看 rootView)时。他们都 return 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() 时创建一个新片段。我不缓存片段。当我停止 "caching" HashMap 中的片段(FirstFragment 保留引用)时出现此问题。
这样您就可以解决问题:
- 在 Fragments 中使用 Fragments 时需要调用
getChildFragmentManager()
。 - 切勿在 PagerAdapter 中调用 getItem(),除非您确切地知道自己在做什么。它应该由系统调用,而不是由您调用。如果你真的想从外部调用你的寻呼机中的片段,你可以使用这种方法:
希望涵盖所有内容。 :-)