Android FrameLayout 嵌套 Fragment 时切换Fragment,出现Fragment中ViewPager的滑动卡顿

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40116418/article/details/85771713

实现的效果图:

遇到的问题,之前往FrameLayout中添加Fragment是通过replace去添加的

getSupportFragmentManager().beginTransaction().addToBackStack(null).replace(R.id.framelayout, fragment).commit();

但是出现了Fragment一切换就重新创建的问题,后来采用了add去添加的方式,让Fragment只添加一次,首先对Fragment进行隐藏,然后再去添加Fragment,添加过后再次切换时去判断Fragment是否已经存在了,存在就去显示,不存在则创建。

上代码一看便知

public class MainActivity extends BaseActivity {

    private static final String TAG = "MainActivity";
    private BottomNavigationBar mBottomNavigationBar;
    private FrameLayout framelayout;
    private int lastSelectedPosition = 0;
    private WarningMonitoringFragment warningInquireFragment;
    private DataInquireFragment dataInquireFragment;
    private PersonalSettingFragment personalSettingFragment;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        initData();

    }


    private void initView() {
        framelayout = findViewById(R.id.framelayout);
        mBottomNavigationBar = findViewById(R.id.bottom_navigation);
        setBottomNavigationBar();

    }

    private void initData() {

    }

    /**
     * 设置BottomNavigationBar属性
     */
    private void setBottomNavigationBar() {
        // TODO 设置模式
        mBottomNavigationBar.setMode(BottomNavigationBar.MODE_FIXED);
        // TODO 设置背景色样式
        mBottomNavigationBar.setBackgroundStyle(BottomNavigationBar.BACKGROUND_STYLE_STATIC);
        mBottomNavigationBar.setBarBackgroundColor(R.color.bottombarback);

        mBottomNavigationBar
                .addItem(new BottomNavigationItem(R.mipmap.yujingjiankong_img_unselect, "预警监控").setActiveColorResource(R.color.selecttextcolor).setInactiveIconResource(R.mipmap.yujingjiankong_img_select).setInActiveColorResource(R.color.unselecttextcolor))
                .addItem(new BottomNavigationItem(R.mipmap.shujuchaxun_img_unselect, "资讯").setActiveColorResource(R.color.selecttextcolor).setInactiveIconResource(R.mipmap.shujuchaxun_img_select).setInActiveColorResource(R.color.unselecttextcolor))
                .addItem(new BottomNavigationItem(R.mipmap.gerenshezhi_img_unselect, "我的").setActiveColorResource(R.color.selecttextcolor).setInactiveIconResource(R.mipmap.gerenshezhi_img_select).setInActiveColorResource(R.color.unselecttextcolor))
                .setFirstSelectedPosition(lastSelectedPosition)
                .initialise();

        /**
         * 从这里开始
         */ 


        //实例化默认显示的WarningMonitoringFragment
        warningInquireFragment = new WarningMonitoringFragment();
        addFragment(warningInquireFragment);

        mBottomNavigationBar.setTabSelectedListener(new BottomNavigationBar.OnTabSelectedListener() {
            @Override
            public void onTabSelected(int position) {
                lastSelectedPosition = position;
                hideFragment();
                switch (position) {
                    case 0:

                        if (warningInquireFragment!=null){
                            showFragment(warningInquireFragment);
                        }
                        break;
                    case 1:
                        //Fragment没添加过就去添加,添加过了,就直接显示
                        if (dataInquireFragment == null) {
                            //实例化DataInquireFragment
                            dataInquireFragment = new DataInquireFragment();
                            addFragment(dataInquireFragment);
                        } else {

                            showFragment(dataInquireFragment);
                        }


                        break;
                    case 2:
                        if (personalSettingFragment == null) {
                            //实例化PersonalSettingFragment
                            personalSettingFragment = new PersonalSettingFragment();
                            addFragment(personalSettingFragment);
                        } else {

                            showFragment(personalSettingFragment);
                        }

                        break;
                }
            }

            @Override
            public void onTabUnselected(int position) {

            }

            @Override
            public void onTabReselected(int position) {

            }
        });
    }


    /**
     * 添加Fragment
     */
    private void addFragment(Fragment fragment) {
        getSupportFragmentManager().beginTransaction().addToBackStack(null).add(R.id.framelayout, fragment).commit();
    }

    /**
     * 显示Fragment
     */
    private void showFragment(Fragment fragment) {
        getSupportFragmentManager().beginTransaction().addToBackStack(null).show(fragment).commit();
    }

    /**
     * 隐藏Fragment
     */
    private void hideFragment() {
        //再重新获取一个开启事务
        FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
        //不等于空或者是否添加的时候
        if (warningInquireFragment != null && warningInquireFragment.isAdded()) {
            fragmentTransaction.hide(warningInquireFragment);
        }
        if (dataInquireFragment != null && dataInquireFragment.isAdded()) {
            fragmentTransaction.hide(dataInquireFragment);
        }
        if (personalSettingFragment != null && personalSettingFragment.isAdded()) {
            fragmentTransaction.hide(personalSettingFragment);
        }

        fragmentTransaction.commit();
    }


}

猜你喜欢

转载自blog.csdn.net/qq_40116418/article/details/85771713
今日推荐