Android(安卓)开发笔记第二季 DialogFragment
public class MainActivity extends Activity implements View.OnClickListener { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); findViewById(R.id.btn).setOnClickListener(this); FragmentManager.enableDebugLogging(true); } @Override public void onClick(View view) { showDialog(); } private void showDialog() { new MyDialogFragment().show(getFragmentManager(), "Tag1"); }}
08-01 21:23:07.521 16125-16125/com.androidbook.fragments.dialogs V/BackStackEntry﹕ Commit: android.app.BackStackRecord@41cf3ea0
08-01 21:23:07.521 16125-16125/com.androidbook.fragments.dialogs V/BackStackEntry﹕ Run: android.app.BackStackRecord@41cf3ea0
08-01 21:23:07.521 16125-16125/com.androidbook.fragments.dialogs V/FragmentManager﹕ add: MyDialogFragment{41cf3dd8 Tag1}
08-01 21:23:07.521 16125-16125/com.androidbook.fragments.dialogs V/FragmentManager﹕ Allocated fragment index MyDialogFragment{41cf3dd8 #0 Tag1}
08-01 21:23:07.521 16125-16125/com.androidbook.fragments.dialogs V/FragmentManager﹕ moveto CREATED: MyDialogFragment{41cf3dd8 #0 Tag1}
08-01 21:23:07.526 16125-16125/com.androidbook.fragments.dialogs V/FragmentManager﹕ moveto ACTIVITY_CREATED: MyDialogFragment{41cf3dd8 #0 Tag1}
08-01 21:23:07.531 16125-16125/com.androidbook.fragments.dialogs V/FragmentManager﹕ moveto STARTED: MyDialogFragment{41cf3dd8 #0 Tag1}
08-01 21:23:07.541 16125-16125/com.androidbook.fragments.dialogs V/FragmentManager﹕ moveto RESUMED: MyDialogFragment{41cf3dd8 #0 Tag1}
这是显示 DF(DialogFragment) 时的日志。
提交事务,实质上是提交一条 BSR(BackStackRecord),然后处理这条 BSR。
FM(FragmentManger) 开始 add DF 41cf3dd8(唯一标识) Tag1。
为该 DF 申请空间,然后经历了 DF 的4中生命周期。
08-01 21:31:56.551 16125-16125/com.androidbook.fragments.dialogs V/BackStackEntry﹕ Commit: android.app.BackStackRecord@41cff170
08-01 21:31:56.566 16125-16125/com.androidbook.fragments.dialogs V/BackStackEntry﹕ Run: android.app.BackStackRecord@41cff170
08-01 21:31:56.566 16125-16125/com.androidbook.fragments.dialogs V/FragmentManager﹕ remove: MyDialogFragment{41cf3dd8 #0 Tag1} nesting=0
08-01 21:31:56.566 16125-16125/com.androidbook.fragments.dialogs V/FragmentManager﹕ movefrom RESUMED: MyDialogFragment{41cf3dd8 #0 Tag1}
08-01 21:31:56.571 16125-16125/com.androidbook.fragments.dialogs V/FragmentManager﹕ movefrom STARTED: MyDialogFragment{41cf3dd8 #0 Tag1}
08-01 21:31:56.571 16125-16125/com.androidbook.fragments.dialogs V/FragmentManager﹕ movefrom ACTIVITY_CREATED: MyDialogFragment{41cf3dd8 #0 Tag1}
08-01 21:31:56.571 16125-16125/com.androidbook.fragments.dialogs V/FragmentManager﹕ movefrom CREATED: MyDialogFragment{41cf3dd8 #0 Tag1}
08-01 21:31:56.571 16125-16125/com.androidbook.fragments.dialogs V/FragmentManager﹕ Freeing fragment index MyDialogFragment{41cf3dd8 #0 Tag1}
这是 dismiss DF 时产生的日志,dismiss 和 hide 不同,是确实会释放资源的。
同样的,提交BSR,执行BSR,
FM 开始 remove DF 41cf3dd8 #0(位置) Tag1 nesting=0(没有关联,这个不管,我不用addBackStack的),
与之前反向的顺序经历四个生命周期,最后释放资源。
这样的DF已经满足了基本的提示性质的 Dialog 了。
但对于遮罩Dialog 或那些有性能洁癖的人,应该尝试下面这种。
public class MainActivity extends Activity implements View.OnClickListener { private DialogFragment dialogFragment = new DialogFragment(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); findViewById(R.id.btn).setOnClickListener(this); FragmentManager.enableDebugLogging(true); } @Override public void onClick(View view) { dialogFragment.show(getFragmentManager(), "Tag1"); dialogFragment.dismiss(); }}
08-01 21:40:19.081 18118-18118/com.androidbook.fragments.dialogs V/BackStackEntry﹕ Commit: android.app.BackStackRecord@41ce4290
08-01 21:40:19.081 18118-18118/com.androidbook.fragments.dialogs V/BackStackEntry﹕ Run: android.app.BackStackRecord@41ce3ea0
08-01 21:40:19.086 18118-18118/com.androidbook.fragments.dialogs V/FragmentManager﹕ add: DialogFragment{41cc3a60 Tag1}
08-01 21:40:19.086 18118-18118/com.androidbook.fragments.dialogs V/FragmentManager﹕ Allocated fragment index DialogFragment{41cc3a60 #0 Tag1}
08-01 21:40:19.091 18118-18118/com.androidbook.fragments.dialogs V/FragmentManager﹕ moveto CREATED: DialogFragment{41cc3a60 #0 Tag1}
08-01 21:40:19.091 18118-18118/com.androidbook.fragments.dialogs V/FragmentManager﹕ moveto ACTIVITY_CREATED: DialogFragment{41cc3a60 #0 Tag1}
08-01 21:40:19.091 18118-18118/com.androidbook.fragments.dialogs V/FragmentManager﹕ moveto STARTED: DialogFragment{41cc3a60 #0 Tag1}
08-01 21:40:19.121 18118-18118/com.androidbook.fragments.dialogs V/FragmentManager﹕ moveto RESUMED: DialogFragment{41cc3a60 #0 Tag1}
08-01 21:40:19.121 18118-18118/com.androidbook.fragments.dialogs V/BackStackEntry﹕ Run: android.app.BackStackRecord@41ce4290
08-01 21:40:19.121 18118-18118/com.androidbook.fragments.dialogs V/FragmentManager﹕ remove: DialogFragment{41cc3a60 #0 Tag1} nesting=0
08-01 21:40:19.121 18118-18118/com.androidbook.fragments.dialogs V/FragmentManager﹕ movefrom RESUMED: DialogFragment{41cc3a60 #0 Tag1}
08-01 21:40:19.121 18118-18118/com.androidbook.fragments.dialogs V/FragmentManager﹕ movefrom STARTED: DialogFragment{41cc3a60 #0 Tag1}
08-01 21:40:19.121 18118-18118/com.androidbook.fragments.dialogs V/FragmentManager﹕ movefrom ACTIVITY_CREATED: DialogFragment{41cc3a60 #0 Tag1}
08-01 21:40:19.121 18118-18118/com.androidbook.fragments.dialogs V/FragmentManager﹕ movefrom CREATED: DialogFragment{41cc3a60 #0 Tag1}
08-01 21:40:19.121 18118-18118/com.androidbook.fragments.dialogs V/FragmentManager﹕ Freeing fragment index DialogFragment{41cc3a60 #0 Tag1}
先是提交两条 BSR,可以看到不是提交后就立即执行的,而是处理 Message 队列那样。
之后的过程和前面是一样的,也许根本就没节约多少开销。
@Override public void onClick(View view) { dialogFragment.show(getFragmentManager(), "Tag1"); dialogFragment.show(getFragmentManager(), "Tag1"); }
08-01 21:44:08.336 18611-18611/com.androidbook.fragments.dialogs V/BackStackEntry﹕ Commit: android.app.BackStackRecord@41ce97c0
08-01 21:44:08.341 18611-18611/com.androidbook.fragments.dialogs V/BackStackEntry﹕ Run: android.app.BackStackRecord@41ce94e8
08-01 21:44:08.341 18611-18611/com.androidbook.fragments.dialogs V/FragmentManager﹕ add: DialogFragment{41cbdf88 Tag1}
08-01 21:44:08.341 18611-18611/com.androidbook.fragments.dialogs V/FragmentManager﹕ Allocated fragment index DialogFragment{41cbdf88 #0 Tag1}
08-01 21:44:08.346 18611-18611/com.androidbook.fragments.dialogs V/FragmentManager﹕ moveto CREATED: DialogFragment{41cbdf88 #0 Tag1}
08-01 21:44:08.346 18611-18611/com.androidbook.fragments.dialogs V/FragmentManager﹕ moveto ACTIVITY_CREATED: DialogFragment{41cbdf88 #0 Tag1}
08-01 21:44:08.346 18611-18611/com.androidbook.fragments.dialogs V/FragmentManager﹕ moveto STARTED: DialogFragment{41cbdf88 #0 Tag1}
08-01 21:44:08.376 18611-18611/com.androidbook.fragments.dialogs V/FragmentManager﹕ moveto RESUMED: DialogFragment{41cbdf88 #0 Tag1}
08-01 21:44:08.381 18611-18611/com.androidbook.fragments.dialogs V/BackStackEntry﹕ Run: android.app.BackStackRecord@41ce97c0
08-01 21:44:08.381 18611-18611/com.androidbook.fragments.dialogs V/FragmentManager﹕ add: DialogFragment{41cbdf88 #0 Tag1}
提交两条 BSR, FM add DF 41cbdf88 Tag1 ----- add DF 41cbdf88 #0 Tag1
显示效果方面已经崩了,可以发现 41dbdf88 是一样的,也许就是地址或地址的映射。
这告诉我们,不要 add 已经 add 过的 DF。
@Override public void onClick(View view) { dialogFragment.show(getFragmentManager(), "Tag1"); dialogFragment.show(getFragmentManager(), "Tag2"); }
java.lang.IllegalStateException: Can't change tag of fragment DialogFragment{41cba5d8 Tag1}: was Tag1 now Tag2
这下抛异常了,这是我唯一见过会抛异常的可能。
就是说地址和 Tag 是唯一绑定的。
@Override public void onClick(View view) { new DialogFragment().show(getFragmentManager(),"Tag1"); new DialogFragment().show(getFragmentManager(),"Tag1"); }
08-01 21:52:50.556 20073-20073/com.androidbook.fragments.dialogs V/BackStackEntry﹕ Commit: android.app.BackStackRecord@41cdb2c0
08-01 21:52:50.556 20073-20073/com.androidbook.fragments.dialogs V/BackStackEntry﹕ Commit: android.app.BackStackRecord@41cdb778
08-01 21:52:50.556 20073-20073/com.androidbook.fragments.dialogs V/BackStackEntry﹕ Run: android.app.BackStackRecord@41cdb2c0
08-01 21:52:50.561 20073-20073/com.androidbook.fragments.dialogs V/FragmentManager﹕ add: DialogFragment{41cdb1b8 Tag1}
08-01 21:52:50.561 20073-20073/com.androidbook.fragments.dialogs V/FragmentManager﹕ Allocated fragment index DialogFragment{41cdb1b8 #0 Tag1}
08-01 21:52:50.561 20073-20073/com.androidbook.fragments.dialogs V/FragmentManager﹕ moveto CREATED: DialogFragment{41cdb1b8 #0 Tag1}
08-01 21:52:50.561 20073-20073/com.androidbook.fragments.dialogs V/FragmentManager﹕ moveto ACTIVITY_CREATED: DialogFragment{41cdb1b8 #0 Tag1}
08-01 21:52:50.561 20073-20073/com.androidbook.fragments.dialogs V/FragmentManager﹕ moveto STARTED: DialogFragment{41cdb1b8 #0 Tag1}
08-01 21:52:50.571 20073-20073/com.androidbook.fragments.dialogs V/FragmentManager﹕ moveto RESUMED: DialogFragment{41cdb1b8 #0 Tag1}
08-01 21:52:50.571 20073-20073/com.androidbook.fragments.dialogs V/BackStackEntry﹕ Run: android.app.BackStackRecord@41cdb778
08-01 21:52:50.571 20073-20073/com.androidbook.fragments.dialogs V/FragmentManager﹕ add: DialogFragment{41cdb6b0 Tag1}
08-01 21:52:50.571 20073-20073/com.androidbook.fragments.dialogs V/FragmentManager﹕ Allocated fragment index DialogFragment{41cdb6b0 #1 Tag1}
08-01 21:52:50.571 20073-20073/com.androidbook.fragments.dialogs V/FragmentManager﹕ moveto CREATED: DialogFragment{41cdb6b0 #1 Tag1}
08-01 21:52:50.571 20073-20073/com.androidbook.fragments.dialogs V/FragmentManager﹕ moveto ACTIVITY_CREATED: DialogFragment{41cdb6b0 #1 Tag1}
08-01 21:52:50.571 20073-20073/com.androidbook.fragments.dialogs V/FragmentManager﹕ moveto STARTED: DialogFragment{41cdb6b0 #1 Tag1}
08-01 21:52:50.581 20073-20073/com.androidbook.fragments.dialogs V/FragmentManager﹕ moveto RESUMED: DialogFragment{41cdb6b0 #1 Tag1}
他们的 Tag 是一样的,但地址不同。
那么如果调用 findFragmentByTag 会取到哪个呢?
事实上会拿到后添加的那个,并不会抛出异常。
所以,要注意的就是不要改变的 DF 的 Tag。
更多相关文章
- android 数组数据绑定到listview
- android 下拉刷新控件
- Android数组显示
- Android:UI更新方法二:View.postInvalidate+Thread+Runnable
- Android练习之Intent发邮件ACTION_SEND
- android ×××及问题
- RF Analyzer for Android(安卓)安卓平台连接HackRF的App
- Android(安卓)Contacts的使用(二)
- ERROR: Unsupported method: AndroidProject.getVariantNames().