fragment相互切换

来源:3-1 Fragment动态切换案例(上)

慕无忌0017105

2018-02-09 16:04

底部的四个按钮,其中一个按钮对应的fragment有editview,修改其中内容,切换另一个fragment再切换回来的时候editview的内容清空了,要怎么解决?

写回答 关注

3回答

  • 慕粉3380826
    2018-03-09 12:13:16
    已采纳

    @Bind(R.id.mRb_server)
    RadioButton mRbServer;
    @Bind(R.id.mRb_wx)
    RadioButton mRbWx;
    @Bind(R.id.mRb_girl)
    RadioButton mRbGirl;
    @Bind(R.id.mRb_person)
    RadioButton mRbPerson;
    @Bind(R.id.rl_container)
    FrameLayout rlContainer;
    @Bind(R.id.rg_buttom)
    RadioGroup rgButtom;
    private BaseFragment mFragmentServer,mFragmentWx,mFragmentGirl,mFragmentPerson,currentFragment;

    @Override
    public int getLayoutId() {
       logUtils.logD("getLayoutId","getLayoutId");
       return R.layout.activity_main;
    }

    @Override
    public void initView() {
       logUtils.logD("initView","initView");
       setListener();
    }

    private void setListener() {
       rgButtom.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
           @Override
           public void onCheckedChanged(RadioGroup group, @IdRes int checkedId) {
               handleOnClick(checkedId);
           }
       });
    }

    private void handleOnClick(int checkedId) {
       switch (checkedId){
           case R.id.mRb_server :
               switchFragment(mFragmentServer);
               break;

           case R.id.mRb_wx :
               switchFragment(mFragmentWx);
               break;
           case R.id.mRb_girl :
               switchFragment(mFragmentGirl);
               break;
           case R.id.mRb_person :
               switchFragment(mFragmentPerson);
               break;
           default:
               break;
       }
    }
    private void switchFragment(BaseFragment fragment){
       FragmentTransaction tran = getSupportFragmentManager().beginTransaction();
       tran.show(fragment);
       tran.hide(currentFragment);
       tran.commit();
       currentFragment=fragment;

    }



    @Override
    public void initData() {
       mFragmentServer=new Fragment_Server_Manager();
       mFragmentWx=new Fragment_Wx_Selected();
       mFragmentGirl=new Fragment_Girl();
       mFragmentPerson=new Fragment_Personnal();
       FragmentTransaction tran = getSupportFragmentManager().beginTransaction();
       tran.add(R.id.rl_container,mFragmentServer);
       tran.add(R.id.rl_container,mFragmentWx).hide(mFragmentWx);
       tran.add(R.id.rl_container,mFragmentGirl).hide(mFragmentGirl);
       tran.add(R.id.rl_container,mFragmentPerson).hide(mFragmentPerson);
       currentFragment=mFragmentServer;
       tran.commit();


    }

    慕无忌001...

    谢谢这么麻烦为我解答!万分感谢

    2018-03-09 13:19:37

    共 1 条回复 >

  • 慕粉3380826
    2018-03-09 12:12:30

    使用预加载模式:

    1:每个frament的的对象提前创建好,并初始化并且初始化一个currentFragment记录当前显示的fragment对象;

    2:创建事务管理器将所有的fragment全部add()进去,隐藏你不想展示的,commit();

    3: 切换部分,因为之前每个fragment都加载进去了,就是show()和hide()的问题了,隐藏之前显示的,显示要显示的;

    4:数据更新重写 onHiddenChanged(),进行每次切换的更新;

  • 慕粉3380826
    2018-02-23 18:37:46

    请检查fragment切换的时候使用的是add()(是重新创建fragment,导致edittext清空)还是replace()(这个不是重新创建,使用之前的);

    慕无忌001...

    我是先使用hide()再使用add()(加入回退栈),这样会导致两个fragment重叠在一起。这要怎么解决

    2018-02-24 13:46:30

    共 1 条回复 >

Fragment应用上

在项目中,灵活使用Fragment做视图组装,开销比Activity更小。

11068 学习 · 17 问题

查看课程

相似问题