Android Dialog之DialogFragment详解与使用

news2024/11/20 1:42:18

一、介绍

        在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<LifecycleOwner> {
            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<V : ViewDataBinding> : 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<DialogFragmentbind>() {

    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 {

        }
    }
}

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <data class="DialogFragmentbind"></data>

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">


        <TextView
            android:id="@+id/text_info"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>
    </FrameLayout>
</layout>

执行:

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

注意:

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

DialogFragment can not be attached to a container view

 

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

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

解决:

1.获取view的parent,通过remove自己

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/502405.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++面试题

试题一 请问如下函数调用了什么构造函数和析构函数&#xff0c;以及调用的顺序是什么&#xff1f; 如果 fun函数里写成 return s1 s2 有什么变化&#xff1f; string fun(strings1, string s2) {string tmp s1 s2;return tmp; } int main() {string s fun(s1, s2);retur…

AI来势汹汹,这份「生存计划」请查收!

AIGC即人工智能生产内容&#xff0c;最近可太火了&#xff0c;但是火了这么久&#xff0c;有些人都没明白到底为什么火&#xff1f;甚至不明所以觉得“AI替代XX”&#xff0c;小编认为没必要焦虑&#xff0c;一起来看一下吧。 AI工具们一日千张图、3小时写一本书、2分钟构建一个…

论文导读 | 大语言模型中应用到的强化学习算法

摘要 在最近取得广泛关注的大规模语言模型&#xff08;LLM&#xff09;应用强化学习&#xff08;RL&#xff09;进行与人类行为的对齐&#xff0c;进而可以充分理解和回答人的指令&#xff0c;这一结果展现了强化学习在大规模NLP的丰富应用前景。本文介绍了LLM中应用到的RL技术…

《NFT区块链进阶指南一》Remix部署Solidity ERC721合约(NFT合约)到Etherscan

文章目录 一、部署合约1.1 无构造参数合约部署1.2 有构造参数合约部署 二、合约详情三、部署提示 本篇为NFT区块链高级部分&#xff0c;在阅读之前需了解&#xff1a;Remix、Metamask、Etherscan、Solidity、Openzeppelin、ERC721合约 一、部署合约 1.1 无构造参数合约部署 智…

maven入门学习

简介 maven是基于ant升级的&#xff0c;apache的自动化构建工具、项目管理工具 Maven – Welcome to Apache Maven maven使用pom.xml进行配置 maven项目可以更方便的实现导jar包、拆分项目 idea默认集成了maven 下载安装 下载maven&#xff0c;在官网&#xff08;Maven –…

如何设计电商SPU与SKU表以及相关的表?

一、先了解SPU及SKU的相关概念&#xff1a; 我们在开发电商项目时&#xff0c;必须首先要了解两个概念&#xff0c;SPU与SKU是什么&#xff1f;这也是设计一个好的电商系统的必要前提。商系统实现了什么功能&#xff0c;大数情况下都是和商品模块相关联的。因此商品模块本身的…

Python基础入门(3)—— 什么是函数递归、字典、集合、文件操作、异常处理?

文章目录 01 | &#x1f698;函数 && 递归&#x1f694;函数&#x1f694;递归 02 | &#x1f698;字典03 | &#x1f698;集合04 | &#x1f698;文件05 | &#x1f698;异常处理06 | &#x1f698;习题 Better late than never. 迟做总比不做好;晚来总比不来好。 01 …

M302A-CW/BYT-通刷S905L3(B)-当贝纯净桌面卡刷固件包

M302A-CW&#xff0f;BYT-通刷S905L3(B)-当贝纯净桌面卡刷固件包-内有教程 特点&#xff1a; 1、适用于对应型号的电视盒子刷机&#xff1b; 2、开放原厂固件屏蔽的市场安装和u盘安装apk&#xff1b; 3、修改dns&#xff0c;三网通用&#xff1b; 4、大量精简内置的没用的…

MFP450 基础飞行平台问世,支持室内室外无GPS环境飞行

无人机开发入门&#xff0c;我们需要一个怎样的基础飞行平台&#xff1f; 开源无人机的发展日新月异&#xff0c;但遗憾的是&#xff0c;在PX4和FMT生态中&#xff0c;还很少看到一个稳定可靠的基础飞行平台。目前国内市场的选择不多&#xff0c;还是以DIY为主&#xff0c;尤其…

