解决Fragment重复添加问题的所思所想

从来没有想过自己突然会想写博客,因为自己也不想成为别人眼中的大牛,感觉大牛要懂很多,经历很多,不想当大牛就是想多一点时间去过自己想要的生活。记录这次经历的原因是因为不想忘记这段思想的过程。
问题是这样的:

public void addFragment(Fragment fragment, boolean moveToStateNow) {
        if (mAdded == null) {
            mAdded = new ArrayList<Fragment>();
        }
        if (DEBUG) Log.v(TAG, "add: " + fragment);
        makeActive(fragment);
        if (!fragment.mDetached) {
            if (mAdded.contains(fragment)) {
                throw new IllegalStateException("Fragment already added: " + fragment);
            }
            mAdded.add(fragment);
            fragment.mAdded = true;
            fragment.mRemoving = false;
            if (fragment.mView == null) {
                fragment.mHiddenChanged = false;
            }
            if (fragment.mHasMenu && fragment.mMenuVisible) {
                mNeedMenuInvalidate = true;
            }
            if (moveToStateNow) {
                moveToState(fragment);
            }
        }
    }

使用过Fragment的同学都知道,添加两个相同的Fragment是会报异常的。我们一般喜欢使用系统提供的判断Fragment是否已经添加到Activity的方法判断f.isAdded(),但是如果你使用 ft.commitAllowingStateLoss()方式提交代码时就会发现判断没有用,包括使用getSupportFragmentManager().findFragmentByTag(“TAG” + tagPage)添加TAG的方式也没有用。这个是因为ft.commitAllowingStateLoss()方式提交容易丢失fragment状态,所以导致判断不起作用,所以需要自己定义一个变量锁,完整代码如下:

package com.example.fragmentapplication;

import android.content.Intent;
import android.os.Bundle;
import android.os.PersistableBundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.LinearLayout;

import com.example.fragmentapplication.fragment.DiscoverFragment;
import com.example.fragmentapplication.fragment.HomeFragment;
import com.example.fragmentapplication.fragment.InvestMentFragment;
import com.example.fragmentapplication.fragment.MineFragment;

public class MainActivity extends FragmentActivity implements View.OnClickListener{
    private LinearLayout activityMain;
    private FrameLayout fragmentRl;
    private Button homeBt;
    private Button investBt;
    private Button discoverBt;
    private Button mineBt;
    private Fragment showFg = null;
    private FragmentManager fragmentManager;
    private HomeFragment homeFragment;
    private InvestMentFragment investMentFragment;
    private DiscoverFragment discoverFragment;
    private FragmentTransaction ft;
    private MineFragment mineFragment;
    public static final int TAG_HOME = 0;
    public static final int TAG_MONEY = 1;
    public static final int TAG_MINE = 2;
    public static final int TAG_MORE = 3;
    private boolean isFristCreated = false;
    private int mPage = TAG_HOME;
    private void assignViews() {
        activityMain = (LinearLayout) findViewById(R.id.activity_main);
        fragmentRl = (FrameLayout) findViewById(R.id.fragment_rl);
        homeBt = (Button) findViewById(R.id.home_bt);
        investBt = (Button) findViewById(R.id.invest_bt);
        discoverBt = (Button) findViewById(R.id.discover_bt);
        mineBt = (Button) findViewById(R.id.mine_bt);
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        assignViews();
        setOnClickLinenseToView();
        fragmentManager = getSupportFragmentManager();
    }

    @Override
    protected void onResume() {
        super.onResume();
        mPage = getIntent().getIntExtra("page", TAG_HOME);
        switchFg(mPage);
    }

    @Override
    public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
        super.onSaveInstanceState(outState, outPersistentState);
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        mPage = intent.getIntExtra("page", TAG_HOME);
    }
    private  void  setOnClickLinenseToView(){
        homeBt.setOnClickListener(this);
        investBt.setOnClickListener(this);
        discoverBt.setOnClickListener(this);
        mineBt.setOnClickListener(this);
    }
    @Override
    public void onClick(View v) {
        try {
            switch (v.getId()) {
                case R.id.home_bt:
                    if (homeFragment == null) {
                        homeFragment = new HomeFragment();
                        isFristCreated = true;
                    }else{
                        isFristCreated = false;
                    }
                    showFragment(homeFragment, TAG_HOME);
                    break;
                case R.id.invest_bt:
                    if (investMentFragment == null) {
                        investMentFragment = new InvestMentFragment();
                        isFristCreated = true;
                    }else{
                        isFristCreated = false;
                    }
                    showFragment(investMentFragment, TAG_MONEY);
                    break;
                case R.id.discover_bt:
                    if (discoverFragment == null) {
                        discoverFragment = new DiscoverFragment();
                        isFristCreated = true;
                    }else{
                        isFristCreated = false;
                    }
                    showFragment(discoverFragment, TAG_MORE);
                    break;
                case R.id.mine_bt:
                    if (mineFragment == null) {
                        mineFragment = new MineFragment();
                        isFristCreated = true;
                    }else{
                        isFristCreated = false;
                    }
                    showFragment(mineFragment, TAG_MINE);
                    break;
                default:
                    break;
            }
        }catch (Exception e){
            Log.e(">>>>>>>>>>>>>","e:"+e.toString());
        }
    }
    private void showFragment(Fragment f, int tagPage) {
        FragmentTransaction ft = fragmentManager.beginTransaction();
        if (!f.isAdded() && null == getSupportFragmentManager().findFragmentByTag("TAG" + tagPage)
                && isFristCreated) {
            if (showFg != null) {
                ft.hide(showFg).add(R.id.fragment_rl, f, "TAG" + tagPage);
            } else {
                ft.add(R.id.fragment_rl, f, "TAG" + tagPage);
            }
        } else { //已经加载进容器里去了....
            if (showFg != null) {
                ft.hide(showFg).show(f);
            } else {
                ft.show(f);
            }
        }
        showFg = f;
       if (!isFinishing()) ft.commitAllowingStateLoss();

        if (tagPage != TAG_MINE) getIntent().putExtra("page", tagPage);
    }

    private void switchFg(int page) {
        switch (page) {
            case TAG_HOME:
                findViewById(R.id.home_bt).performClick();
                break;

            case TAG_MONEY:
                findViewById(R.id.invest_bt).performClick();
                break;

            case TAG_MINE:
                findViewById(R.id.discover_bt).performClick();
                break;

            case TAG_MORE:
                findViewById(R.id.mine_bt).performClick();
                break;
            default:
                break;
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        getIntent().putExtra("page", TAG_HOME);
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值