Fragmentの重複追加問題を解決する考え

14751 ワード

自分が突然ブログを書きたいとは思わなかった.自分も他の人の目の中の牛になりたくないからだ.牛はたくさん知っていなければならないと思っている.経験がたくさんある.牛になりたくないのは、自分が望んでいる生活にもっと时間をかけたいからだ.今回の経験を記録したのは、この思想の過程を忘れたくないからだ.問題はこうです.
public void addFragment(Fragment fragment, boolean moveToStateNow) {
        if (mAdded == null) {
            mAdded = new ArrayList();
        }
        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を2つ追加すると異常を報告することを知っています.我々は一般的にシステムが提供するFragmentがActivityに追加されたかどうかを判断する方法でf.isAdded()を判断するのが好きであるが、ft.c m m m i t AllowingStateLoss()方式でコードを提出するとgetSupportFragmentManager()を使用するなど、判断が役に立たないことに気づく.findFragmentByTag(「TAG」+tagPage)にTAGを追加する方法も役に立たない.これはft.c m m m m i t AllowingStateLoss()方式のコミットは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);
    }
}