GEE:使用 ROC 曲线和 AUC 评估分类算法性能

作者:CSDN @ _养乐多_ 在机器学习和遥感数据分析领域,评估分类算法的性能是关键任务之一。Google Earth Engine(GEE)平台提供了丰富的遥感数据和分析工具,结合 ROC(接收者操作特征)曲线和 AUC(曲线下面积)分析,可以有效评估分类算法的准确性和可靠性。 本文将介绍如…

基于阻塞队列实现异步秒杀

文章目录 1 异步秒杀思路2 Redis完成秒杀资格判断3 基于阻塞队列实现秒杀优化总结 1 异步秒杀思路 我们来回顾一下下单流程 当用户发起请求&#xff0c;此时会请求nginx&#xff0c;nginx会访问到tomcat&#xff0c;而tomcat中的程序&#xff0c;会进行串行操作&#xff0c;分…

搞懂 API,跨域资源贡献 (CORS )和安全性问题

在 Web 应用开发中&#xff0c;API 是应用程序和其他系统之间进行数据交互的主要方式。 跨域资源共享&#xff08;CORS&#xff09;是一种常见的处理跨域请求的技术&#xff0c;但同时也带来了一些安全性问题。我将分享 CORS 技术及其安全性问题。 跨域资源共享&#xff08;COR…

django CBV 与 DRF APIView源码分析

django CBV源码分析 在django框架中&#xff0c;视图层中的逻辑即可以使用函数处理也可以使用类进行处理&#xff0c;如果在视图层中使用函数处理请求&#xff0c;就是FBV(function base views)&#xff0c;如果在视图层中使用类处理请求&#xff0c;就是CBV(class base views…

Windows无法完成格式化怎么办?正确的3个解决方法!

案例&#xff1a;Windows无法完成格式化怎么办 【由于我的U盘使用时间过长&#xff0c;很多文件都是不需要的&#xff0c;我想将其格式化&#xff0c;但插入电脑后&#xff0c;Windows根本无法完成格式化&#xff0c;这是为什么呢&#xff1f;我应该怎么做呢&#xff1f;求答案…

谁想和我一起做低代码平台!一个可以提升技术,让简历装x的项目

序言 正如文章标题所述&#xff0c;最近一段时间低代码这个概念非常的火&#xff0c;但其实在不了解这个东西的时候觉得它真的很炫酷&#xff0c;从那时就萌生了做一个低代码平台的想法。 但随着时间的变化&#xff0c;现在市面上低代码各个业务方向的平台都有了&#xff0c;可…

算法训练第二周题解汇总

A - AABCC [ABC300D] AABCC - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 大意&#xff1a; 题解&#xff1a; 就是纯暴力题&#xff0c;由于 a<b<c&#xff0c;所以≤N&#xff0c;a<500&#xff1b;<N&#xff0c;c<。先用埃筛预处理&#xff0c;然后枚举的…

hutool工具

目录 官网 简介 pom.xml EscapeUtil使用 HttpRequest使用 官网 Hutool参考文档 简介 Hutool 是一个小而全的 Java工具类库&#xff0c;通过静态方法封装&#xff0c;降低相关API的学习成本&#xff0c;提高工作效率&#xff0c;涵盖了Java开发开发中的方方面面 使用 Hu…

Java入门指南:从零开始的基础语法

java语言概述 Java是一种高级编程语言&#xff0c;最初由Sun Microsystems&#xff08;现在是Oracle Corporation的一部分&#xff09;在1995年推出。Java以其简单、可移植和安全的特性而闻名&#xff0c;并广泛用于各种应用程序开发&#xff0c;从桌面应用程序到移动应用程序和…

Linux如何卸载或者删除docker

1.查看当前docker状态: systemctl status docker 2.如果是运行状态则停掉: systemctl stop docker 3.查看yum安装的docker文件包: yum list installed |grep docker ​ 删除所有安装的docker文件包 yum -y remove docker.x86_64 其他的docker相关的安装包同样删除操作&#xf…

国内GPU渲染农场有哪些值得推荐?

GPU凭借它在图形渲染领域强大的架构和计算能力&#xff0c;给广大用户带来了一种更为高效的解决方案&#xff0c;我们启用GPU渲染加速&#xff0c;实际就是调用GPU加速图形的渲染和填充。既然聊到GPU渲染&#xff0c;CG行业的朋友们肯定也好奇国内值得推荐的GPU渲染农场有哪些&…