FragmenManager
interface
BackStackEntry
- 实现类:
BackStackRecord
public interface BackStackEntry{
public int getId();
public String getName();
@StringRes
public int getBreadCrumbTitleRes();
@StringRes
public int getBreadCrumbShortTitleRes();
public CharSequence getBreadCrumbTitle();
public CharSequence getBreadCrumbShortTitle();
}
OnBackStackChangedListener
//监听堆栈变化的接口
public interface OnBackStackChangedListener{
//当Fragment堆栈变化时被调用
public void onBackStackChanged();
}
filed
POP_BACK_STACK_INCLUSIVE
//针对popBackStack(String,int)和popBackStack(int,int)设置的标识符。
//如果在调用这两个方法时设置了这个标记,
//并且提供了回退堆栈(back stack)中的实体名称或Id,
//那么堆栈中所有匹配的项目实体都会被消耗掉,直到没有匹配的或到达栈底。
public static final int POP_BACK_STACK_INCLUSIVE = 1<<0;
Abstract method
beginTransaction
/**
*Start a series of edit operations on the Fragments associated with
* this FragmentManager.
*/
public abstract FragmentTransaction beginTransaction();
在当前FragmentManager
内开始一系列对其内部fragment的操作
注意
:
一次实务操作(fragment transaction
)只能在Activity保存它的状态之前被created
或commited
.如果试图在FragmentActivit
的onSaveInstanceState
方法调用之后调用,你将会受到一个错误异常。这是因为framework
负责保存你当前的fragment
状态,如果你在状态保存之后进行改变,这样改变的结果状也会态丢失。
executePendingTransactions
/**
* After a {@link FragmentTransaction} is committed with
* {@link FragmentTransaction#commit FragmentTransaction.commit()}, it
* is scheduled to be executed asynchronously on the process's main thread.
* If you want to immediately executing any such pending operations, you
* can call this function (only from the main thread) to do so. Note that
* all callbacks and other related behavior will be done from within this
* call, so be careful about where this is called from.
*
* @return Returns true if there were any pending transactions to be
* executed.
*/
public abstract boolean executePendingTransactions();
在FragmentTransaction
已经被commited
(调用fragmentManager.commit()
),该事务将被安排在进程的主线程(main thread
)异步
执行。如果你想立即执行这样的等待操作,你可以调用此方法(在主线程内)。
注意:
所有的回调(callback
)和相关的联系的反应行为(behavior
)均在这个回调函数中,所以使用时要注意在哪里调用。
findFragmentById和findFragmentByTag
//根据从xml文件中inflated的Id或者在添加到事务中的容器Id来查找fragment。
public abstract Fragment findFragmentById(@IdRes int id);
//根据xml中的tag或者添加到transaction中的tag来查找fragment
public abstract Fragment findFragmentByTag(String tag);
这两个方法均首先
从当前fragmentManager关联的activity
中查找。没有的话,从当前back stack
中的所有fragments
中查找。
popBackStack相关
/**把顶部的状态弹出回退堆栈。这个方法是异步执行的。
*它会按照请求的顺序来执行弹出操作,
*但是这个操作直到应用程序把控制权返回给事件循环之后,才能够执行这个操作
*/
public abstract void popBackStack();
/**
* 与popBackStack()方法类似,
* 但是在这个调用的内部,会立即执行弹出操作。
* 就像调用executePendingTransactions()方法之后的效果一样。
*/
public abstract boolean popBackStackImmediate();
/**
* 从管理器的Fragment回退堆栈中把最后放入的由name参数所指定的Fragment对象弹出。
* 这个函数是异步的,它会按照请求的顺序来执行弹出操作,
* 但是直到应用程序把控制权返回给事件循环之后,才会执行这个操作。
*
* @param name 如果这个参数是非空的,那么就要在回退堆栈中查找
* 这个名称所指向的Fragment对象。
* 如果找到,那么这个状态之上的所有状态都会被弹出。
* POP_BACK_STACK_INCLUSIVE标记能够用于控制命名状态
* 本身是否要被弹出。如果这个参数是null,
* 则只有顶部状态会被弹出。
* @param flags 0或POP_BACK_STACK_INCLUSIVE
*/
public abstract void popBackStack(String name, int flags);
/**
* 与popBackStack(int, int)方法类似,
* 但是在这个调用的内部,会立即执行弹出操作。
* 就像调用executePendingTransactions()方法之后的效果一样。
*/
public abstract boolean popBackStackImmediate(String name, int flags);
/**
* 把给定ID标识所指定的状态之上的所有状态都弹出回退堆栈。
* 这个方法是异步,它会按照请求的顺序来执行弹出操作。
* 但是直到应用程序把控制权返回个事件循环之后才会执行这个操作。
* @param id 这个参数设定了要弹出的状态的标识。
* 如果被标识的状态不存在,则什么也不做。
* POP_BACK_STACK_INCLUSIVE标记能够用
* 于控制id所标识的状态本身是否会被弹出堆栈。
* @param flags 0或POP_BACK_STACK_INCLUSIVE
*/
public abstract void popBackStack(int id, int flags);
/**
* 与popBackStack(int, int)方法类似,但是在这个调用的内部,会立即执行弹出操作。
* 就像调用executePendingTransactions()方法之后的效果一样。
* @return 如果弹出了某些状态的fragment,则返回true,否则返回false。
*/
public abstract boolean popBackStackImmediate(int id, int flags);
getBackStackEntryCount
//返回回退堆栈中当前实体对象的数量。
public abstract int getBackStackEntryCount();
//这个方法返回回退堆栈中由index索引所标识的BackStackEntry对象,
//索引0指向堆栈底部的实体对象。
public abstract BackStackEntry getBackStackEntryAt(int index);
BackStackChangedListener
//给Fragment的back stack添加监听
public abstract void addOnBackStackChangedListener(OnBackStackChangedListener listener);
//移除当前Fragment的back stack监听
public abstract void removeOnBackStackChangedListener(OnBackStackChangedListener listener);
getFragment、putFragment
/**
* 把一个指定的Fragment对象放入一个Bundle对象中。
* 这个Bundle对象能够作为持久的状态来保存,
* 并且在后续的调用getFragment(Bundle, String)方法来恢复的时候,
* 它会返回一个与当前实例相同的Fragment对象。
* @param bundle 这个参数指定了一个Bundle对象,方法执行时,会把指定的Fragment对象引用放到这个Bundle对象中。
* @param key 这参数指定在Bundle对象中这个实体的名称。
* @param fragment 这个参数指定要保存的Fragment对象的引用。
*/
public abstract void putFragment(Bundle bundle, String key, Fragment fragment);
//返回最近一次用putFragment(Bundle, String, Fragment)方法放置的Fragment对象实例。
public abstract Fragment getFragment(Bundle bundle, String key);
//返回被添加到FragmentManager中的所有Fragment列表
public abstract List<Fragment> getFragments();
saveFragmentInstanceState
/**
* 保存给定的Fragment对象的当前状态。
* 在创建一个新的Fragment对象实例,并且把它添加到Fragment管理器中之后,
* 能够使用这个方法来创建一个跟Fragment对象的当前状态匹配的状态对象。
* 使用这个方法时要注意以下限制:
* 1、Fragment对象必须跟当前的FragmentManager对象绑定;
* 2、使用这个被保存的状态来创建一个新的Fragment对象,
* 必须与创建这个状态的Fragment对象有相同的类类型。
* 3、 被保存的状态不能包含对其他的Fragment对象依赖,
* 也就是说,不能使用putFragment(Bundle, String, Fragment)方法来保存一个Fragment对象的引用,
* 因为这个引用这个引用在后续使用时可能是无效的。
* 同样Fragment对象的目标和结果代码也不能包含在这个要保存的状态中。
*
* @param fragment 要保存状态的Fragment对象。
* @@return 生成的状态对象,如果没有感兴趣的由Fragment所创建的状态,那么这个方法会返回null。
*/
public abstract Fragment.SavedState saveFragmentInstanceState(Fragment f);
`
isDestroyed
//如果当前FragmentManager依赖的Activity是否destroy。
//是的话返回true。so this instance is now dead.
public abstract boolean isDestroyed();
```
####dump
```java
/**
* 把FragmentManager的状态打印输出到给定的流中。
* @param prefix--->在每行文本的前面要打印输出的文本。
* @param fd--->要输出的转存文件的描述。
* @param writer--->给转存操作设置的一个PrintWriter对象。
* @param args--->给转存请求提供一组额外的参数。
*/
public abstract void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args);
```
####enableDebugLogging
```java
//控制是否打开框架内Fragment管理器的调试日志(log)。
//如果开启调试日志,那么就会在Logcat中看到框架执行Fragment操作的日志信息。
public static void enableDebugLogging(boolean enabled)