您的位置:首页 > 其它

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

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

问题是这样的:

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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息