美文网首页
2021-11-18 使用FragmentTransaction

2021-11-18 使用FragmentTransaction

作者: 颈椎以上瘫痪 | 来源:发表于2021-11-18 16:41 被阅读0次

    平时界面框架中使用fragment都是使用viewpager+tab的方式做切换,有时候使用fragment的场景这种方式不适用,比如切换分类显示等。

    现在的场景是在界面右上角有个按钮,默认使用点位Fragment显示,点击按钮切换点位Fragment和列表Fragment显示。

    定义切换fragment的函数,传递切换的参数(就是你要显示哪个fragment),函数的功能就是根据参数切换fragment显示。

    1. 拿到FragmentTransaction 对象
    2. 创建所有的fragment
    3. 根据传递的参数判断显示哪个fragment
    4. 提交事务
    5. 后面的部分就是业务了,在这里记录了当前显示的模式和切换模式按钮的显示图标

    在这里记录一下,使用add、hide、show控制fragment时界面会出现fragment重复显示,像是有多个实例,看了一下也每发现咋回事,估计是哪里每处理好。所以在这里使用了replace切换,但是replace切换时会重新创建,所以根据业务场景选择使用吧。

    private void initFragment(int mode) {
        //创建fragment事务对象
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    
        //创建几个需要切换的fragment
        EquipmentsModeListFragment fragmentList = null;
        if (fragmentList == null) {
            fragmentList = new EquipmentsModeListFragment();
        }
    
        EquipmentsModePointFragment fragmentPoint = null;
        if (fragmentPoint == null) {
            fragmentPoint = new EquipmentsModePointFragment();
        }
    
        //显示需要切换的fragment
        //这里提一下,在使用add()和hide()做切换时出现了fragment实例重复创建并显示的问题,不知道咋回事,所以使用replace切换显示
        //但是使用replace时,是移除FragmentTransaction里面所有的fragment并且重新创建一个实例
        switch (mode) {
            case MODE_LIST:
                transaction.replace(R.id.c_mode,fragmentList);
                break;
            case MODE_POINT:
                transaction.replace(R.id.c_mode,fragmentPoint);
                break;
        }
    
        //提交事务
        transaction.commit();
    
        //记录当前的显示模式
        currentMode = mode;
    
        //切换显示图标
        if (currentMode==MODE_LIST){
            mBtnMode.setBackgroundResource(R.drawable.btn_list_selector_this);
        } else if (currentMode==MODE_POINT){
            mBtnMode.setBackgroundResource(R.drawable.btn_point_selector_this);
        }
    }
    

    在切换按钮的点击事件中判断当前显示的模式而确定该显示哪一个。

    case R.id.btn_mode:
        if (currentMode != MODE_POINT) {
            initFragment(MODE_POINT);
        } else if (currentMode != MODE_LIST) {
            initFragment(MODE_LIST);
        }
        break;
    

    相关文章

      网友评论

          本文标题:2021-11-18 使用FragmentTransaction

          本文链接:https://www.haomeiwen.com/subject/dzzdtrtx.html