Fragmentの重複追加問題を解決する考え
14751 ワード
自分が突然ブログを書きたいとは思わなかった.自分も他の人の目の中の牛になりたくないからだ.牛はたくさん知っていなければならないと思っている.経験がたくさんある.牛になりたくないのは、自分が望んでいる生活にもっと时間をかけたいからだ.今回の経験を記録したのは、この思想の過程を忘れたくないからだ.問題はこうです.
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状態を失いやすいため、判断が機能しないため、自分で変数ロックを定義する必要があります.完全なコードは以下の通りです.
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);
}
}