关于DialogFragment的一些学习

LeRobot SO-ARM100 学习笔记(2) diffusion module 对 lerobot 中的 diffusion policy 进行基本的代码阅读 阅读详情

关于DialogFragment的一些学习

标签(空格分隔): DialogFrgment


经历了一个月的项目期,Google给我的最好礼物莫过于谷歌官方网站了
点击进入Google官网DialogFragment介绍

自从Fragment时代的到来,任何View都可以封装到一个Fragment中,然后代替原来的固定的布局模式;DialogFragment因为继承于Fragment并封装了一个Dialog, 所以,有两种方式可以启动DialogFragment.

调用DialogFragment的show()方法,覆盖模式

void showDialog() {
    // Create the fragment and show it as a dialog.
    DialogFragment newFragment = MyDialogFragment.newInstance();
    newFragment.show(getFragmentManager(), "dialog");
}

show方法的实现

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

按照Fragment的加载方式,加载到内容区域

FragmentTransaction ft = getFragmentManager().beginTransaction();
DialogFragment newFragment = MyDialogFragment.newInstance();
ft.add(R.id.embedded, newFragment);
ft.commit();

在Dialog的构造方法中,实例化了一个属于自己的Window对象,这个很重要。

 Dialog(Context context, int theme, boolean createContextThemeWrapper) {
  ····
        mWindowManager = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
        Window w = PolicyManager.makeNewWindow(mContext);
        mWindow = w;
        w.setCallback(this);
        w.setOnWindowDismissedCallback(this);
        w.setWindowManager(mWindowManager, null, null);
        w.setGravity(Gravity.CENTER);
        mListenersHandler = new ListenersHandler(this);
    }
public class Dialog implements DialogInterface, Window.Callback,
        KeyEvent.Callback, OnCreateContextMenuListener, Window.OnWindowDismissedCallback {}

上面这段代码,表明Dialog能够接受Window的Callback,消失事件,按键事件(优先于宿主Activity)

这表明Dialog可以做很多事情,因为它拥有属于自己的Window,能够监听按键的事件,大家都有各种方式让Fragment变相监听到返回键。如何只需要一个页面的话,也可以考虑DialogFragment。
Demo: 设置Window的大小

Window window = getDialog().getWindow();
        DisplayMetrics dm = new DisplayMetrics();
        getActivity().getWindowManager().getDefaultDisplay().getMetrics(dm);
        getDialog().getWindow().setLayout(dm.widthPixels,
                getDialog().getWindow().getAttributes().height);
        window.setBackgroundDrawable(new ColorDrawable(0xff000000));
        WindowManager.LayoutParams layoutParams = window.getAttributes();
        // 底部显示
        layoutParams.gravity = Gravity.BOTTOM;
        layoutParams.height = WindowManager.LayoutParams.MATCH_PARENT;

        layoutParams.windowAnimations = com.jiuyuhulian.LiveRoom.R.style.BottomToTopAnim;
        window.setAttributes(layoutParams);

DialogFragment实现的接口方法。

public void onCancel(DialogInterface dialog) {
    }

public void onDismiss(DialogInterface dialog) {
    if (!mViewDestroyed) {
        // Note: we need to use allowStateLoss, because the dialog
        // dispatches this asynchronously so we can receive the call
        // after the activity is paused.  Worst case, when the user comes
        // back to the activity they see the dialog again.
        dismissInternal(true);
    }
}

对比, 简单的解释就是,当我们锁屏的时候,我们的Dialog会调用dismissAllowingStateLoss(), 当解锁时,DialogFragment会再次显示出来,而dissmiss则会不保存这个状态。

public void dismiss() {
        dismissInternal(false);
    }
public void dismissAllowingStateLoss() {
        dismissInternal(true);
    }

dismissInternal(boolean allowStateLoss)

void dismissInternal(boolean allowStateLoss) {
        if (mDismissed) {
            return;
        }
        mDismissed = true;
        mShownByMe = false;
        if (mDialog != null) {
            mDialog.dismiss();
            mDialog = null;
        }
        mViewDestroyed = true;
        if (mBackStackId >= 0) {
            getFragmentManager().popBackStack(mBackStackId,
                    FragmentManager.POP_BACK_STACK_INCLUSIVE);
            mBackStackId = -1;
        } else {
            FragmentTransaction ft = getFragmentManager().beginTransaction();
            ft.remove(this);
            if (allowStateLoss) {
                ft.commitAllowingStateLoss();
            } else {
                ft.commit();
            }
        }
    }
    @Override
    public FragmentTransaction beginTransaction() {
        return new BackStackRecord(this);
    }

