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. 如果流程流转过某节点时生成了多个任务,从其中某一个任务回退到该节点后,不处理另外的任务 ...
随机推荐
- js中的json
1.什么是JSON? JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation) JSON 是轻量级的文本数据交换格式 2.JSON语法是JavaScr ...
- 比较两个数据库表table结构不同之处
/*--比较两个数据库的表字段差异 hy 适用多种版本库 --*/ /*--调用示例 exec p_comparestructure 'database1','database2' --*/ ) dr ...
- Reflow(渲染)和Repaint(重绘)
Reflow(渲染):对于DOM结构中的各个元素都有自己的盒模型,浏览器根据各种样式(浏览器的.开发人员定义的等)来计算,并根据计算结果将元素放到它该出现的位置,这个过程称之为reflow. refl ...
- Unity3d用户手册用户指南 电影纹理(Movie Texture)
http://www.58player.com/blog-2327-952.html 电影纹理(Movie Texture) 注意:这只是专业/高级功能. 桌面 电影纹理是从视频文件创建的动画纹理 ...
- leetcode 215. Kth Largest Element in an Array
Find the kth largest element in an unsorted array. Note that it is the kth largest element in the so ...
- phpcms 根据条件调取内容
asdasdsd <script> 正则 截取 function getUrlParam(name) { var reg = new RegExp("(^|&)" ...
- maven项目部分知识
1.maven项目在pom.xml中用add dependencies加入jar包,搜索不到jar包的解决方案: Window --> Show View --> Other输入mave ...
- linux kernel 杂谈
首先介绍一下背景吧,工作三个星期了.复习了一波u-boot,跟了一下事件上报,搞了下平台设备,扣了一个内存检查代码. 想想生活是不是有点无聊.对啊,真的很无聊!!!! 无聊也没有办法啊,所以找点方法去 ...
- 5.8---像素设定(CC150)
注意:仔细注意位置. public static int[] renderPixel(int[] screen, int x, int y){ int[] ans = new int[screen.l ...
- Genymotion自动化启动
一.启动方式 命令行: player.exe --vm-name [模拟器名称] 例子: "D:\Program files\Genymobile\Genymotion\player ...