我叫jc 2016-12-28 03:10 采纳率: 100%
浏览 6129
已采纳

Fragment null must be a public static class

Android里做一个RadioGroup实现底部导航页面,遇到了这样的问题:
FATAL EXCEPTION: main
java.lang.IllegalStateException: Fragment null must be a public static class to be properly recreated from instance state.
at android.support.v4.app.BackStackRecord.doAddOp(BackStackRecord.java:435)
at android.support.v4.app.BackStackRecord.replace(BackStackRecord.java:481)
at android.support.v4.app.BackStackRecord.replace(BackStackRecord.java:472)
at com.example.wu.mobileplayer.Activity.Activity.MainActivity.setFragment(MainActivity.java:72)
at com.example.wu.mobileplayer.Activity.Activity.MainActivity.onCheckedChanged(MainActivity.java:65)
at android.widget.RadioGroup.setCheckedId(RadioGroup.java:174)
at android.widget.RadioGroup.access$600(RadioGroup.java:54)
at android.widget.RadioGroup$CheckedStateTracker.onCheckedChanged(RadioGroup.java:358)
at android.widget.CompoundButton.setChecked(CompoundButton.java:139)
at android.widget.CompoundButton.toggle(CompoundButton.java:91)
at android.widget.RadioButton.toggle(RadioButton.java:76)
at android.widget.CompoundButton.performClick(CompoundButton.java:103)
at android.view.View$PerformClick.run(View.java:18803)
at android.os.Handler.handleCallback(Handler.java:730)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5493)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1209)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1025)
at dalvik.system.NativeStart.main(Native Method)

代码的一部分:
public class MainActivity extends FragmentActivity implements RadioGroup.OnCheckedChangeListener{
private RadioGroup radioGroup;
private ArrayList basePagers;
private int position;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
radioGroup = (RadioGroup) findViewById(R.id.rg_selector);
radioGroup.check(R.id.rb_video);

    basePagers = new ArrayList<>();
    basePagers.add(new VideoPager(this));
    basePagers.add(new AudioPager(this));
    basePagers.add(new NetVideoPager(this));
    basePagers.add(new NetAudioPager(this));
    //设置监听
    radioGroup.setOnCheckedChangeListener(this);

    }



    @Override
    public void onCheckedChanged(RadioGroup group, int checkedId) {
        switch (checkedId) {
            case R.id.rb_video:
                position = 0;
                break;
            case R.id.rb_audio:
                position=1;
                break;
            case R.id.rb_net_video:
                position=2;
                break;
            case R.id.rb_net_audio:
                position=3;
                break;
        }
        setFragment();
    }


private void setFragment() {
   FragmentManager manager = getSupportFragmentManager();
    FragmentTransaction ft = manager.beginTransaction();
    ft.replace(R.id.fl_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;

        }
    });
    ft.commit();
}

private BasePager getBasePager() {
    BasePager basePager = basePagers.get(position);
    if(basePager!=null && !basePager.isinitData) {
        basePager.isinitData = true;
        basePager.initData();
    }
    return basePager;
}
  • 写回答

7条回答

  • czhilong9231 2017-02-16 03:17
    关注

    把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;
    }
    

    }

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(6条)

报告相同问题?

悬赏问题

  • ¥20 IDEA 下 lombok 不生效,找不到get
  • ¥15 sas无法加载传输模块
  • ¥15 ABAQUS模拟钢管混凝土往复荷载,滞回曲线卸载荷载却比加载荷载大是为什么
  • ¥15 IOS设置了charels得代理,但是显示无互联网连接,无法打开chls.pro/ssl下载证书
  • ¥40 一维度流体仿真软件前端如何开发
  • ¥500 DELPHI环境安卓定位实时发送及回调消息展示
  • ¥15 易视腾is-E5-ngh怎么刷机,求各位们分享一下吧
  • ¥15 Androidstudio的程序,求各位帮帮我
  • ¥15 岩石声发射矩张量反演软件
  • ¥15 用Python完成一个任务