首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

LiveData:通过DialogFragment的对话框在方向更改后重新创建两次

LiveData是Android Jetpack组件库中的一个类,用于在应用程序组件之间进行数据通信。它是一种可观察的数据持有者,可以感知生命周期,并在数据发生变化时通知观察者。

LiveData的主要特点包括:

  1. 生命周期感知:LiveData可以感知Activity、Fragment等组件的生命周期,并在合适的时机自动更新数据。这样可以避免内存泄漏和空指针异常。
  2. 数据更新通知:当LiveData持有的数据发生变化时,它会通知所有观察者,使它们可以及时更新UI或执行其他操作。
  3. 数据一致性:LiveData保证观察者始终接收到最新的数据。如果观察者在活跃状态之前注册,它将立即接收到最新的数据;如果观察者在非活跃状态之前注册,它将在活跃状态恢复时接收到最新的数据。
  4. 配合ViewModel使用:LiveData通常与ViewModel一起使用,以实现数据在配置更改(如屏幕旋转)后的正确恢复。

在给出答案之前,需要先理解问题的背景。根据问题描述,通过DialogFragment的对话框在方向更改后重新创建两次。这意味着在屏幕旋转时,DialogFragment会被销毁并重新创建两次。为了在方向更改后保持数据的一致性,可以使用LiveData来解决这个问题。

具体实现步骤如下:

  1. 在DialogFragment中创建一个LiveData对象,用于持有对话框的数据。
  2. 在DialogFragment的onCreateView方法中,将LiveData对象与UI元素进行绑定,以便在数据更新时更新UI。
  3. 在DialogFragment的onDestroyView方法中,解除LiveData与UI元素的绑定,以避免内存泄漏。
  4. 在DialogFragment的onSaveInstanceState方法中,将LiveData对象的当前值保存到Bundle中。
  5. 在DialogFragment的onActivityCreated方法中,从Bundle中恢复LiveData对象的值,并更新UI。

这样,在方向更改后重新创建DialogFragment时,LiveData会自动更新UI,并保持数据的一致性。

