Android 解决多个Fragment切换时不断实例化

本人首次写博客,只为把自己的开发过程记录下来,定有许多不足,望各位海涵大笑。不说废话上干货

如今Android 中fragment的使用越来越频繁,在实现多个fragment之后,如若在切换时使用replace()方法替换Fragment ,那就要不断的去实例化,消耗资源。所以把replace()用add()+show()+hide()来替代从而当Fragment实例化之后就控制Fragment的显示隐藏。

直接上代码:




public class MainActivity extends BaseActivity implements View.OnClickListener {
    FragmentManager fm;
    //   为每个fragment设置标签
    private String[] tags = new String[]{"HomeFragment", "ContentFragment", "ListFragment", "UserFragment"};
    private TextView mTabOne, mTabTwo, mTabThree, mTabFour;
    private List<Fragment> fragments = new ArrayList<>();
    Fragment mHomeFragment, mContentFragment, mListFragment, mUserFragment;
    private Fragment mContent;//当前fragment

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

    private void init() {
        fm = getFragmentManager();
        mHomeFragment = new HomeFragment();
        mUserFragment = new UserFragment();
        mListFragment = new ListFragment();
        mContentFragment = new ContentFragment();
        fragments.add(0, mHomeFragment);
        fragments.add(1, mContentFragment);
        fragments.add(2, mListFragment);
        fragments.add(3, mUserFragment);
        mContent = mHomeFragment;
        FragmentTransaction ft = fm.beginTransaction();
        ft.add(R.id.content_frame, mContent);
        ft.commitAllowingStateLoss();
    }

    /**
     * 当activity非正常销毁时会进入此方法中 保存一些临时性的数据
     *
     * @param outState
     * @param outPersistentState
     */
    @Override
    public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
        super.onSaveInstanceState(outState, outPersistentState);
        stateCheck(outState);
    }

    private void initView() {
        mTabFour = (TextView) findViewById(R.id.home_tab_four);
        mTabThree = (TextView) findViewById(R.id.home_tab_three);
        mTabTwo = (TextView) findViewById(R.id.home_tab_two);
        mTabOne = (TextView) findViewById(R.id.home_tab_one);
        mTabFour.setOnClickListener(this);
        mTabThree.setOnClickListener(this);
        mTabTwo.setOnClickListener(this);
        mTabOne.setOnClickListener(this);
    }


    /**
     * fragment 切换
     *
     * @param from
     * @param to
     */
    public void switchFragment(Fragment from, Fragment to, int position) {

        if (mContent != to) {
            mContent = to;
            FragmentTransaction transaction = fm.beginTransaction();
            if (!to.isAdded()) { // 先判断是否被add过
                transaction.hide(from)
                        .add(R.id.content_frame, to, tags[position]).commitAllowingStateLoss(); // 隐藏当前的fragment,add下一个到Activity中
            } else {
                transaction.hide(from).show(to).commitAllowingStateLoss(); // 隐藏当前的fragment,显示下一个
            }
        }
    }

    /**
     * 状态检测 用于内存不足的时候保证fragment不会重叠
     *
     * @param savedInstanceState
     */
    private void stateCheck(Bundle savedInstanceState) {
        if (savedInstanceState == null) {
            fm = getFragmentManager();
            fm = getFragmentManager();
            FragmentTransaction fts = fm.beginTransaction();
            HomeFragment af = new HomeFragment();
            mContent = af;
            fts.add(R.id.content_frame, af);
            fts.commit();
        } else {
            /**
             * 通过设置的tag来寻找fragment
             */
            HomeFragment home = (HomeFragment) getFragmentManager()
                    .findFragmentByTag(tags[0]);
            ContentFragment content = (ContentFragment) getFragmentManager()
                    .findFragmentByTag(tags[1]);
            ListFragment list = (ListFragment) getFragmentManager()
                    .findFragmentByTag(tags[2]);
            UserFragment user = (UserFragment) getFragmentManager()
                    .findFragmentByTag(tags[3]);
            getFragmentManager().beginTransaction().show(home).hide(content).hide(list)
                    .hide(user).commitAllowingStateLoss();
        }
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.home_tab_four:
                switchFragment(mContent, fragments.get(3), 3);
                break;
            case R.id.home_tab_three:
                switchFragment(mContent, fragments.get(2), 2);
                break;
            case R.id.home_tab_two:
                switchFragment(mContent, fragments.get(1), 1);
                break;
            case R.id.home_tab_one:
                switchFragment(mContent, fragments.get(0), 0);
                break;
        }
    }
}
以上就是activity中的代码了!如有不足和错误,希望各位大神多多指教留言!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值