我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android Dialog之DialogFragment详解与使用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android Dialog之DialogFragment详解与使用

一、介绍

        在Android开发过程中,经常会有弹窗业务,在正常的弹窗业务中,常用到的是Dialog,Dialog的原理也是通过将view,添加到Dialog中。Dialog自身是一个独立的窗口,和Activity一样,有自己的window管理。如果简单的使用Dialog不方便管理,在后面Google提供了DialogFragment弹窗。

二、DialogFragment的介绍

        看到DialogFragment,从单词可以看到是Dialog与Fragment组合而成,但是在DialogFragment中,DialogFragment其实是一个fragment,内部持有一个Dialog,这样方便了开发者的管理。fragment在碎片管理中其实就是一个View,最终view的显示是通过dialog来完成。

        class NamelessClass_1 implements Observer {            NamelessClass_1() {            }            @SuppressLint({"SyntheticAccessor"})            public void onChanged(LifecycleOwner lifecycleOwner) {                if (lifecycleOwner != null && DialogFragment.this.mShowsDialog) {                    View view = DialogFragment.this.requireView();                    if (view.getParent() != null) {                        throw new IllegalStateException("DialogFragment can not be attached to a container view");                    }                    if (DialogFragment.this.mDialog != null) {                        if (FragmentManager.isLoggingEnabled(3)) {Log.d("FragmentManager", "DialogFragment " + this + " setting the content view on " + DialogFragment.this.mDialog);                        }                        DialogFragment.this.mDialog.setContentView(view);                    }                }            }        }

 同样,在类中也提供了丰富的方法

1、显示

    public void show(@NonNull FragmentManager manager, @Nullable String tag) {        this.mDismissed = false;        this.mShownByMe = true;        FragmentTransaction ft = manager.beginTransaction();        ft.add(this, tag);        ft.commit();    }

2、消失

    public void dismiss() {        this.dismissInternal(false, false);    }

3、获取dialog

    @Nullable    public Dialog getDialog() {        return this.mDialog;    }

4、初始化内部资源

  @Nullable    View onFindViewById(int id) {        return this.mDialog != null ? this.mDialog.findViewById(id) : null;    }

5.dialog创建

    @MainThread    @NonNull    public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {        if (FragmentManager.isLoggingEnabled(3)) {            Log.d("FragmentManager", "onCreateDialog called for DialogFragment " + this);        }        return new Dialog(this.requireContext(), this.getTheme());    }

三、实战

通过以上介绍,我们大概熟悉了DialogFragment的大概工作方式,如果想仔细研究,可以查看源码。

在实战使用中

1、继承重写

基类:

abstract class BaseBindDialogFragment : DialogFragment() {    val TAG=javaClass::class.java.name    lateinit var bind: V    override fun onCreateView(        inflater: LayoutInflater,        container: ViewGroup?,        savedInstanceState: Bundle?    ): View? {        bind = DataBindingUtil.inflate(inflater, getLayoutId(), container, false)        initView(bind.root)        return bind.root    }    override fun onStart() {        super.onStart()        initConfig(dialog)    }    @LayoutRes    abstract fun getLayoutId(): Int    abstract fun initView(view: View)    abstract fun initConfig(dialog:Dialog?)}
class MyDialogFrgament : BaseBindDialogFragment() {    override fun getLayoutId(): Int {        return R.layout.layout_dialog_view    }    override fun initView(view: View) {        bind.textInfo.text="我在测试"    }    override fun onResume() {        super.onResume()        MyLog.log(TAG,"onResume")    }    override fun onPause() {        super.onPause()        MyLog.log(TAG,"onPause")    }    override fun onStop() {        super.onStop()        MyLog.log(TAG,"onStop")    }    override fun initConfig(dialog: Dialog?) {        dialog?.let {        }    }}
                    

执行:

    private fun dialogExport() {        dialog = MyDialogFrgament()        dialog.show(supportFragmentManager, "dialogExport")    }

注意:

在开发过程中,好多新手会报错:

DialogFragment can not be attached to a container view

 

报错这个问题的原因是view的parent不为null,在消失后,又重新显示,这个时候会校验parent是否为null。

发生这个问题的核心是语法使用

解决:

获取view的parent,通过remove自己

每次展示的时候重新new一个对象

来源地址:https://blog.csdn.net/qq36246172/article/details/130558593

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android Dialog之DialogFragment详解与使用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android开发笔记之:Dialog的使用详解

Dialog是任何系统都必须有的一个控件,作为辅助窗口,用于显示一些消息,或请求用户采取一引起操作等。在Android中也不例外,基本使用可能参看文档。使用时的注意事项1. BACK键能取消掉对话框(dismiss),但是却不会触发其onO
2022-06-06

