android.support.v4.app.Fragment源码解析
来源:互联网 发布:淘宝客推广流量怎么样 编辑:程序博客网 时间:2024/05/22 14:04
Fragment最基础功能使用
FragmentManager fm=getFragmentManager(); FragmentTransaction transaction=fm.beginTransaction(); mFirstFragment=new FirstFragment(); transaction.add(R.id.fragment,mFirstFragment); transaction.commit();
中逐一跟进源码
(1)从Activity获取getFragmentManager()
public FragmentManager getSupportFragmentManager() { return this.mFragments; } final FragmentManagerImpl mFragments = new FragmentManagerImpl();
FragmentManagerImpl是FragmentManager抽象类的具体实现,FragmentManager定义了获取事务beginTransaction(),已进栈的Fragment getFragments()。。。
public abstract class FragmentManager { public static final int POP_BACK_STACK_INCLUSIVE = 1; public abstract FragmentTransaction beginTransaction(); @Deprecated public FragmentTransaction openTransaction() { return this.beginTransaction(); } public abstract boolean executePendingTransactions(); public abstract Fragment findFragmentById(int arg0); public abstract Fragment findFragmentByTag(String arg0); public abstract void popBackStack(); public abstract boolean popBackStackImmediate(); public abstract void popBackStack(String arg0, int arg1); public abstract boolean popBackStackImmediate(String arg0, int arg1); public abstract void popBackStack(int arg0, int arg1); public abstract boolean popBackStackImmediate(int arg0, int arg1); public abstract int getBackStackEntryCount(); public abstract FragmentManager.BackStackEntry getBackStackEntryAt(int arg0); public abstract void addOnBackStackChangedListener(FragmentManager.OnBackStackChangedListener arg0); public abstract void removeOnBackStackChangedListener(FragmentManager.OnBackStackChangedListener arg0); public abstract void putFragment(Bundle arg0, String arg1, Fragment arg2); public abstract Fragment getFragment(Bundle arg0, String arg1); public abstract List<Fragment> getFragments(); public abstract SavedState saveFragmentInstanceState(Fragment arg0); public abstract boolean isDestroyed(); public abstract void dump(String arg0, FileDescriptor arg1, PrintWriter arg2, String[] arg3); public static void enableDebugLogging(boolean enabled) { FragmentManagerImpl.DEBUG = enabled; } public interface BackStackEntry { int getId(); String getName(); int getBreadCrumbTitleRes(); int getBreadCrumbShortTitleRes(); CharSequence getBreadCrumbTitle(); CharSequence getBreadCrumbShortTitle(); } public interface OnBackStackChangedListener { void onBackStackChanged(); }}
(2)获取事务FragmentTransaction
FragmentManagerImpl中实例化FragmentTransaction
public FragmentTransaction beginTransaction() { return new BackStackRecord(this); }
(3)BackStackRecord
final class BackStackRecord extends FragmentTransaction implements BackStackEntry, Runnable
( 4 ) 添加事务add
BackStackRecord内部维护了一个存储Fragment的双向链表,往链表尾部添加新Fragment
void addOp(BackStackRecord.Op op) { if (this.mHead == null) { this.mHead = this.mTail = op; } else { op.prev = this.mTail; this.mTail.next = op; this.mTail = op; } op.enterAnim = this.mEnterAnim; op.exitAnim = this.mExitAnim; op.popEnterAnim = this.mPopEnterAnim; op.popExitAnim = this.mPopExitAnim; ++this.mNumOp; }
( 5 )提交事务commit
不管是commit还是commitAllowingStateLoss,内部都执行了commitInternal(boolean allowStateLoss) ,最后通过FragmentManagerImpl
this.mManager.enqueueAction(this, allowStateLoss);
public void enqueueAction(Runnable action, boolean allowStateLoss) { if (!allowStateLoss) { this.checkStateLoss(); } synchronized (this) { if (!this.mDestroyed && this.mActivity != null) { if (this.mPendingActions == null) { this.mPendingActions = new ArrayList(); } this.mPendingActions.add(action); if (this.mPendingActions.size() == 1) { this.mActivity.mHandler.removeCallbacks(this.mExecCommit); this.mActivity.mHandler.post(this.mExecCommit); } } else { throw new IllegalStateException("Activity has been destroyed"); } } }
mPendingActions是装载Runnable的集合,enqueueAction就是把Runnable (BackStackRecord)加入到了集合中,
然后执行了mExecCommit(Runnble)
Runnable mExecCommit = new Runnable() { public void run() { FragmentManagerImpl.this.execPendingActions(); } };
execPendingActions是将mPendingActions的Runnable拷贝到mTmpActions,最后执行mTmpActions[i].run()(即BackStackRecord.run())执行了transaction.add(通过BackStackRecord.Op op的标志识别操作)操作
public boolean execPendingActions() { if (this.mExecutingActions) { throw new IllegalStateException("Recursive entry to executePendingTransactions"); } else if (Looper.myLooper() != this.mActivity.mHandler.getLooper()) { throw new IllegalStateException("Must be called from main thread of process"); } else { boolean didSomething = false; int i; while (true) { int loadersRunning; synchronized (this) { if (this.mPendingActions == null || this.mPendingActions.size() == 0) { break; } loadersRunning = this.mPendingActions.size(); if (this.mTmpActions == null || this.mTmpActions.length < loadersRunning) { this.mTmpActions = new Runnable[loadersRunning]; } this.mPendingActions.toArray(this.mTmpActions); this.mPendingActions.clear(); this.mActivity.mHandler.removeCallbacks(this.mExecCommit); } this.mExecutingActions = true; for (i = 0; i < loadersRunning; ++i) { this.mTmpActions[i].run(); this.mTmpActions[i] = null; } this.mExecutingActions = false; didSomething = true; } if (this.mHavePendingDeferredStart) { boolean arg5 = false; for (i = 0; i < this.mActive.size(); ++i) { Fragment f = (Fragment) this.mActive.get(i); if (f != null && f.mLoaderManager != null) { arg5 |= f.mLoaderManager.hasRunningLoaders(); } } if (!arg5) { this.mHavePendingDeferredStart = false; this.startPendingDeferredFragments(); } } return didSomething; } }
根据标识执行事务
public void run() { if (FragmentManagerImpl.DEBUG) { Log.v("FragmentManager", "Run: " + this); } if (this.mAddToBackStack && this.mIndex < 0) { throw new IllegalStateException("addToBackStack() called after commit()"); } else { this.bumpBackStackNesting(1); for (BackStackRecord.Op op = this.mHead; op != null; op = op.next) { Fragment f; switch (op.cmd) { case 1: f = op.fragment; f.mNextAnim = op.enterAnim; this.mManager.addFragment(f, false); break; case 2: f = op.fragment; if (this.mManager.mAdded != null) { for (int i = 0; i < this.mManager.mAdded.size(); ++i) { Fragment old = (Fragment) this.mManager.mAdded.get(i); if (FragmentManagerImpl.DEBUG) { Log.v("FragmentManager", "OP_REPLACE: adding=" + f + " old=" + old); } if (f == null || old.mContainerId == f.mContainerId) { if (old == f) { f = null; op.fragment = null; } else { if (op.removed == null) { op.removed = new ArrayList(); } op.removed.add(old); old.mNextAnim = op.exitAnim; if (this.mAddToBackStack) { ++old.mBackStackNesting; if (FragmentManagerImpl.DEBUG) { Log.v("FragmentManager", "Bump nesting of " + old + " to " + old.mBackStackNesting); } } this.mManager.removeFragment(old, this.mTransition, this.mTransitionStyle); } } } } if (f != null) { f.mNextAnim = op.enterAnim; this.mManager.addFragment(f, false); } break; case 3: f = op.fragment; f.mNextAnim = op.exitAnim; this.mManager.removeFragment(f, this.mTransition, this.mTransitionStyle); break; case 4: f = op.fragment; f.mNextAnim = op.exitAnim; this.mManager.hideFragment(f, this.mTransition, this.mTransitionStyle); break; case 5: f = op.fragment; f.mNextAnim = op.enterAnim; this.mManager.showFragment(f, this.mTransition, this.mTransitionStyle); break; case 6: f = op.fragment; f.mNextAnim = op.exitAnim; this.mManager.detachFragment(f, this.mTransition, this.mTransitionStyle); break; case 7: f = op.fragment; f.mNextAnim = op.enterAnim; this.mManager.attachFragment(f, this.mTransition, this.mTransitionStyle); break; default: throw new IllegalArgumentException("Unknown cmd: " + op.cmd); } } this.mManager.moveToState(this.mManager.mCurState, this.mTransition, this.mTransitionStyle, true); if (this.mAddToBackStack) { this.mManager.addBackStackState(this); } } }
run方法执行完最后执行,
this.mManager.moveToState(this.mManager.mCurState, this.mTransition, this.mTransitionStyle, true); if (this.mAddToBackStack) { this.mManager.addBackStackState(this); }
moveToState是把每次执行完的状态保存到Fragment中,这个方法最终会将FragmentManager的状态赋值给fragment(过程:通过Activity生命周期的回调和Fragment的状态执行Fragment独有的生命周期方法)
addBackStackState是加入回退栈
- android.support.v4.app.Fragment源码解析
- android.support.v4.app.Fragment
- android.support.v4.app.Fragment$InstantiationException问题解决
- android.support.v4.app.Fragment$InstantiationException解决方案
- android.support.v4.app的Fragment…
- android.support.v4.app.Fragment$InstantiationException问题解决
- android.support.v4.app.Fragment$InstantiationException
- android.support.v4.app.Fragment$InstantiationException问题解决
- android.support.v4.app.Fragment和android.app.Fragment区别
- android.support.v4.app.Fragment和android.app.Fragment区别
- android.support.v4.app.Fragment和android.app.Fragment区别
- android.support.v4.app.Fragment 和 android.app.Fragment区别
- android.app.Fragment与android.support.v4.app.Fragment不一致
- android.support.v4.app.Fragment和android.app.Fragment区别
- android.support.v4.app.Fragment和android.app.Fragment区别
- android.support.v4.app.Fragment和android.app.Fragment区别
- android.support.v4.app.Fragment和android.app.Fragment区别
- android.support.v4.app.Fragment和android.app.Fragment区别
- wait和notify
- java反射机制
- 牛客网刷题知识点总结(一)垃圾回收
- python3.6.2下利用pymysql库将dataframe文件写入到mysql数据库
- HDU6114 Chess(组合数)
- android.support.v4.app.Fragment源码解析
- HDOJ 1232 畅通工程
- eval函数
- Kafka java实例代码
- Actioncontext和servletActioncontext
- Lucas定理求组合数
- mysql(十二)使用MYSQL命令直接导入导出SQL文件
- “消费返利系统”技术开发软件
- tuxedo不使用buildclient编译客户端