我的主要活动中有一个ViewPager
,当我选择一个标签时会显示一些Fragment
。每个片段都包含一些按钮,当我点击其中一个片段时,它会用当前片段替换片段。
我做的是我构建了一个像Fragment容器一样的Fragment。
database_fragment_container.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:id="@+id/database_fragment_container">
</LinearLayout>
DatabaseFragmentContainer.Java
public class DatabaseFragmentContainer extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
View view = inflater.inflate(R.layout.database_fragment_container, container, false);
getFragmentManager().beginTransaction().replace(R.id.database_fragment_container, new DatabaseFragment()).commit();
return view;
}
}
我写了onClickListener
当我点击DatabaseFragment
中的按钮时,它获取父片段并用R.id.database_fragment_container
替换另一个片段
DatabaseFragment.Java
public class DatabaseFragment extends Fragment {
public static DatabaseFragmentContainer parentFragment;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.database_fragment, container, false);
((CirculeButtonWithCaption)view.findViewById(R.id.raw_materials_button)).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
getParentFragment().getChildFragmentManager().beginTransaction().replace(R.id.database_fragment_container, new RawMaterialsFragment()).commit();
}
});
return view;
}
}
最后,它是我的FragmentPagerAdapter
:
public class MainActivityTabsPagerAdapter extends FragmentPagerAdapter {
public MainActivityTabsPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int i) {
switch (i) {
case 0:
return new DatabaseFragmentContainer();
case 1:
return new CostumerFragment();
default:
break;
}
return null;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return 2;
}
}
问题在于,当我点击某个按钮时,NullPointerException
会因getParentFragment()
返回null
而被抛出!我该怎么办?
答案 0 :(得分:2)
我肯定为时已晚,但我遇到了同样的问题,我解决了它从FragmentManager的片段列表中获取父片段的引用。
XFragment xFragment = null;
for(Fragment fragment : getFragmentManager().getFragments()){
if(fragment instanceof XFragment){
xFragment = (XFragment) fragment;
break;
}
}
XFragment是要搜索的父片段。
这不是更快的方式,但我找不到另一种方式。
答案 1 :(得分:0)
问题似乎是您使用片段管理器添加片段,但随后在新片段内调用子片段管理器,因为它未被使用,所以它将为null。试着调用get fragment manager。