监听返回键

getDialog().setOnKeyListener(new DialogInterface.OnKeyListener() {
            @Override
            public boolean onKey(DialogInterface dialogInterface, int i, KeyEvent keyEvent) {
                // 这里会优先监听到Key事件,最主要的是back键,注意back键有down和up事件
                return false;
            }
        });

设置要在getLayoutInflater()方法之前,也就是在页面初始化之前

public void setStyle(int style, int theme) {
        mStyle = style;
        if (mStyle == STYLE_NO_FRAME || mStyle == STYLE_NO_INPUT) {
            mTheme = com.android.internal.R.style.Theme_DeviceDefault_Dialog_NoFrame;
        }
        if (theme != 0) {
            mTheme = theme;
        }
    }

    public static final int STYLE_NO_TITLE = 1; // 没标题
    public static final int STYLE_NO_FRAME = 2; // 无框的(没有层级)
    public static final int STYLE_NO_INPUT = 3; // 不可输入
10分钟学会工程领域Hypermesh与Abaqus联立处理大量铆钉连接简化做法 铆钉连接是一种可靠且高强度的机械连接方式,广泛应用于多个领域。但是,工程结构上铆钉连接往往以较大的数量出现,若按照常规的一个个去选择生成,处理1个铆钉连接点需要1分钟来算,300个铆钉需要5个小时,耗费大量的时间成本。给出了一种高效处理铆钉连接的方法,提升效率50倍以上。 阅读详情

相关推荐

别再羡慕专业版!用这个批处理脚本,一键给Win11家庭版装上官方沙盒

本文详细介绍了如何通过批处理脚本在Windows 11家庭版上安装官方Windows沙盒(Windows Sandbox),无需复杂操作即可享受专业版功能。脚本自动激活系统内置组件,提供安全隔离的虚拟化环境,适用于软件测试、安全浏览等场景。

weixin_26757925的博客 490

android dismiss方法,Android编程之DialogFragment源码详解(一)注:对 dismissAllowingStateLoss()理解...

DialogFragment是Fragment家族成员之一,如果你把它简单的理解成Dialog,那就错了。它的确可以做作dialog显示,还可以显示出自己定义的Dialog或者AlertDialog,但它同时也是一个Fragment。按照官方的话来理解就是,你既可以把它当成一个dialog显示出来,也可以让它作为一个Fragment嵌套在Activity中,这样更方便开发。为什么这么说呢?试想一下...

weixin_36484898的博客 4198

【脑电分析系列】第7篇:频域分析基石 — 功率谱密度(PSD)的计算与常见方法对比

本文探讨了脑电图(EEG)频域分析的核心方法——功率谱密度(PSD)。通过对比基于快速傅里叶变换的周期图法和更稳健的Welch's方法,指出后者通过分段、加窗和平均处理,能有效降低估计方差,更适合分析非稳态的脑电信号。文章详细解析了关键参数设置对频率分辨率和统计稳定性的影响,并提供了Python计算实现。PSD分析将复杂的脑电信号转换为直观的频域特征,为研究认知功能和神经疾病提供重要依据。

qq_32516809的博客 1800

bug解决方案

1.问题:Could not find active fragment with index -1 解决:dialog使用dismissAllowingStateLoss() 2.问题:Resources$NotFoundException: Resource ID #0xfffffe6c(https://apm.umeng.com/platform/5ce4e5d2570df3475b0000cf/error_analysis/crash/detail/4726839292207?errorId=4726

riqthen的博客 2291

统信UOS专业版服务器无人值守安装

(2)、专业版:主要针对整机厂商、政府单位、事业单位和企业用户使用,cpu目前支持x86、arm、mips、sw64和LoogngArch架构,试用期免费获得90天的使用,随后需要单位采购授权,获得正式激活码后才可以正常使用。其中企业版代号为d,行业版为a/c,欧拉版则为e,在最近的更新中,c版已经停止更新迭代,后续行业版本将都为a版,版本代号体现在镜像名字中以及版本号上,例如1050d则表示企业版1050版本。UOS系统服务器版本分为:专业版(d版)、行业版(a版)、欧拉版(e版)

