public static MyFragment newInstance() { Bundle args = new Bundle(); MyFragment fragment = new MyFragment(); fragment.setArguments(args); return fragment; }
public void onCreate() { Bundle args = getArguments(); //... }
inflate(@LayoutRes int resource, @Nullable ViewGroup root, boolean attachToRoot)参数说明:
root不为null, attachToRoot为true时,将生成的View添加到root中
root不为null, attachToRoot为false时,生成一个带params的View
root为null, attachToroot为false时, 生成一个不带params的View
Fragment和Activity的数据交互
为了解耦合,保持Fragment的独立性
Activity可以直接调用Fragment的public方法
Fragment通过callback通知Activity
使用getChildFragmentManager时的”no activity”异常
触发流程
使用Fragment.getChildFragmentManager
Fragment重复使用,再次attatch
java.lang.IllegalStateException: No activity at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1060) at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1055) at android.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:1864) at android.app.Fragment.performActivityCreated(Fragment.java:1714) at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:919) at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1073) at android.app.BackStackRecord.run(BackStackRecord.java:698) at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1458) at android.app.FragmentManagerImpl$1.run(FragmentManager.java:443) at android.os.Handler.handleCallback(Handler.java:808) at android.os.Handler.dispatchMessage(Handler.java:103) at android.os.Looper.loop(Looper.java:193) at android.app.ActivityThread.main(ActivityThread.java:5332) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:829) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:645) at dalvik.system.NativeStart.main(Native Method)
Fragment destory时会将mChildFragmentManager.mHost重置为null
voidperformDestroy(){ if (mChildFragmentManager != null) { mChildFragmentManager.dispatchDestroy(); } //... }
privatevoiddoAddOp(int containerViewId, Fragment fragment, String tag, int opcmd){ fragment.mFragmentManager = mManager;
if (tag != null) { if (fragment.mTag != null && !tag.equals(fragment.mTag)) { thrownew IllegalStateException("Can't change tag of fragment " + fragment + ": was " + fragment.mTag + " now " + tag); } fragment.mTag = tag; }
if (containerViewId != 0) { if (fragment.mFragmentId != 0 && fragment.mFragmentId != containerViewId) { thrownew IllegalStateException("Can't change container ID of fragment " + fragment + ": was " + fragment.mFragmentId + " now " + containerViewId); } fragment.mContainerId = fragment.mFragmentId = containerViewId; }
Op op = new Op(); op.cmd = opcmd; op.fragment = fragment; addOp(op); }
源码阅读
主要成员
Activity
final Handler mHandler = new Handler();
//即FragmentManager
final FragmentController mFragments = FragmentController.createController(new HostCallbacks());