FragmentHelper
package com.icitymobile.anda.util; import java.lang.ref.SoftReference;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry; import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction; import com.hualong.framework.log.Logger; /**
* Fragment帮助类
*/
public class FragmentHelper { public static final String TAG = "FragmentHelper"; private static final String STATE_IDS = "fragment_ids";
private static final String STATE_CURRENT_FRAGMENT_ID = "current_fragment_id";
private static final String STATE_LAST_FRAGMENT = "last_fragment"; private Context mContext;
private FragmentManager mManager;
private int mContainerId; private Map<String, SoftReference<Fragment>> mFragments = new HashMap<String, SoftReference<Fragment>>();
private String mCurrentFragmentId = null;
private Fragment mLastFragment; public FragmentHelper(Context context, FragmentManager manager, int containerId) {
mContext = context;
mManager = manager;
mContainerId = containerId;
} public Fragment getFragment(String fragmentId) {
Fragment fragment = null;
SoftReference<Fragment> reference = mFragments.get(fragmentId);
if (reference != null) {
fragment = reference.get();
}
return fragment;
} public String getCurrentFragmentId() {
return mCurrentFragmentId;
} public Fragment getCurrentFragment() {
return getFragment(getCurrentFragmentId());
} public void switchFragment(String id, Intent intent) {
switchFragment(id, intent, -);
} public void switchFragment(String id, Intent intent, int transition) {
if (intent == null) {
return;
}
Fragment newFragment = getFragment(id);
if (mLastFragment == null || mLastFragment != newFragment) {
FragmentTransaction ft = mManager.beginTransaction();
if (mLastFragment != null) {
ft.hide(mLastFragment);
}
if (newFragment == null) {
Logger.i(TAG, TAG + ": Instantiate a new fragment " + id);
String fname = intent.getComponent().getClassName();
Bundle args = intent.getExtras();
newFragment = Fragment.instantiate(mContext, fname);
if (args != null) {
newFragment.setArguments(args);
}
mFragments.put(id, new SoftReference<Fragment>(newFragment));
ft.add(mContainerId, newFragment, id);
} else {
Logger.i(TAG, TAG + ": Load an old fragment " + id);
ft.show(newFragment);
}
if (transition != -) {
ft.setTransition(transition);
}
mLastFragment = newFragment;
mCurrentFragmentId = id;
ft.commit();
// mManager.executePendingTransactions();
}
} /**
* 在Bundle中保存状态
*
* @param bundle
*/
public void saveInBundle(Bundle bundle) {
if (bundle == null) {
return;
}
Logger.i(TAG, TAG + ": saving in bundle");
ArrayList<String> idList = new ArrayList<String>(mFragments.keySet());
bundle.putStringArrayList(STATE_IDS, idList); Iterator<Entry<String, SoftReference<Fragment>>> iter = mFragments.entrySet().iterator();
Entry<String, SoftReference<Fragment>> entry;
SoftReference<Fragment> reference;
Fragment fragment;
while (iter.hasNext()) {
entry = iter.next();
reference = entry.getValue();
if (reference != null) {
fragment = reference.get();
if (fragment != null) {
mManager.putFragment(bundle, entry.getKey(), fragment);
}
}
} if (mCurrentFragmentId != null) {
bundle.putString(STATE_CURRENT_FRAGMENT_ID, mCurrentFragmentId);
} if (mLastFragment != null) {
mManager.putFragment(bundle, STATE_LAST_FRAGMENT, mLastFragment);
}
} /**
* 在Bundle中保存状态,只保存当前的fragment
*
* @param bundle
*/
public void saveStateSimple(Bundle bundle) {
if (bundle == null) {
return;
}
Logger.i(TAG, TAG + ": saving in bundle simple"); if (mCurrentFragmentId != null) {
bundle.putString(STATE_CURRENT_FRAGMENT_ID, mCurrentFragmentId); ArrayList<String> idList = new ArrayList<String>();
idList.add(mCurrentFragmentId);
bundle.putStringArrayList(STATE_IDS, idList); Fragment currentFragment = getCurrentFragment();
if (currentFragment != null) {
mManager.putFragment(bundle, mCurrentFragmentId, currentFragment);
}
} if (mLastFragment != null) {
mManager.putFragment(bundle, STATE_LAST_FRAGMENT, mLastFragment);
}
} /**
* 从Bundle中恢复状态
*
* @param bundle
*/
public void restoreFromBundle(Bundle bundle) {
if (bundle == null) {
return;
}
Logger.i(TAG, TAG + ": restoring from bundle");
ArrayList<String> idList = bundle.getStringArrayList(STATE_IDS);
if (idList != null) {
Fragment fragment;
for (String id : idList) {
fragment = mManager.getFragment(bundle, id);
if (fragment != null) {
mFragments.put(id, new SoftReference<Fragment>(fragment));
}
}
} String currentId = bundle.getString(STATE_CURRENT_FRAGMENT_ID);
if (currentId != null) {
mCurrentFragmentId = currentId;
} Fragment lastFragment = mManager.getFragment(bundle, STATE_LAST_FRAGMENT);
if (lastFragment != null) {
mLastFragment = lastFragment;
}
}
}
FragmentHelper的更多相关文章
- activiti获取可回退的节点
在处理流程回退时,需要获取某个节点当前可以回退到的节点,简单分析下: 1. 只支持回退到userTask. 2. 如果流程流转过某节点时生成了多个任务,从其中某一个任务回退到该节点后,不处理另外的任务 ...
随机推荐
- HashMap原理分析
HashMap 实现Map.Cloneable.Serializable接口,继承AbstractMap基类. HashMap map = new HashMap(); 实例化一个HashMap,在构 ...
- tomcat JNDI 设置
一.在Spring配置文件中的配置 <bean id="dataSource" class="org.springframework.jndi.JndiObje ...
- CSS继承总结
CSS的一个重要特征就是继承,它是依赖于祖先-后代的关系的.继承是一种机制,它允许样式不仅可以应用于某个特定的元素,还可以应用于它的后代. CSS可以继承的属性有: 1.文字相关:font-famil ...
- C++公有派生
C++中的公有派生: 1.格式:Class A:public B{...}: 例如我们先声明了一个基类:SafeIntArray,当我们要声明它的派生类IndexIntArray时,格式如下:
- JavaScript break跳出多重循环
多重循环在编程中会经常遇到,那么在JavaScript中如何指定跳出那层的循环呢.其实这也是break的一个用法,下面是一个不错的例子,来自<JavaScript权威指南>,可以参考下: ...
- 怎样删除一键GHOST 文件件名为~1的备份文件?
早些时候备份过系统,但是后来觉的该备份系统不够完美,想删除.可是备份文件被保护,无法删除.(1)在网上查看了一下: start X:\~1 attrib -s -h -r X:\~1\C_PAN.GH ...
- caffe学习系列(1):图像数据转换成db(leveldb/lmdb)文件
参考:http://www.cnblogs.com/denny402/p/5082341.html 上述博文用caffe自带的两张图片为例,将图片转为db格式.博主对命令参数进行了详细的解释,很赞. ...
- Hello,World
引用自http://www.cnblogs.com/jbelial/archive/2013/05/08/3067471.html#2676127 题目: 1 public class text { ...
- windows下的getopt/getoptlong函数
windows下的getopt/getoptlong函数 getopt/getopt_long函数是GNU C中的函数,在linux编程中很常用到.这里就不介绍了. windows下没有找到类似的函数 ...
- webpack的最简单应用,只使用js与css的打包
首先进行全局安装webpack npm install -g webpack cmd跳转到项目的文件夹,安装webpack npm install --save-dev webpack 接着需要pac ...