解决Fragment重复添加问题的所思所想
2017-02-16 16:03
267 查看
从来没有想过自己突然会想写博客,因为自己也不想成为别人眼中的大牛,感觉大牛要懂很多,经历很多,不想当大牛就是想多一点时间去过自己想要的生活。记录这次经历的原因是因为不想忘记这段思想的过程。
问题是这样的:
使用过Fragment的同学都知道,添加两个相同的Fragment是会报异常的。我们一般喜欢使用系统提供的判断Fragment是否已经添加到Activity的方法判断f.isAdded(),但是如果你使用 ft.commitAllowingStateLoss()方式提交代码时就会发现判断没有用,包括使用getSupportFragmentManager().findFragmentByTag(“TAG” + tagPage)添加TAG的方式也没有用。这个是因为ft.commitAllowingStateLoss()方式提交容易丢失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); } }
相关文章推荐
- FragmentTabHost切换Fragment时避免重复加载UI,导致切换后重绘页面的问题解决
- 彻底解决Fragment重复加载问题,杜绝一切卡顿现象
- FragmentTabHost切换Fragment时避免重复加载UI,导致切换后重绘页面的问题解决
- asp.net 导入CSV 文件内容 到 SQL Server 数据库 解决CSV内容数据重复添加问题
- 解决Fragment 重复加载,刷新问题
- TFS2012 用户重复无法添加到组问题解决方法
- easyui关于解决tab添加的页面通过href加载数据内容的页面刷新后form表单重复提交的问题;
- [代码问题解决录A1]c#Listview控件动态添加数据并阻止重复添加
- NSOperation之为操作缓冲池解决操作重复添加操作的问题——UItabView的Cell数据下载并刷新的案例
- Android开发中如何解决Fragment +Viewpager滑动页面重复加载的问题
- 解决addItemDecoration添加分割线重复绘制,间隔变大问题
- 解决Fragment +Viewpager滑动页面重复加载的问题
- 彻底解决Fragment重复加载问题,杜绝一切卡顿现象
- 完美解决Viewpager+Fragment 重复创建的问题
- 解决学生信息管理系统之List列表中重复添加相同数据问题。
- 【09】vue.js — 解决添加重复数据报错问题
- 解决eclipse安装插件时出现重复安装错误问题的小插件
- 解决Form表单重复提交问题
- SQLServer 2K 安装重复出现挂起问题解决办法
- 给MDI 父窗体添加背景和解决闪烁的问题。