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@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。


你可能感兴趣的:(Android 开发笔记第二季 DialogFragment)