logcat中的报错:java.lang.IllegalStateException: Fragment null must be a public static class to be properly recreated from instance state.
今天写影音播放器项目的时候碰到了这个问题,老师视频中的代码这么写能运行,但是在我电脑上就会报错。
/**
* 把页面添加到fragment中
*/
private void setFragment() {
//得到FragmentManager
FragmentManager manager = getSupportFragmentManager();
//开启事务
FragmentTransaction transaction = manager.beginTransaction();
//替换
transaction.replace(R.id.fl_main_content,new Fragment(){
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
BasePager basePager = getBasePager();
if(basePager != null){
//各个页面的视图
return basePager.rootView;
}
return null;
}
},null);
//提交事务
transaction.commit();
}
private BasePager getBasePager() {
BasePager basePager = basePagers.get(position);
if (basePager != null){
// basePager.initData();//联网请求或者数据绑定
}
return basePager;
}
然后根据Android studio编译器给出的解决办法提示
1.disable inspection:关闭错误检测提示
2.add @SuppressLint(“ValidFragment”)
实测这两个方法都可以使new Fragment()中fragment下的红线会消失,但是扔报上述错误
百度网友的解释是:
Fragment null must be a public static class就是说不能用内部类
解决办法:
把fragment的定义放到别的文件里,不要用匿名内部类的方式
把new Fragment那段代码拿出来,单独创建一个Fragment,然后使用时直接new出来就可以了。
原new Fragmen代码修改为:
ft.replace(R.id.fl_main_content,new ReplaceFragment(getBasePager()));
然后创建ReplaceFragment类,代码发如下:
public class ReplaceFragment extends Fragment {
private BasePager currPager;
public ReplaceFragment(BasePager pager) {
this.currPager=pager;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return currPager.rootView;
}
}