导航 调整前 : 从任务 (Tasks) 界面,您可以从底部应用栏的菜单中找到归档 (Archive) 和设置 (Settings) 选项。...调整后: 当屏幕变宽时,我们显示导航轨道 (navigation rail) 来取代底部应用栏。我们也将悬浮操作按钮 (用于打开新建任务界面) 放到导航轨道中,从而完全移除底部应用栏。...△ 在大屏幕上的导航轨道 虽然是考虑到较大屏幕的设备而进行的此项更改,但由于腾出了更多的纵向空间来显示任务列表,横向模式显示的手机也能够因此受益。...△ 悬浮的编辑组件将关注点放在用户当前的目标内容上 起初我们尝试将编辑任务界面取代任务详细信息 (Task Detail) 显示在详细信息窗格中。...相比之下,DialogFragment 吸引了用户,让关注点处于前面和中间。 在用户保存自己的改动或是我们确认用户的修改可以取消之前,我们不希望从编辑任务 (或者新建任务) 界面导航到其他地方。
关于详解Android应用中DialogFragment的基本用法,大家可以参考下。 1、 概述 DialogFragment在android 3.0时被引入。...2、 好处与用法 使用DialogFragment来管理对话框,当旋转屏幕和按下后退键时可以更好的管理其声明周期,它和Fragment有着基本一致的声明周期。...且DialogFragment也允许开发者把Dialog作为内嵌的组件进行重用,类似Fragment(可以在大屏幕和小屏幕显示出不同的效果)。...的高度固定,那么我们需要设置DialogFragment的高度,在Fragment的onResume()声明周期方法中设置window的宽高即可。...,并且弹出动画为向上滑出,消失动画为向下滑出 WindowManager.LayoutParams params = getDialog().getWindow() .getAttributes
如果将Dialog定义成全屏的就会省去很多问题,可以完全按照常用的布局方式来处理。...不让显示Title部分,关键点2就是常用的setContentView,关键点3根4就是为了全屏对话框做的修改,关键点4必须要放在setContent的后面,因为如果放在setContent该属性会被冲掉无效...其实View真正显示的点是在Activity resume的时候,让WMS添加View,其实是这里调用WindowManagerGlobal的addView,这里有个很关键的布局参数params,其实传就是...,会将这里的边距考虑进去,而且对于windowIsFloating = false的Window,会将状态栏及底部导航栏考虑进去(这里不分析)。...21526023112_.pic.jpg 作者:看书的小蜗牛 原文链接: 三句代码创建全屏Dialog或者DialogFragment:带你从源码角度实现 仅供参考,欢迎指正
,将app:navGraph="@navigation/nav_graph解析封装成NavGraph对象,里面包含nav_graph.xml中的所有信息。...这样做的理由是,Navigation框架作为路由导航,可以不用Fragment和Dialog,但不能没有启动页和Activity路由跳转类。...首先我们知道NavGraph中是包含nav_graph所有节点的内容。...mBackStack,如果回退栈为空,那么mGraph一定是第一个添加的元素 把新的目标NavDestination也加入进回退栈 经过这里,导航具有了返回栈的能力。..., DIALOG_TAG + mDialogCount++); return destination; } dialogFragment.show()he dismiss()显示隐藏
,可以手动添加action标签,当然也可以通过拖拽来实现,如下: 这样我们就添加了一个从FirstFragment导航到SecondFragment的动作,我们再添加一个逆向的动作,最终的代码如下:...注意app:defaultNavHost="true",设置为true后表示将这个NavHostFragment设置为默认导航宿主,这样就会拦截系统的返回按钮事件。...的动作,这个是我们之前在导航视图中配置好的,会导航到SecondFragment。...setupActionBarWithNavController(navController, appBarConfiguration) 上面我们提到,如果Navigation与ToolBar连接,标题栏会自动显示在导航视图中设定好的...除了这个,我们还可以发现当在切换页面的时候,标题栏的返回按钮也会自动显示和隐藏。当导航到第二个页面SecondFragment,返回按钮显示;当回退到首页时,返回按钮隐藏。
的内容之上显示一个静态的对话框。...1、DialogFragment 的优点 其实在 Android 中显示对话框有两种类型可供使用,一种是 DialogFragment,而另一种则是 Dialog。...在 DialogFragment 产生之前,我们创建对话框一般采用 Dialog,而且从代码的编写角度来看,Dialog 使用起来其实更加简单,但是 Google 却是推荐尽量使用 DialogFragment...基本一样的生命周期,使用 DialogFragment 来管理对话框,当旋转屏幕和按下后退键的时候可以更好的管理其生命周期 在手机配置变化导致 Activity 需要重新创建时,例如旋转屏幕,基于 DialogFragment...,将一个 ProgressDialog 传进去,然后依次传入 cancelable 和 cancelListener,最后调用 show() 函数,将DialogFragment 显示出来,因为我们使用了构造函数的重载
DialogFragment在android 3.0时被引入。是一种特殊的Fragment,用于在Activity的内容之上展示一个模态的对话框。典型的用于:展示警告框,输入框,确认框等等。...且DialogFragment也允许开发者把Dialog作为内嵌的组件进行重用,类似Fragment(可以在大屏幕和小屏幕显示出不同的效果)。...5、传递数据给Activity 从dialog传递数据给Activity,可以使用“fragment interface pattern”的方式,下面通过一个改造上面的登录框来展示这种模式。...,如果是大屏幕则直接以对话框显示,如果是小屏幕则嵌入我们的Activity布局中 这个R.bool.large_layout是我们定义的资源文件: 在默认的values下新建一个bools.xml <...而通过DialogFragment实现的对话框则可以完全不必考虑旋转的问题。
是因为从 Android 6.0(API 23)开始,我们可以改状态栏的绘制模式,可以显示白色或浅黑色的内容和图标(除了魅族手机,魅族自家有做源码更改,6.0 以下就能实现)。...从 Android4.4 以上版本才是真正的可以设置沉浸式体验,但也仅仅是操作状态栏和导航栏的显示与隐藏。...用户可以通过在状态栏与导航栏原来区域的边缘向内滑动让系统栏重新显示。...用户滑动后, SYSTEMUIFLAGHIDENAVIGATION 和 SYSTEMUIFLAG_FULLSCREEN 就会被清除,系统栏就会重新显示并保持可见。...滑动的操作并不会清空任何标签,也不会触发系统 UI 可见性的监听器,因为暂时显示的导航栏并不被认为是一种可见的状态。
kotlin 1.4.0正式版发布时推出了StateFlow和SharedFlow,两者拥有Channel的很多特性,可以看作是将Flow推向台前,将Channel雪藏幕后的一手重要操作。...然后开启灵魂三问: 在生命周期组件中消费Channel是否会内存泄漏? 不会,因为Channel并不会持有生命周期组件的引用,并不像LiveData传入Observer式的使用。 是否支持线程切换?...发现问题 DialogFragment和Activity的通信 我们通常使用DialogFragment来实现弹窗,在其宿主Activity中设置弹窗的点击事件时,如果回调函数中引用了Activity对象...状态、事件从架构层面上就明确划分,便于约束开发者写出漂亮的代码。...比直接使用协程更简单地将基于回调的api改写成像同步代码一样的调用 使用callbackFlow,将异步操作结果以同步挂起的形式发射出去。
Fragment简化了大屏幕UI的设计,它不需要开发者管理组件包含关系的复杂变化,开发者使用Fragment对 UI组件进行分组、模块化管理,就可以更方便地在运行过程中动态更新 Activity的用户界面...其中 ActivityA仅包含显示文章列表的Fragment A,而当用户选择一篇文章时,它会启动包含新闻内容的Activity B,如上图所示右边的手机部分。...概括起来,使用Fragment有以下一些好处: Fragment可以将Activity分离成多个可重用的组件,每个都有它自己的生命周期和UI。...● DialogFragment 显示一个浮动的对话框。使用这个类创建对话框是替代Activity创建对话框的最佳选择。...为了控制Fragment显示的组件,通常需要重写onCreateView()方法,该方法返回的View 将作为该Fragment显示的View组件,当Fragment绘制界面组件时将会回调该方法。
实现底部弹窗 利用dialogFragment实现底部弹窗 实现底部弹窗的方式 由于本人水平有限,只知道一下几种实现底部弹窗的方式 利用PopupWindow实现底部弹窗。...利用DialogFragment实现底部弹窗。 下面,就利用以上三种方式分别实现Android中的底部弹窗。...下面看下利用PopupWindow实现底部弹窗的代码,重要的方法我会具体讲解 private void initPopupWindow() { //要在布局中显示的布局 contentView...由于,我们要将mPopWindow放在整个屏幕的最低部,所以我们将R.layout.activity_main做为它的父容器,将其显示在BOTTOM的位置。...screenWidth : screenHeight;//适配手机横屏 getWindow().setAttributes(params);//重新设置dialog的属性 setCanceledOnTouchOutside
这样,其实给我们带来一个很大的问题,DialogFragment说白了是Fragment,和当前的Activity的生命周期会发生绑定,我们旋转屏幕会造成Activity的销毁,当然也会对DialogFragment...效果图: 4、使用Fragment来保存对象,用于恢复数据 如果重新启动你的Activity需要恢复大量的数据,重新建立网络连接,或者执行其他的密集型操作,这样因为配置发生变化而完全重新启动可能会是一个慢的用户体验...在这样的情况下,当你的Activity因为配置发生改变而重启,你可以通过保持一个Fragment来缓解重新启动带来的负担。这个Fragment可以包含你想要保持的有状态的对象的引用。...从效果图可以看到,无论如何旋转不会重启Activity. 效果图: 6、旋转屏幕的最佳实践 下面要开始今天的难点了,就是处理文章开始时所说的,当异步任务在执行时,进行旋转,如果解决上面的问题。...,但是丝毫不影响加载数据任务的运行和加载框的显示~~~~ 效果图: 可以看到我在加载的时候就三心病狂的旋转屏幕~~但是丝毫不影响显示效果与任务的加载~~ 最后,说明一下,其实不仅是屏幕旋转需要保存数据
当时我的想法是,PermissionX只定义显示对话框,关闭对话框等必要的接口,至于实现方面不做任何限制,你可以用Dialog,也可以用DialogFragment,甚至可以用PopupWindow,或者是完全自定义的控件都行...DialogFragment自定义对话框时同样将这几个必要的方法进行实现即可。...因为在界面上其实并不需要将deniedList中的权限全部显示出来,而是只显示要申请的权限组名即可,这样可以让界面更精简。...我们都知道,从Android 10系统开始,Google引用了深色主题功能,一个出色的App在用户开启了深色主题模式之后,应该自动将界面也切换成深色模式。...现在重新运行程序之后,浅色主题和深色主题下的对话框效果分别如下图所示: ? ?
2 实现弹框: 因为后来谷歌推荐使用的DialogFragment,所以我们此处弹框也是使DialogFragment。...我们就来看看到底是为什么二边有间隙,然后再来看如何自己处理: 我们知道我们的View都是被包含在window里面,虽然我们的自己的View的宽度已经设置成了match_parent,但是我们并没有对window...毕竟我们的View也是被包含在DecorView里面。废话不多说,我们马上实验: ? 然后我们再看效果,果不其然: ?...3 弹框从下而上显示: 我们看过ios的弹框效果,是从底部从下而上升起,然后消失的时候也是从上而下消失。...从原来的位置,增加了自身高度的距离为起始点,开始移动,然后再回到原来的位置。 消失动画: 只要跟上面反过来就可以了。
mStartingTimeMills,这里主要是为了记录录音的时长,等到录音结束后再获取一次当前的时间,然后将两个时间进行相减,就能得到录音的具体时长了。...在启动时还顺便开始了 mChronometer 的计时显示,这是一个 Android 原生的显示计时的一个控件。...外部调用这个对话框的时候,只需要传入一个包含录音文件信息的 RecordingItem,因为包含的信息比较多,所以最好将 RecordingItem 进行序列化。...,当开始播放录音时候,将录音文件的时长,设置进 mSeekBar 里面,播放录音的同时,运行 mSeekBar,通过监听 mSeekBar 的进度,刷新显示的播放进度。...Android 撸起袖子,自己封装 DialogFragment 手把手教你从零开始做一个好看的 APP
FragmentActivity被后台杀死后恢复逻辑 当App被后台异常杀死后,再次点击icon,或者从最近任务列表进入的时候,系统会帮助恢复当时的场景,重新创建Activity,对于FragmentActivity...举个栗子 我们创建一个Activity,并且在onCreate函数中新建并show一个DialogFragment,之后通过某种方式将APP异常杀死(RogueKiller模拟后台杀死工具),再次从最近的任务唤起...App的时候,会发现显示了两个DialogFragment,代码如下: public class DialogFragmentActivity extends AppCompatActivity {...,在异常杀死的情况下onCreate(Bundle savedInstanceState)函数的savedInstanceState参数也不是null,而是包含了被杀死时所保存的场景信息。...为什么出现两个DialogFragment Fragment在被创建之后,如果不通过add或者replace添加到Activity的布局中是不会显示的,在保存现场的时候,也是保存了add的这个状态的,来看一下
save.gif 识别包含普通文字的二维码: ? text.gif 识别包含网址的二维码: ?...而不是 poupwindow 的原因是 poupwindow 的显示通常需要依托另一个View,而且在7.0以上有兼容问题。...可以看到通过 WebView.HitTestResult ,我们可以获得除了图片外的很多内容类型。当然这里我们只需要判断是否是图片就好了,然后将长按位置和url一起回调给外层。...在手指长按处显示弹框,主要就是 DialogFragment 显示位置的设定了: public void onStart() { super.onStart(); Dialog dialog =...显示弹框的同时还要判断图片是否包含二维码,这部分就是 Zxing 自带的功能,所以代码就不贴了。
---- 实现弹框: 因为后来谷歌推荐使用的是DialogFragment,所以我们此处弹框也是使用DialogFragment。...我们就来看看到底是为什么二边有间隙,然后再来看如何自己处理: 我们知道我们的View都是被包含在window里面,虽然我们的自己的View的宽度已经设置成了match_parent,但是我们并没有对window...毕竟我们的View也是被包含在DecorView里面。废话不多说,我们马上实验: decorView.setPadding(0,0,0,0);复制代码 然后我们再看效果,果不其然: ?...---- 弹框从下而上显示: 我们看过ios的弹框效果,是从底部从下而上升起,然后消失的时候也是从上而下消失。...而我们只需要我们的弹框显示的位置,让的起始位置如下图所示: ? ?
Fragment 概念 Android从3.0之后引入了Fragment,可以把它理解为页面的一个片段,比如一个html网页就包含一个header头部片段,以及一个body身体片段。...设计Fragment的目的是让页面布局更加灵活,不但可以随意组装和拼接各个片段,还可以只更新某个片段实现页面局部更新的功能(这个类似网页的ajax技术)。...比如广告、地图等组件; 3、同一套代码可适配不同尺寸的屏幕,比如说同时适配竖屏与横屏,同时适配手机与平板等等; 动态注册 Fragment有两种使用方式,一种是动态注册,另一种是静态注册。...导致状态丢失的情况有很多,其中一种是早期的Android可能在onStop之前就会结束Activity,后来从3.0开始只能在onStop之后才能结束Activity,这样早期Android如果在omPause...Fragment的子类 Android还给Fragment设计了几个子类,分别用在某些特殊的场合,具体说明如下: DialogFragment : 用于对话框的碎片。
GuideView是一种基于DialogFragment实现的引导遮罩浮层视图的轻量级解决方案,它具备以下的特性: 响应导航按钮的动作(因为引导浮层本质是一个dialog); 链式引导层,支持设定一组的引导遮罩视图...在GuideView内部通过这个配置项去构造GuideView的实例,并通过GuideViewFragment显示在界面上。...其中的属性都通过构造器的模式,通过静态内部类Builder进行构建,属性说明如下: targetView 引导视图需要显示附着的目标视图 hintView 引导视图(不包含半透明浮层以及透明焦点区) transparentSpaceXXX...相对于目标视图(targetView)的边距 hasTransparentLayer 是否显示透明焦点区域,默认显示。...,对外部业务完全透明无感知到一个类 GuideViewFragment 实际显示引导视图的弹窗。
领取专属 10元无门槛券
手把手带您无忧上云