对于腾讯云相关产品的推荐,可以根据具体需求选择适合的产品。腾讯云提供了丰富的云计算服务,包括云服务器、云数据库、云存储等。可以通过访问腾讯云官方网站(https://cloud.tencent.com/)了解更多产品信息和文档。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

原来在Android中请求权限也可以有这么棒用户体验

但是放开对话实现方式之后,开发者需要对自己实现对话框负责,你需要考虑用户点击确定按钮重新请求权限,需要考虑用户点击取消按钮回调请求结果,需要考虑对话框取消时候如何防止权限请求事件丢失,需要考虑横竖屏旋转时怎样防止...这种对话框在我们测试程序中用用还可以,在线上项目中使用肯定是不行,因为用户体验不够友好。...可以看到,现在对话框在用户体验方面无疑是完胜了之前对话框,用户看到这样界面也会更加赏心悦目。 那么PermissionX是如何做到呢?...另外我们还可以通过串接一个explainReasonBeforeRequest()方法,让权限提醒对话框在开始请求权限之前显示,这样就能实现先解释申请原因,再执行请求权限功能。...现在重新运行程序之后,浅色主题和深色主题下对话框效果分别如下图所示: ? ?

2.5K30
  • Android 屏幕旋转 处理 AsyncTask 和 ProgressDialog 最佳方案

    c)谷歌官方不建议使用ProgressDialog,这里我们会使用官方推荐DialogFragment创建加载框,如果你不了解:请看 Android 官方推荐 : DialogFragment...创建对话框。...在这样情况下,当你Activity因为配置发生改变而重启,你可以通过保持一个Fragment来缓解重新启动带来负担。这个Fragment可以包含你想要保持有状态对象引用。...) c) 把Fragment实例添加到Activity中 d) 当Activity重新启动,使用FragmentManager对Fragment进行恢复 代码: 首先是Fragment: package...真心很蛋疼,并且即使对话框关闭了,任务关闭了;用户旋转还是会造成重新创建任务,从头开始加载数据。

    2.1K20

    Android 撸起袖子,自己封装 DialogFragment

    DialogFragment 产生之前,我们创建对话框一般采用 Dialog,而且从代码编写角度来看,Dialog 使用起来其实更加简单,但是 Google 却是推荐尽量使用 DialogFragment...基本一样生命周期,使用 DialogFragment 来管理对话框,当旋转屏幕和按下后退键时候可以更好管理其生命周期 在手机配置变化导致 Activity 需要重新创建时,例如旋转屏幕,基于 DialogFragment...对话框将会由 FragmentManager 自动重建,然而基于 Dialog 实现对话框却没有这样能力 2、DialogFragment 使用 使用 DialogFragment 至少需要实现...Android 官方推荐 : DialogFragment 创建对话框 二、创建通用 CommonDialogFragment 这个类是 DialogFragment 子类,对 DialogFragment...= null){ mCancelListener.onCancel(); } 这便是我们在构造函数中传入 OnCancelListener 原因,当我们想要做一些取消对话处理时,只要在构造函数中传入

    1.3K41

    DialogFragment 使用

    如何使用DialogFragment 有两种方法 实现onCreateDialog方法 通过继承DialogFragment并且实现它onCreateDialog(Bundle savedInstanceState...)方法来创建一个DialogFragment,这个方法返回是一个Dialog,意味着我们需要创建一个AlertDialog,并返回。...DialogFragment并且实现它onCreateView(LayoutInflater, ViewGroup, Bundle) 这个方法来加载一个我们指定xml布局从而提供对话框内容。...= null) { window.setLayout(lp.width, lp.height); } } } DialogFragment消失操作 DialogFragment在正常Dismiss并不会直接从当前栈中移除...DialogFragment并没有对Dialog消失提供监听给调用者使用,但是我们通过源码分析得知,DialogFragment在onActivityCreate当中其实已经帮我们设置了onDismissListener

    1.6K10

    Android中DialogFragment自定义背景与宽高方法

    介绍 DialogFragment在android 3.0时被引入。是一种特殊Fragment,用于在Activity内容之上展示一个模态对话框。典型用于:展示警告框,输入框,确认框等等。...在DialogFragment产生之前,我们创建对话框:一般采用AlertDialog和Dialog。注:官方不推荐直接使用Dialog创建对话框。...本文主要给大家介绍了关于Android中DialogFragment自定义背景与宽高相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细介绍吧。...savedInstanceState) { getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE); // ...... } 然后在onStart方法里重新指定宽高...先设置透明背景,然后通过DisplayMetrics设置宽高。

    1.4K41

    实践 | 为 Trackr app 适配大屏幕设备

    △ 在大屏幕上导航轨道 虽然是考虑到较大屏幕设备而进行此项更改,但由于腾出了更多纵向空间来显示任务列表,横向模式显示手机也能够因此受益。...调整 : 任务 (Tasks) 和归档 (Archive) 界面都通过 SlidingPaneLayout 显示 列表/详细信息布局。...调整 : 在大尺寸屏幕上,我们使用了 DialogFragment,于是编辑任务界面就悬浮在了其他内容之上。...使用 DialogFragment 之后,所有的这些元素都位于对话框之后,使得用户不能与它们交互,这恰恰是我们想要效果。...我们还向您说明了为了更好满足用户需求,您应该怎样围绕可用性而不仅是屏幕空间来重新思考您设计。 我们希望您喜欢更新和改进 Trackr 应用!您可以 查看源代码。

    1.7K20

    Android Jetpack - LiveData

    生命周期状态更改时,LiveData 会通知 Observer 对象。你可以合并代码以更新这些 Observer 对象中 UI。...每次应用程序数据更改时,你观察者都可以在每次更改时更新 UI,而不是更新 UI 没有内存泄露 观察者绑定到 Lifecycle 对象,并在其相关生命周期被破坏自行清理 不会因为活动停止而崩溃 如果观察者生命周期处于非活动状态...例如,后台活动在返回前台后立即接收最新数据 配置更改友好 如果由于配置更改(例如设备轮换)而重新创建活动或片段,则会立即接收最新可用数据 资源共享 你可以使用单例模式扩展 LiveData 对象以包装系统服务...: 1、创建持有任意类型 LiveData 实例,这一步通常在 ViewModel 中完成 2、创建一个 Observer 对象并重写其 onChanged() 方法,该方法会在 LiveData 数据更改时被回调并返回最新数据...你可以通过 removeObserver(Observer) 方法删除观察者 1、创建一个 LiveData LiveData 是一个包装器,可以包装任何数据,包括实现集合对象,例如 List。

    2K30

    Android-ViewModel和LiveData使用详解

    例如:Activity在配置发生改变时(屏幕旋转),Activity就会重新创建,onCreate()方法也会重新调用。...LiveData优点: 确保UI界面的数据状态 LiveData遵循观察者模式。LiveData在生命周期状态更改时通知Observer对象,更新这些Observer对象中UI。...配置改变 当前Activity配置改变(如屏幕方向),导致重新从onCreate走一遍,这时观察者们会立刻收到配置变化前最新数据。...* 定义ViewModel和创建LiveData * ViewModel是以关联生命周期方式来存储和管理UI相关数据类,即使configuration发生改变(比如旋转屏幕),数据仍然可以存在不会销毁...ViewModel { //创建LiveData(可以创建多个不同类型 LiveData..)

    3.5K30

    “终于懂了“系列:Jetpack AAC完整解析(三)ViewModel 完全掌握!

    例如,界面含用户信息列表,因配置更改重新创建 Activity ,新 Activity 必须重新请求用户列表,这会造成资源浪费。能否直接恢复之前数据呢?...那么如何做到 因配置更改而新建Activity数据恢复呢?...来看下官网一张图: ? 看到在因屏幕旋转而重新创建Activity,ViewModel对象依然会保留。只有Activity真正Finish时ViewModel才会被清除。...然后通过ViewModelProviderget方法 获取ViewModel实例,然后就是 观察ViewModel中LiveData。 运行,点击按钮 会弹出进度条,2s展示用户信息。...只是要结合LiveData,UI层观察即可。 ViewModel创建必须通过ViewModelProvider。 注意到ViewModel中没有持有任何UI相关引用。

    1.8K10

    LiveData优势

    不会因 Activity 停止而导致崩溃 如果观察者生命周期处于非活跃状态(如返回栈中 Activity),则它不会接收任何 LiveData 事件(也是通过LifecycleOwner实现)...版本号还是之前版本号,而观察者此时重走OnCreate为0,所以可以收到上一次数据变化通知 适当配置更改 如果由于配置更改(如设备旋转)而重新创建了 Activity 或 Fragment...(ViewModel通过在OnDestory时候保存到Configure属性中,当attach时候取出这个属性里面的Viewodel赋值给组件,当Activity/Fragment重新get获取时候拿到就是上次...LiveData 对象连接到系统服务一次,然后需要相应资源任何观察者只需观察 LiveData 对象。...这个具体场景就是搭配Room数据库返回LiveData结合,之前需要手动去做逻辑变更,但现在唯一数据源是数据库只需要更改数据库即可,不需要再Activity中处理逻辑改变数据源,符合上一篇文章说到单项数据流原则

    1.3K20

    三句代码创建全屏Dialog或者DialogFragment:带你从源码角度实现全屏Dialog

    针对DialogFragment实现方式 Android比较推荐采用DialogFragment实现对话框,它完全能够实现Dialog所有需求,并且还能复用Fragment生命周期管理,被后台杀死后还能自动恢复...,以应对不同场景,选择规则就是用户设置主题样式(Window属性),比如需不需要Title,而布局样式在选定就不能再改变了(大小可以),有些属性是选择布局文件参考,如果是在setContentView...之后再设定,就是失去了意义,另外Android也不允许在选定布局,设置一些影响布局选择属性,会抛出异常,原理如下。...创建沉浸式全屏Dialog 在全屏Dialog基础上,我们可以创建沉浸式Dialog,也就是让Dialog内容区域延展到状态栏下方,由于这里用到了fitsystemwindow,所以要牵扯DecorView...21526023112_.pic.jpg 作者:看书小蜗牛 原文链接: 三句代码创建全屏Dialog或者DialogFragment:带你从源码角度实现 仅供参考,欢迎指正

    3.8K40

    Android 基础:Fragment,看这篇就够了 (上)

    如果在创建Fragment时要传入参数,必须要通过setArguments(Bundle bundle)方式添加,而不建议通过为Fragment添加带参数构造函数,因为通过setArguments()...创建完Fragment,接下来就是把Fragment添加到Activity中。...Fragment有一个常见问题,即Fragment重叠问题,这是由于Fragment被系统杀掉,并重新初始化时再次将fragment加入activity,因此通过在外围加if语句能判断此时是否是被系统杀掉并重新初始化情况...DialogFragment DialogFragment是Android 3.0提出,代替了Dialog,用于实现对话框。他优点是:即使旋转屏幕,也能保留对话框状态。...如果要自定义对话框样式,只需要继承DialogFragment,并重写onCreateView(),该方法返回对话框UI。这里我们举个例子,实现进度条样式圆角对话框。

    6K40

    Android 项目架构,你真的了解吗?

    1.生命周期 在移动操作系统上开发软件其实是十分复杂一件事情,因为我们随时需要面对系统和用户各种不可预料操作,很多时候,事情并不向着我们预设方向方向进展。...()// 勇于改变当前数据,这样观察者可以受到改变数据。...中通过setValue()修改了数据时, //这里将会受到修改数据             }         });     } } 好了,LiveData基本用法讲完了,由于有了LiveData...现在回头看LiveData,我们发现它至少有以下几个优点: 可以避免内存泄露:由于 Observer 和 Lifecycle 绑定,当 Lifecycle 被销毁,Observer 自动被清理。...3.2 ViewModel ViewModel则相对简单些,因为他作用是暂存UI相关数据,保证即使Activity配置更改重新创建时,数据依然能够被保存好。

    1.4K10

    Jetpack组件之LiveData

    首语 ViewModel 以注重生命周期方式存储和管理界面相关数据,当数据发生变化时,可通过接口方式通知页面,但是有很多数据要通知时,需要定义大量接口显得十分冗余,为此,Jetpack提供了LiveData...例如,曾经在后台 Activity 会在返回前台后立即接收最新数据。 适当配置更改 如果由于配置更改(如设备旋转)而重新创建了Activity或Fragment,它会立即接收最新可用数据。...通过LiveData+ViewModel 完成一个计数器例子。...,就要利用它来完成ViewModel与页面间通信。...LiveData.observe()对LiveData所包装数据进行观察,我们也可以通过LivedatapostValue()或LivedatasetValue()来完成修改数据,postValue

    82630

    由浅入深,详解 LiveData 那些事

    此时用户更改了数据,那这个数据更改就没法通知给用户;那如果观察者又转为活跃状态了,本次更改岂不是跳过了?相应,我们又怎么确保同一个数据更新不会触达用户两次呢?...但仔细观察,不难发现上述思路中,似乎隐藏着一些问题,而这些问题,似乎也是充满一些争议,比如每次 observe() 时,因为lifecycle + version 问题,会导致新观察者重新订阅数据被回推...LiveData 往往是为了界面数据状态同步而作准备,所以当添加观察者,被再次通知,也不难理解。...而LiveData会帮你持有这个数据状态,同时需要关心我必须在合适生命周期内再告诉你,以及在你重新订阅时再次告诉你(如果存在数据)。...总结 本篇,我们通过问题解答方式,由浅入深,回顾了 LiveData 设计思想,以及其相关一些疑问,从而从根源上解释了这些问题。

    1.4K20

    LiveData详细分析

    如果横竖屏切换(configuration change)时,不需要额外处理来保存数据,当屏幕方向变化时,组件会被recreate,然而系统并不能保证你数据能够被恢复。...03.使用LiveData步骤 创建一个持有某种数据类型LiveData (通常是在ViewModel中) 创建一个定义了onChange()方法观察者。...首先创建一个 MutableLiveData(LiveData是抽象类)对象 ,通过 observe 方法可以订阅修改数据通知,通过 postValue()或者 setValue() 方法发送事件更新数据...如何去更新那个文本中数据呢?代码如下所示: 想要在UI Controller中改变LiveData值呢?(比如点击某个Button设置文本内容更改)。... observe(),当数据更新LiveData 会通知它所有活跃观察者。

    2.9K00

    Android基础:Fragment,看这篇就够了

    可适配(Adaptability):根据硬件屏幕尺寸、屏幕方向,能够方便地实现不同布局,这样用户体验更好。 ?...创建完Fragment,接下来就是把Fragment添加到Activity中。...Fragment有一个常见问题,即Fragment重叠问题,这是由于Fragment被系统杀掉,并重新初始化时再次将fragment加入activity,因此通过在外围加if语句能判断此时是否是被系统杀掉并重新初始化情况...DialogFragment DialogFragment是Android 3.0提出,代替了Dialog,用于实现对话框。他优点是:即使旋转屏幕,也能保留对话框状态。...如果要自定义对话框样式,只需要继承DialogFragment,并重写onCreateView(),该方法返回对话框UI。这里我们举个例子,实现进度条样式圆角对话框。 ?

    4.8K122

    Android 录音功能直接拿去用

    我还将当前时间赋值给 mStartingTimeMills,这里主要是为了记录录音时长,等到录音结束再获取一次当前时间,然后将两个时间进行相减,就能得到录音具体时长了。...,总不能让 App 跳转到另外一个界面吧,这样用户体验并不是很好,比较好方法是显示一个对话框,让用户进行操作,既然要用对话框,必然离不开 DialogFragment,对于 DialogFragment...好,敲黑板,重点来了,其实这个对话重点部分就是在 onCreateDialog()中,我们先加载了我们自定义对话布局,当点击录音按钮时候,先进行相关权限申请,这里有个巨坑,录音权限 android.permission.RECORD_AUDIO...,当开始播放录音时候,将录音文件时长,设置进 mSeekBar 里面,播放录音同时,运行 mSeekBar,通过监听 mSeekBar 进度,刷新显示播放进度。...当 MediaPlayer 内容播放完成,调用 stopPlaying() 方法,关闭 mMediaPlayer。

    3.1K31
    领券