- 如果你仔细看代码就会发现上述的问题,fragment不在回退栈,那么当前的实例应该已经销毁了,生命周期已经结束了。我们还提交事物干嘛?
提交事务的目的不是为了维护 DialogFragment
的生命周期,而是为了确保对 FragmentManager
的操作正确执行。
即使 DialogFragment
已经被销毁,调用 FragmentTransaction
的 remove()
方法仍然是必要的。这是因为该操作会通知 FragmentManager
移除相关的 Fragment
,并更新其内部状态,以便在下一次事务提交或回退栈操作时得到正确的处理。
提交事务不仅仅用于处理当前存在的 Fragment
实例,它还用于更新 FragmentManager
的状态和维护其内部数据结构。这对于后续的事务操作、回退栈管理和其他操作是必要的。因此,即使 DialogFragment
已被销毁,提交事务仍然是需要的。
总结起来,提交事务的目的不是为了维护 DialogFragment
的生命周期,而是为了确保对 FragmentManager
的操作能够正确执行和同步。即使 DialogFragment
不在回退栈中并已被销毁,提交事务仍然是必要的,以确保 FragmentManager
的状态和内部数据结构保持一致和可靠。
我理解的一种情况:连续进行dismiss操作的情况下可能会发生。因为这个代码块并没有进行加锁操作。所以可能会有同步操作。
public void showNow(@NonNull FragmentManager manager, @Nullable String tag) {
mDismissed = false;
mShownByMe = true;
FragmentTransaction ft = manager.beginTransaction();
ft.add(this, tag);
ft.commitNow();
他还有几个相似的方法:
public void show(@NonNull FragmentManager manager, @Nullable String tag) {
mDismissed = false;
mShownByMe = true;
FragmentTransaction ft = manager.beginTransaction();
ft.add(this, tag);
ft.commit();
public int show(@NonNull FragmentTransaction transaction, @Nullable String tag) {
mDismissed = false;
mShownByMe = true;
transaction.add(this, tag);
mViewDestroyed = false;
mBackStackId = transaction.commit();
return mBackStackId;
- 实现的效果都是一样的,我们这里优先使用showNow方法,至于为什么?
1.show要比showNow稍微“慢”一点,这导致调用show了后,立刻修改dialog中的view(例如textView修改字符内容)会崩溃,而showNow不会
先在FirstDialogFragment中添加方法:
fun setContent(text: String) {
tv_content.text = text
以下代码会崩溃:
val firstDialog = FirstDialogFragment()
firstDialog.show(supportFragmentManager, "First")
firstDialog.setContent("Hello")
以下代码则正常执行(对话框内容被修改为Hello):
val firstDialog = FirstDialogFragment()
firstDialog.showNow(supportFragmentManager, "First")
firstDialog.setContent("Hello")
DialogFragment实现对话框对话框在项目正很常见,以前做项目我基本上都是用AlertDialog实现对话框。DialogFragment出现以后,我就很少再用其他方式实现对话框交互了。几乎所有项目中的弹框都通过DialogFragment实现。这篇文章从以下几个角度总结使用DialogFragment:
基本对话框实现
Alert Dialog实现Markdown和扩展Markd
在开始学习 Android 的时候,制作对话框,无疑都是直接使用 Dialog,然后对其进行自定义,而后面推出 DialogFragment 后,更多人都开始使用 DialogFragment 了,那么,DialogFragment 与 Dialog 到底有什么区别?首先,我们来分析下 DialogFragment。...
一、DialogFragment 的说明:
Android官方推荐在Android 3.0之后,使用 DialogFragment 来代替 Dialog
二、DialogFragment 的介绍:
1、DialogFragment是什么?
首先 DialogFragment 继承自 Fragment, 实现了 DialogInterface 的两个接口,其本质是 Fragment,
它持有了一个Dialog对象。
这就意味着,DialogFragment 替我们管理了 Dialog,而我们其实使用的是一个含
DialogmentFragment详细的生命周期为:
1.onAttach(Activity):
当Activity与Fragment发生关联时调用(已废弃,但是还是调用了)
2.onAttach(Context):当Activity与Fragment发生关联时调用
3.onCreate(Bundle):初始化Fragment。可通过参数savedInstanceState获取之前保存的值
4....
之前一篇文章Dialog使用介绍介绍了DialogFragemnt的一些使用常识,本文来简单介绍DialogFragment常用的生命周期函数,调用顺序如下:onAttach -->onCreate-->onCreateDialog-->onCreateView-->onViewCreated-->onSaveInstanceState在onAttach里传入要att...
图 1 Fragment生命周期流程图
除了上述声明周期之外,也可以注册FragmentLifecycleCallbacks来插入更多Fragment状态的监听,具体有:
public abstract static class FragmentLifecycleCallbacks {
* Called right before the fragment's {@link Fragme
04-18 08:55:05.501 32141-32141/com.example.jenif.dialogfragment V/com.example.jenif.dialogfragment.dialog>>>: onattach oncreate onCreateDialog04-18 08:55:05.529 32141-32141/com.example....
如果我从一个活动启动一个DialogFragment,当我关闭DialogFragment时会发生什么?活动是否通过onResume状态?或者调用是否是正常的java调用,以便在DialogFragment关闭之前永远不会执行下一行?假设启动我的片段的方法是private void launchFragment(){ConfirmationDialog confirm = new Confirma...
Fragment是Activity中的一部分,有自己的生命周期,但是受Activity的生命周期的影响。在onResume()之后,onPause()之前,可以单独操作每个Fragment,比如添加删除它们。在执行Fragment的事务时,可以将事务添加到一个栈中,这个栈被Activity管理,栈中每 一条都是fragment的一次事务,有了这个栈就可以反向的执行Fragment的事务,这样Fra
转载借鉴:https://www.imooc.com/article/21577
1、 Android官方推荐使用DialogFragment创建对话框,在android3.0时被引用。是一种特殊的Fragment,用于在Activity的内容上展示一个对话框。
2、DialogFragment有着Dialog没有的非常好的特性
(1)它本身是Fragment的子类,有着和Fragment基本一样...
点击“奇舞移动技术”关注我们!前言Fragment是在Android 3.0提出的,为了兼容低版本,support-v4库也提供了一套Fragment 的API,这也是官...
随着Fragment这个类的引 入,Google官方推荐大家使用DialogFragment来代替传统的Dialog.1,AlertDialog与DialogFragmentbefore:AlertDialog dialog = new AlertDialog.Builder(this)
.setTitle("Dialog")
.setMessage("thisis a dialog
了解Dialog的生命周期,可以有效解决借助弹窗在执行完整的生命周期过程中,重写其方法执行某些你想达到的操作。
Dialog仅在在第一次启动时候会执行onCreate()方法
之后无论该Dialog执行Dismiss(),cancel(),stop(),D
DialogFragment是继承Fragment,兼具Fragment和Dialog的特点:
一方面,它具有Fragment的生命周期,可以由Activity的FragmentManager来管理器生命周期;
另一方面,其内部包含一个Dialog成员变量,可以像窗口一样展示。
##.DialogFragment相对于Dialog的优点:
Dialog的生命周期不会随着Activity生命周期变化而变化,而DialogFragment继承自Fragme...
显示页面除了Activity,使用最多的可能就是Dialog、PopupWindow、Toast了。这三者有相似之处也有不一样的地方,本篇文章旨在厘清三者关系,阐明各自的优缺点,并探讨哪种场合使用它们。
本篇文章涉及到WindowManager相关知识,如有需要请移步:Window/WindowManager 不可不知之事
通过本篇文章,你将了解到:
1、Dialog/PopupWindow/Toast 生命周期
2、Dialog/PopupWindow/Toast 异同之处
3、Dialog/Po
Dialog与 DialogFragment 都不会出发activity的生命周期变动。
也就是说,Dialog的show与dismiss不会引发activity的onPause()和onResume的执行。