靠谱运维 2251

从封装到先进封装:一文讲透Chiplet、2.5D/3D堆叠与系统集成

封装是芯片产业链中连接硅片与电路板的桥梁,承担物理保护、电气连接、散热与机械支撑等核心任务。传统封装从DIP、QFP发展到BGA,通过提升引脚密度满足早期性能需求。随着摩尔定律放缓,单纯缩小晶体管尺寸难以为继,先进封装应运而生,其核心理念从“封装单颗芯片”转向“系统级高密度集成”。扇出型封装、2.5D硅中介层、3D堆叠、Chiplet和系统级封装等技术,通过微米级互连和垂直堆叠,大幅提升I/O密度与带宽,成为AI芯片、HBM存储、高性能计算等领域的关键支撑。本文梳理先进封装的技术演进、分层架构与工程难点,帮

weixin_29185167的博客 365

Android开发中出现的错误集

本文转自http://blog.sina.com.cn/s/blog_5da93c8f0102wo1f.html,仅供学习使用 1、 错误 :Can not perform this action after onSaveInstanceState 场景:应用中使用FragmentDialog统一管理弹出框,分别在基类BaseActivity和BaseFragment中增加显示和隐

Dovar_66的博客 801

GPU运维面试题

【代码】GPU运维面试题。

u011220233的博客 695

android 工作中遇到的问题,不定期更新

1、问题:App点击Home键后,再次点击APP图标,APP重启回不到点击home键前的那个界面 解决办法:在你的LAUNCHER的Activity里面查看是否有 android:launchMode="singleTask"这个属性,如果有这个属性就把他去掉,或者改成singleTop。 2、问题:dialogfragment在dismiss()时,爆出java.lang.IllegalStateException: Can not perform this action after onSaveInst

weixin_42260375的博客 560

osgearth2.10 demo功能介绍

osgearth-2.10 demo: 说明: 1、运行环境win7 x64 旗舰版,CPU i5-6400 8核,8G内存; 2、括号内是对应demo的测试参数(.earth); 3、配置OSG_FILE_PATH; 4、参数命令行可以查看各个demo需要的输入参数; 5、前缀说明:gui界面程序、cmd控制台程序、non功能未知; 6、程序后括号里的non表示不需要通过命令行输入参数; 示例: 1、gui:osgearth_3pv(simple.earth):相机与地球的投影关系,Range表示相机

rach09的专栏 2421

3GPP LTE/NR信道模型

CDL(Clustered Delay Line):簇延迟线模型,包括CDL-A、CDL-B、CDL-C三个用于NLOS的信道模型,以及CDL-D、CDL-E两个用于LOS的信道模型。

LinkEverything的博客 1万+

解决IllegalStateException: Can not perform this action after onSaveInstanceState

今天使用Fragment的时候,出现了这个错误 IllegalStateException: Can not perform this action after onSaveInstanceState: E/AndroidRuntime(12747): Caused by: java.lang.IllegalStateException: Can not perform th

1278

FPGA设计-Vivado的Off-Chip Termination设置问题

经常遇到在FPGA设计时,很多人很迷惑这些关于硬件的终端匹配怎么设置,Vivado的Off-Chip Termination设置问题,这里就详细说一下这个问题。

whm128的博客 2723

DialogFragment学习笔记

DialogFragment是Android3.0之后引入的一种特殊的Fragment,官方建议使用DialogFragment代替Dialog或者AllertDialog来实现弹框的功能,因为它可以更好的管理Dialog的生命周期以及可以更好复用。 使用DialogFragment至少需要实现onCreateView或者onCreateDialog方法。onCreateView是使用定义的xml布局文件展示Dialog。onCreateDialog是利用AlertDialog或者Dialog创建出Di.

lyl0530的博客 378

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

DialogFragment学习

DialogFragment学习

xiaoduzi1991的博客 304

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Android学习之DialogFragment

