针对单个附着于单个Activity的若干个fragment,有时候我们需要获取当前的fragment对象,对某个的fragment对象进行处理,此时,就需要一个管理fragment的类了
完整代码:
public class FragmentListManager {
private List<Fragment> fragmentList;
public static FragmentListManager getInstance() {
return FragmentListHolder.instance;
}
private static class FragmentListHolder {
public static final FragmentListManager instance = new FragmentListManager();
}
private FragmentListManager() {
fragmentList = new ArrayList<>();
}
public List<Fragment> getFragmentList() {
return fragmentList;
}
private void addFragment(Fragment fragment) {
fragmentList.add(fragment);
}
public void removeFragment(Fragment fragment) {
fragmentList.remove(fragment);
}
private Fragment getLastFragment() {
if(fragmentList.size() >= 2) {
return fragmentList.get(fragmentList.size() - 2);
}
return null;
}
public Fragment getCurrentFragment() {
if(fragmentList.size() >= 1) {
return fragmentList.get(fragmentList.size() - 1);
}
return null;
}
/**
* 不希望在点击Tab时被remove掉的Fragment写在这
*/
public void clearOtherFragment(FragmentManager fm) {
Set<Fragment> removeIndex = new ArraySet<>();
Log.d("FragmentListManager", "fragmentList.size():" + fragmentList.size());
for(int i = 0; i < fragmentList.size(); i++) {
fm.beginTransaction().remove(fragmentList.get(i)).commit();
removeIndex.add(fragmentList.get(i));
}
for(Fragment fragment : removeIndex) {
Log.d("FragmentListManager", "fragment:" + fragment);
fragmentList.remove(fragment);
}
}
public void go2Fragment(Fragment fragment, FragmentManager fm, Bundle argument) {
//防止重复点击
if(fragment == getCurrentFragment()) {
return;
}
//若之前就包含该Fragment,将该Fragment偶从list中remove掉,并重新add到最前边
if(fragmentList.contains(fragment)) {
removeFragment(fragment);
}
FragmentTransaction transaction = fm.beginTransaction();
if (!fragment.isStateSaved()) {
fragment.setArguments(argument);
}
if(!fragment.isAdded()) {
transaction.add(R.id.fl_main, fragment);
}
if(getCurrentFragment() != null) {
transaction.hide(getCurrentFragment());
}
transaction.show(fragment).commitAllowingStateLoss();
addFragment(fragment);
}
/**
* 返回到上一层级的Fragment
*/
public boolean back2LastFragment(FragmentManager fm) {
FragmentTransaction transaction = fm.beginTransaction();
Fragment lastFragment = getLastFragment();
if(lastFragment == null) {
return false;
}
if(!lastFragment.isAdded()) {
transaction.add(R.id.fl_main, lastFragment);
}
transaction.show(lastFragment);
//如果静态引用未去掉,在内存上仍会存在,所以得在Fragment中的onDestroy去掉.
transaction.remove(getCurrentFragment()).commit();
removeFragment(getCurrentFragment());
return true;
}
/**
* 返回到上一层级的Fragment
*/
public boolean back2LastFragmentWithoutRemove(FragmentManager fm) {
FragmentTransaction transaction = fm.beginTransaction();
Fragment lastFragment = getLastFragment();
if(lastFragment == null) {
return false;
}
if(!lastFragment.isAdded()) {
transaction.add(R.id.fl_main, lastFragment);
}
transaction.show(lastFragment);
//如果静态引用未去掉,在内存上仍会存在,所以得在Fragment中的onDestroy去掉.
transaction.hide(getCurrentFragment()).commit();
removeFragment(getCurrentFragment());
return true;
}
public void onAppExit(){
fragmentList.clear();
}
}
补充:转自Android应用开发—FragmentManager如何管理fragments
FragmentManager:
为了管理Activity中的fragments,需要使用FragmentManager。可以通过调用getFragmentManager()或者 getSupportFragmentManager()获取FragmentManager。
如果你在Fragment里获取FragmentManager,调用getFragmentManager()即可
Fragment Transactions:
使用Fragment时,可以通过用户交互来执行一些动作,比如增加、移除、替换等。所有这些改变构成一个集合,这个集合被叫做一个transaction。
如何获取FragmentTransaction类的实例:
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
每个transaction是一组同时执行的变化的集合。用add(), remove(), replace()方法,把所有需要的变化加进去,然后调用commit()方法,将这些变化应用。
在commit()方法之前,你可以调用addToBackStack(),把这个transaction加入back stack中去,这个back stack是由activity管理的,当用户按返回键时,就会回到上一个fragment的状态。比如下面的代码就是用一个新的fragment取代之前的fragment,并且将前次的状态存储在back stack中。
// Create new fragment and transaction
Fragment newFragment = new ExampleFragment();
FragmentTransaction transaction = getFragmentManager().beginTransaction();
// Replace whatever is in the fragment_container view with this fragment,
// and add the transaction to the back stack
transaction.replace(R.id.fragment_container, newFragment);
transaction.addToBackStack(null);
// Commit the transaction
transaction.commit();
在这个例子中:
newFragment将取代在R.id.fragment_container容器中的fragment,如果没有,将直接添加新的fragment。
通过调用addToBackStack(),commit()的一系列转换作为一个transaction被存储在back stack中,用户按Back键可以返回上一个转换前的状态。
当你移除一个fragment的时候,如果commit()之前没有调用addToBackStack(),那个fragment将会是destroyed;如果调用了addToBackStack(),这个fragment会是stopped,可以通过返回键来恢复。
commit()方法:
调用commit()方法并不能立即执行transaction中包含的改变动作,commit()方法把transaction加入activity的UI线程队列中。但是,如果觉得有必要的话,可以调用executePendingTransactions()方法来立即执行commit()提供的transaction。(这样做通常是没有必要的,除非这个transaction被其他线程依赖。)
注意:你只能在activity存储它的状态(当用户要离开activity时)之前调用commit(),如果在存储状态之后调用commit(),将会抛出一个异常。这是因为当activity再次被恢复时commit之后的状态将丢失。如果丢失也没关系,那么使用commitAllowingStateLoss()方法。