详解Android中Dialog的使用

在Android中经常要使用Dialog来实现一些提示以及一些特殊的效果,而且样式也不一样,每次都得查一大堆资料,还不一定能解决,这里总结一些常用的Dialog的实践。 普通的Dialog//普通的AlertDialog对话框 findVi
2022-06-06

详解Android应用中DialogFragment的基本用法

DialogFragment的基本用法 1. 创建DialogFragmentpublic class DialogA extends DialogFragment implements DialogInterface.OnClickLis
2022-06-06

Android开发之Dialog怎么使用

在Android开发中,可以使用Dialog来创建弹出式对话框。下面是使用Dialog的一般步骤:1. 创建Dialog实例:```javaDialog dialog = new Dialog(context);```2. 设置对话框的内容
2023-08-18

8种android 对话框(Dialog)使用方法详解

本文汇总了android 8种对话框(Dialog)使用方法,分享给大家供大家参考,具体内容如下 1.写在前面 Android提供了丰富的Dialog函数,本文介绍最常用的8种对话框的使用方法,包括普通(包含提示消息和按钮)、列表、单选、多
2022-06-06

Android之ViewFlipper使用详解

ViewFlipper是Android中的一个控件容器,可以用来展示多个子视图,并且可以通过手势或者代码控制子视图的切换。下面是ViewFlipper的使用详解:1. 在XML布局文件中定义ViewFlipper:```android:id
2023-09-13

Android之Spinner使用详解

Spinner是Android中常用的控件之一,用于显示一个下拉列表,用户可以从中选择一个选项。以下是关于Spinner的使用详解:1. 在布局文件中定义Spinner控件:```xmlandroid:id="@+id/spinner"an
2023-09-09

Android Dialog对话框用法实例详解

本文实例讲述了Android Dialog对话框用法。分享给大家供大家参考,具体如下: Activities提供了一种方便管理的创建、保存、回复的对话框机制,例如 onCreateDialog(int), onPrepareDialog(i
2022-06-06

【android】ListView之BaseAdapter使用详解

android中ListView是一个比较常用的控件,它用于方便的列表显示可见数据,当数据过多时,会出现滚动条,并且可以根据屏幕长度进行自适应显示。 1. 为什么使用BaseAdapter? ListView需要设置数据适配,就是添加你需要
2022-06-06

Android 对话框 Dialog使用实例讲解

对话框 Dialog 什么是对话框 对话框是在当前的页面之上弹出的小窗口, 用于显示一些重要的提示信息, 提示用户的输入,确认信息,或显示某种状态.如 : 显示进度条对话框, 退出提示. 对话框的特点: 1, 当前界面弹出的小窗口. 2,
2022-06-06

Android注解使用之ButterKnife 8.0详解

前言: App项目开发大部分时候还是以UI页面为主,这时我们需要调用大量的findViewById以及setOnClickListener等代码,控件的少的时候我们还能接受,控件多起来有时候就会有一种想砸键盘的冲动。所以这个时候我们
2023-05-31

Android开发之缓冲dialog对话框创建、使用与封装操作

本文实例讲述了Android开发之缓冲dialog对话框创建、使用与封装操作。分享给大家供大家参考,具体如下:package com.hstech.handysystem.prompt;import android.app.Dialog;i
2023-05-30

Android开发之ImageLoader使用详解

先给大家展示效果图,看看是大家想要的效果吗,如果还满意,请参考以下代码:前言 UniversalImageLoader是用于加载图片的一个开源项目,在其项目介绍中是这么写的, 支持多线程图片加载 提供丰富的细节配置,比如线程池大小,HTPP
2022-06-06

Android Mms之:PDU的使用详解

Android当中的Mms对MMS(Multimedia Messaging Service)的操作关乎MMS协议部分都是通过Frameworks中提供的API来完成的:com.google.android.mms这个包在SDK中是不开放的
2022-06-06

Android开发之Kotlin委托的原理与使用详解

我们常用的委托模式怎么使用?在 Java 语言中需要我们手动的实现,而在 Kotlin 语言中直接通过关键字 by 就可以实现委托,下面我们就一起看看不同种类的委托使用以及在 Android 常见的一些场景中的使用
2023-03-23

Android入门之Service的使用详解

我们的Android在启动一些长事务时都会使用异步,很多初学者觉得这个异步就是一个异步线程+Handler而己。如果你这么想就错了。这一切其实靠的正是Android里的Service。本文就来和大家聊聊Service的生命周期和使用,需要的可以参考一下
2022-12-08

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录