DialogFrament是Android sdk中的对话框基类,开发人员可以针对此类进行扩展。他可以扩展出Android中的多种对话框,比如alertdialog,listdialog,radiodialog等。android已经为开发人员提供了简单的对话框,本篇要讲的是对话框的扩展部分。本例是根据sdk开发文档而来。 1.建立textdialog 在layout文件夹下面,建立textdi...

weixin_30359021的博客 113

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Android DialogFragment 学习和理解

最近的一个功能要用到一个弹出框,以前都是用Dialog来实现的,这次想用DialogFramgment试试,毕竟从4.X以后,Google希望用DialogFragment取代Dialog来用了。 DialogFragment既有Dialog的特性,也有Fragment的特性, Note:Android中DialogFragment一些重要方法的执行顺序 具体看文档,贴在这里只是

学习记录 1562

[Android分享] DialogFragment初次了解学习

[Android分享] DialogFragment初次了解学习 DialogFragment在android 3.0时被引入。是一种特殊的Fragment,用于在Activity的内容之上展示一个模态的对话框。典型的用于:展示警告框,输入框,确认框等等。在DialogFragment产生之前,我们创建对话框:一般采用AlertDialog和Dialog。注:官方不推荐直接使用Dialog创建对话框

krubo的博客 541

Android初学习 - 全屏DialogFragment的实现

在popopwindows里面使用fragment,但是在popopwindows里面找不到它的父控件,而使用DialogFragment,可以实现全屏Dialog(Popup) 要在DialogFragment的oncreate里面做 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(

myKernel 1146

【安卓学习之第三方库】 AndroidAutoSiz学习:DialogFragment的适配

█ 【android学习开源项目之AndroidAutoSize】AndroidAutoSize和DialogFragment的适配 █ 相关文章: -   ● 【web学习之html】 HTML基础 - 常见语法总结  ● 【web学习之html】 HTML基础 - 表单学习 █ 读前说明: -   ● 本文通过学习别人写demo,学习一些课件,参考一些博客,’学习相关知识,如...

任我飞的博客 2608

Pro Android学习笔记 四五 Dialog 2 DialogFragment

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.youkuaiyun.com/jiangjunshow也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!                DialogFragm

skdhfdfc的博客 318

【安卓学习之UI学习】Dialog的使用总结2 - DialogFragment(附带svg)

█ 【安卓学习之UI学习】Dialog的使用总结2 - DialogFragment █ 系列文章目录 提示:这里是收集了和Dialog有关的文章 【android学习开源项目之BasePopup】BasePopup(PopupWindow)进行二次封装 【android学习开源项目之AndroidAutoSize】AndroidAutoSize和DialogFragment的适配 【安卓学习之UI学习】 自定义组合控件View 的开发 【安卓学习之UI学习】 自定义 弧形等级进度条 【安

任我飞的博客 593

Android初学习 - DialogFragment 创建对话框

1、 概述 DialogFragment在android 3.0时被引入。是一种特殊的Fragment,用于在Activity的内容之上展示一个模态的对话框。典型的用于:展示警告框,输入框,确认框等等。 在DialogFragment产生之前,我们创建对话框:一般采用AlertDialog和Dialog。注:官方不推荐直接使用Dialog创建对话框。 2、 好处与用法 使用Dialog

myKernel 581

DialogFragment的简单使用,零基础学习android编程

如果你看到了这里,觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言。一定会认真查询,修正不足。最后针对Android程序员,我这边给大家整理了一些资料,包括不限于高级UI、性能优化、移动架构师、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter等全方面的Android进阶实践技术;希望能帮助到大家,也节省大家在网上搜索资料的时间来学习,也可以分享动态给身边好友一起学习!

m0_57473261的博客 892

DialogFragment的传值问题,中高级Android开发应该要了解

第二步:在Activity中传值@Override//这句代码是传值关键@Override});方法二:使用 构造方法 传值第一步:完善 MyDialogFragment 代码/***///这个是 Activity 向 DialogFragment 传值的关键代码段@Override//设置样式@Nullable@Override//获取布局@Override//调用回调});

m0_60607895的博客 947

Pro Android学习笔记(四五) Dialog(2) DialogFragment

Pro Android学习笔记(四五) Dialog(2) DialogFragment

qq_43724942的博客 313
上一篇: View基础知识
下一篇: Android微信登录(shareSDK)注意事项
PirateBrook
博客等级 码龄11年 90粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值