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@41ce3ea0
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@41ce94e8
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");    }


没有任何问题,说明 Tag 并不需要唯一,而是对于同一个 Fragment 需要用唯一的 Tag 来绑定。

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。


更多相关文章

  1. android 数组数据绑定到listview
  2. android 下拉刷新控件
  3. Android数组显示
  4. Android:UI更新方法二:View.postInvalidate+Thread+Runnable
  5. Android练习之Intent发邮件ACTION_SEND
  6. android ×××及问题
  7. RF Analyzer for Android(安卓)安卓平台连接HackRF的App
  8. Android(安卓)Contacts的使用(二)
  9. ERROR: Unsupported method: AndroidProject.getVariantNames().

随机推荐

  1. [Android]如何做一个崩溃率少于千分之三
  2. Chronometer android计时器组件Chronomet
  3. [Android]iTextG与SpongyCastle踩坑经历
  4. Android(安卓)API Guides---USB Host and
  5. 6个必看的Android网站
  6. Android之EditText特殊小技巧
  7. Android系统架构特点及优劣分析
  8. Android入门教程(五)之------第一个Andro
  9. 3-14 servlet 传出对象给 Android
  10. Android网络游戏之神农诀项目开发--视频