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

来源:互联网 发布:中国人民大学网络登录 编辑:程序博客网 时间:2024/05/17 07:25

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

如今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中的代码了!如有不足和错误,希望各位大神多多指教留言!

1 0
原创粉丝点击