在这里插入图片描述

三三要成为安卓糕手

零:布局转换

在很多工程当中用的都是LinearLayout和relativelayout,这两者都可以转化为Constrainlayout

注:这种用法并不能精确转换,具体还是要根据自己的需求来做布局约束

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一:snackbar显示弹窗

((20250705191320-a3dyocx “之前学习过Toast弹窗,类比思想snackbar;我们以之前设计过的登录页面为基础展开弹窗的学习”))

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

1:代码

    private EditText etUserName;private EditText etPassword;private String userName;private String password;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_relative_converse_constraint_layout);//1:获取用户名框view 和 密码框viewetUserName = findViewById(R.id.et_user_name);etPassword = findViewById(R.id.et_password);//2:定位到登录按钮Button button = findViewById(R.id.btn_login);//3:对按钮进行监听button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//3.1:获取框里输入的内容userName = etUserName.getText().toString().trim();password = etPassword.getText().toString().trim();//3.2   如果用户名为空 就弹窗if(userName.length() == 0){Snackbar.make(button,"用户名为空",Snackbar.LENGTH_LONG).show();return;}//3.3   如果密码为空  也弹窗if(password.length() == 0){Snackbar.make(button,"密码为空",Snackbar.LENGTH_LONG)//4.2.1  并且弹出输入法.setAction("去输入密码",new View.OnClickListener(){@Overridepublic void onClick(View v) {//4.2.1.1   密码输入框请求获取焦点;这个跟自动化测试切换句柄有点像etPassword.requestFocus();//4.2.1.2   获取系统的某项服务InputMethodManager inputMethodManager = getSystemService(InputMethodManager.class);inputMethodManager.showSoftInput(etPassword,InputMethodManager.SHOW_IMPLICIT);}}).show();}}});//        button.setOnClickListener(new View.OnClickListener() {
//            @Override
//            public void onClick(View v) {
//                if(!userName.equals("admin") || !password.equals("123456")){
//                    Toast.makeText(ConstraintLoginActivity.this,"用户名与密码不匹配",Toast.LENGTH_SHORT).show();
//                    return;
//                }
//                startActivity(new Intent(ConstraintLoginActivity.this,TestActivity.class));
//            }
//        });}

注:在一个方法中,两个监听器同时监控同一个button,在代码运行时会爆出一些程序崩溃的bug

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2:Snackbar.make

snack 零食 bar 条 轻量级提示条 非常有意思的一种起名

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

第一个参数是当前页面的任何一个View;第二个参数文本;第三个参数显示的时间长短——短1.5s,长3s

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3:setAction

Snackbar.setAction() 是用于为 Snackbar 添加可点击操作按钮的方法。Snackbar 是一种轻量级的提示组件,显示在屏幕底部,而 setAction() 可以让它变得交互式。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

点击“去输入密码”就会跳出来输入法的使用

4:获取焦点

焦点的概念:当前哪一个视图在和用户进行交互

我们要做的事情是,点击去输入密码之后弹出输入法,让用户去输入密码

etPassword代指密码的TextView,requestFocus请求获取焦点,

@Overridepublic void onClick(View v) {//4.2.1.1   密码输入框请求获取焦点;这个跟自动化测试切换句柄有点像etPassword.requestFocus();//4.2.1.2   获取系统的某项服务InputMethodManager inputMethodManager = getSystemService(InputMethodManager.class);inputMethodManager.showSoftInput(etPassword, InputMethodManager.SHOW_IMPLICIT);}

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

5:弹出软键盘

(1)获取服务

getSystemService 获取系统的某项服务

InputMethodManager.class 是 Java 的类字面量(Class Literal)

		//4.2.1.2   获取系统的某项服务InputMethodManager inputMethodManager = getSystemService(InputMethodManager.class);inputMethodManager.showSoftInput(etPassword, InputMethodManager.SHOW_IMPLICIT);

(2)显示方式

implicit [ɪmˈplɪsɪt] 隐式的

SHOW_IMPLICIT理解成尊重用户之前的操作习惯,可选择的弹出或者不弹出输入法

SHOW_FORCED管你丫之前开没开过输入法,直接给你弹出来

二:AlertDialog弹窗的使用

1:完整代码及效果

		AlertDialog.Builder builder = new AlertDialog.Builder(AlertDialogActivity.this);builder.setTitle("是否删除").setMessage("删除后不能恢复")//设置积极的按钮(积极消极其实就是按钮的位置不同罢了,little problem).setPositiveButton("确定",new DialogInterface.OnClickListener(){@Overridepublic void onClick(DialogInterface dialog, int which) {}}).setNegativeButton("取消",new DialogInterface.OnClickListener(){@Overridepublic void onClick(DialogInterface dialog, int which) {}});AlertDialog alertDialog = builder.create();findViewById(R.id.btn_show).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {alertDialog.show();}});//关闭弹窗//alertDialog.dismiss();

显示效果

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2:AlertDialog.Builder-建房子

Alert 警觉的 Dialog 对话 翻译为:警示对话框

导包选第二个;Androidx包下的样式更丰富一点,相对来说更好用一点,传入的参数是当前上下文,返回类型是Builder

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3:setTitle和setMessage

设置标题和设置信息,如上方效果显示的那样;

4:Positive/NegativeButton

dialog下提供了两种设置按钮的形式

设置两个按钮,积极的那个按钮默认放置在右边,消极的按钮默认放置在左边;

通过按钮设置监听器,进而可以写一些处理逻辑

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

5:builder.create()创建房子

其实很好理解,前面我们对build进行设置相当于打地基建房子装修,create方法就是把这个暗中的房子创建出来;

下面设置的点击按钮事情,只是一个单纯的触发媒介,不必惊慌

		AlertDialog alertDialog = builder.create();findViewById(R.id.btn_show).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {alertDialog.show();}});

默认情况下,无论点击按钮的哪个选项,关闭弹窗这件事情系统都会处理掉;

注:有时候需要手动的关闭弹窗,或者在其他时机关闭对话框时,就要调用 dismiss() 方法。

		//关闭弹窗alertDialog.dismiss();

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

三:Toast弹窗提示

之前有详细的讲过,此处仅做对比

Toast.makeText(CheckBoxActivity.this, "请勾选协议!", Toast.LENGTH_SHORT).show();

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

三个参数:上下文(一般是当前类),弹窗内容,弹窗时间(有长有短)

show方法展示

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

四:DialogFragment管理弹窗(难)

提出问题:定义的弹窗可能会被多处使用,那么它的创建和销毁,也就是生命周期的管理尤为重要。

这里我们介绍DialogFragment,一个专门用于创建对话框的抽象类;

Fragment在 Android 中,特指 “碎片”,是一种可嵌入 Activity 中的界面组件,用于构建灵活的界面(了解即可)

1:代码

老规矩先上代码

public class YesOrNoDialog extends DialogFragment {@NonNull@Overridepublic Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());builder.setTitle("是否删除").setMessage("删除后不能恢复")//设置积极的按钮(积极消极其实就是按钮的位置不同罢了,little problem).setPositiveButton("确定",new DialogInterface.OnClickListener(){@Overridepublic void onClick(DialogInterface dialog, int which) {}}).setNegativeButton("取消",new DialogInterface.OnClickListener(){@Overridepublic void onClick(DialogInterface dialog, int which) {}});AlertDialog alertDialog = builder.create();return alertDialog;}
}
public class DialogFragment extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_alert_dialog);Button fragmentDialog = findViewById(R.id.btn_show_dialog_fragment);fragmentDialog.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {YesOrNoDialog yesOrNoDialog = new YesOrNoDialog();yesOrNoDialog.show(getSupportFragmentManager(),"yesOrNo");}});}
}

2:对比分析

不要捉急

大局观对比看代码——((20250723152429-786dmu7 "我们在二:AlertDialog弹窗的使用 ")) 中装修房子的任务丢给了一个方法,在类中调用这个方法

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

而下面这张图片展示是把装修房子的任务丢给了一个类中被重写的方法,这个类继承自DialogFragment;

这样写的好处

  • 生命周期管理:自动处理对话框与 Activity 的生命周期绑定(如旋转屏幕时保持状态)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3:继承追溯

DialogFragment 是 Android 提供的一个抽象类,专门用于创建对话框,最终指向DIalog,是所有弹窗的父类,了解即可

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

4:onCreatDialog 重写方法介绍

onCreateDialog() 是继承父类后被重写的方法,是 DialogFragment 的核心,用于创建并返回对话框实例,返回类型是Dialog;

固定写法记住就好

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

import包导入第二个,否则重写onCreateDIalog出不来(on首字母小写)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

5:getActivity

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这里实例化一个Builder,需要传参一个Activity类,可以理解成依附于 调用它的 Activity;这里使用getActivity()方法,指的就是DialogFragment类调用,就依附于DialogFragment这个类

AlertDialog.Builder builder = new AlertDialog.Builder(DialogFragment.this);

像直接在DialogFragment类中使用我们定义出来的方法,就直接传参好了,如上述代码

6:如何使用

				YesOrNoDialog yesOrNoDialog = new YesOrNoDialog();yesOrNoDialog.show(getSupportFragmentManager(),"yesOrNo");

这两行代码是精髓,给show方法传递两个参数,第一个参数获取Fragment管理器,第二个参数tag,随便取一个唯一的指就可以

(1)getSupportFragmentManager

返回一个FragmentManager对象,用于管理Activity中所有的Fragment(碎片)(包括DialogFragment-对话碎片)

作用

  • DialogFragment 需要依附于一个 Activity 来显示,而 FragmentManager 就是连接两者的桥梁。

    其实就是中间商,因为FragmentManager还管理其他的碎片

  • FragmentManager 会跟踪 DialogFragment 的生命周期(如创建、显示、销毁),并处理与其他 Fragment 的交互。

(2)TAG

这是一个 String 类型的标签(tag) ,用于唯一标识这个 DialogFragment。

作用

  • 通过标签,你可以在 FragmentManager 中查找并获取这个 DialogFragment 的引用(例如使用 findFragmentByTag())。
  • 标签也会在日志或调试信息中显示,方便追踪问题。

7:容器化管理

(1)官方建议

官方建议不要在 Activity 或某个地方直接使用 Dialog,而是用‘容器’”

直接在 Activity 中创建 Dialog(如 AlertDialog)存在几个问题:

  1. 生命周期脱节
    Dialog 是独立于 Activity 生命周期的。

    例如,当屏幕旋转(Activity 重建)时,直接创建的 Dialog 会被销毁且不会自动重建,导致界面状态丢失(比如对话框突然消失)。

  2. 内存泄漏风险
    如果 Dialog 持有 Activity 的引用(如 this),而 Dialog 的生命周期长于 Activity(比如 Activity 被销毁但 Dialog 未关闭),会导致 Activity 无法被 GC 回收,造成内存泄漏。

  3. 配置变更处理复杂
    屏幕旋转、语言切换等配置变更时,需要手动保存和恢复 Dialog 的状态(如输入内容、选中状态),代码繁琐且易出错。

这是一种思想,慢慢体会

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(2)为什么 “容器化”(DialogFragment)更好?

  1. 自动跟随生命周期
    DialogFragment 由 FragmentManager 管理,当 Activity 重建时,FragmentManager 会自动重建 DialogFragment 及其内部的对话框,保持状态一致性(比如旋转屏幕后对话框仍在!!!这里理解非常好)。
  2. 避免内存泄漏
    DialogFragment 与 Activity 的绑定通过 FragmentManager 实现,遵循 Fragment 的生命周期规则,减少了不当引用导致的内存泄漏风险。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【AI绘画】Stable Diffusion webUI 与 ComfyUI 全解析:安装、模型、插件及功能对比

一、Stable Diffusion 与 UI 工具概述 Stable Diffusion 是当前最主流的开源 AI 绘画模型,通过文本描述生成高质量图像。为降低使用门槛,开发者推出了多种图形界面(UI)工具,其中AUTOMATIC1111 webUI(简称 …

ABP VNext + GraphQL Federation:跨微服务联合 Schema 分层

ABP VNext GraphQL Federation:跨微服务联合 Schema 分层 🚀 在微服务架构下,服务之间往往需要相互通信,而 GraphQL Federation 提供了一个有效的解决方案,帮助我们将多个微服务的 GraphQL API 聚合成一个统一的入口…

小程序组件的生命周期,以及在小程序中进行接口请求的方法设置

微信小程序组件生命周期与接口请求方法详解一、小程序组件生命周期微信小程序组件的生命周期指的是组件在不同阶段自动触发的函数,开发者可以利用这些钩子函数在特定时机执行相应操作。小程序组件的生命周期主要分为两类:组件自身生命周期和组件所在页面…

在线游戏玩家与物品交互处理

玩家与物品接触后的判定if (hit ! null && hit.CompareTag("Item")){Debug.Log("捡东西");var worldItem hit.gameObject.GetComponent<WorldItem>();if (worldItem ! null){var inventory GetComponent<PlayerInventory>();if (inv…

深入解析Java Stream 构建:AbstractPipeline

Java Stream 宏观介绍见&#xff1a;深入解析 Java Stream 设计&#xff1a;从四幕剧看流水线设计与执行机制-CSDN博客 PipelineHelper PipelineHelper 是 Java Stream API 内部一个至关重要的辅助类。正如其名&#xff0c;它是一个“管道助手”。可以把它想象成一个执行上下文…

《林景媚与命运回响》

《林景媚与命运回响》——当数据库开始回响命运&#xff0c;现实是否还能被信任&#xff1f;《林景媚数据库宇宙》系列第九部第一章&#xff1a;命运的涟漪公元 2089 年&#xff0c;数据库神谕的运行已趋于稳定&#xff0c;PostgreSQL Quantum Engine&#xff08;PQE&#xff0…

图神经网络入门:从GNN开始01图卷积网络GCN节点分类 02图注意力网络GAT 03图自编码器GAE 04 门控图神经网络GGNN

目录 一.基础1-[图论、图算法、CNN] 二.基础2-[图卷积神经网络GCN] 三.torch-geometric.nn工具包安装&#xff08;包含各种算法和数据集&#xff09; 四.GCN任务[节点分类-Cora 数据集] 五.图注意力网络&#xff08;GAT&#xff09; 六.图自编码器&#xff08;GAE&#x…

001 Configuration结构体构造

目录DramSys 代码分析1 Configuration结构体构造1.1 from_path 函数详解1.2 构造过程总结这种设计的好处2 Simulator 例化过程2.1 instantiateInitiatorDramSys 代码分析 1 Configuration结构体构造 好的&#xff0c;我们来详细解释一下 DRAMSysConfiguration.cpp 文件中 fro…

以太坊十年:智能合约与去中心化的崛起

以太坊10周年&#xff0c;敬开发者&#xff0c;敬构建者&#xff0c;敬还在链上的我们 以太坊即将迎来十周年纪念,作为一名在这个生态中深耕了8到9年的见证者&#xff0c;我亲历了它从一纸白皮书的构想到成长为全球领先去中心化平台的全过程。这十年间&#xff0c;以太坊经历了…

kafka 3.9.1版本: kraft + sasl+ standlone 模式完整可行安装步骤

Kafka 3.9.1 Kraft 单机模式安装 安装 OpenJDK 11 CentOS/RHEL yum install -y java-11-openjdk-develUbuntu/Debian apt install -y openjdk-11-jdk下载安装包 wget https://mirrors.aliyun.com/apache/kafka/3.9.1/kafka_2.12-3.9.1.tgz tar -zxvf kafka_2.12-3.9.1.tgz -C /…

Gitee DevOps平台深度评测:本土化优势与功能特性全面解析

Gitee DevOps平台深度评测&#xff1a;本土化优势与功能特性全面解析 在数字化转型浪潮下&#xff0c;企业软件开发流程的自动化与协作效率成为核心竞争力。作为国内领先的代码托管与DevOps平台&#xff0c;Gitee&#xff08;码云&#xff09;凭借其本土化服务与全流程支持能力…

从零开始本地化部署Dify:开源大模型应用平台搭建全指南

在AI应用开发的浪潮中&#xff0c;Dify作为一款开源的大语言模型(LLM)应用开发平台&#xff0c;正逐渐成为开发者和企业的首选工具。它巧妙地融合了后端即服务&#xff08;BaaS&#xff09;和LLMOps的理念&#xff0c;让开发者能够快速搭建生产级的生成式AI应用。无论是构建智能…

Qt 多媒体开发:音频与视频处理

Qt 多媒体模块提供了一套完整的 API&#xff0c;用于开发音频和视频处理应用。从简单的媒体播放到复杂的音视频编辑&#xff0c;Qt 都提供了相应的工具和组件。本文将从基础到高级全面解析 Qt 多媒体开发。 一、Qt 多媒体模块概述 1. 主要组件 Qt 多媒体模块包含以下核心组件&a…

Mac 专业图像处理 Pixelmator Pro

原文地址&#xff1a;Pixelmator Pro Mac 专业图像处理 Pixelmator Pro&#xff0c;是一款非常强大、美观且易于使用的图像编辑器&#xff0c;专为 Mac 设计。 采用单窗口界面、基于机器学习的智能图像编辑、自动水平检测&#xff0c;智能快速选择及更好的修复工具等功能优点…

iptables和IPVS比较

iptables 和 IPVS (IP Virtual Server) 都是 Linux 系统上用于处理网络流量的强大工具&#xff0c;但它们的设计目标、工作原理和适用场景有显著区别&#xff1a; 核心区别&#xff1a;主要目的&#xff1a; iptables&#xff1a; 核心是一个包过滤防火墙和网络地址转换工具。它…

语音识别指标计算 WER

目录 CER&#xff08;Character Error Rate&#xff09; WER Word Error Rate&#xff08;词错误率&#xff09; &#x1f9ee; WER 计算方式 &#x1f4cc; 示例 ✅ 理解要点 CER&#xff08;Character Error Rate&#xff09; 语音识别中的 CER&#xff08;Character …

【前端基础篇】JavaScript之jQuery介绍

文章目录前言JQuery基本介绍和使用方法引入依赖jQuery语法jQuery选择器jQuery事件操作元素获取/设置元素内容获取/设置元素属性获取/返回css属性添加元素删除元素总结&#xff1a;常用的jQuery方法 - 详细解释与示例事件处理拓展 - 详细解释与示例其他拓展内容前言 在阅读过程…

Vue入门:vue项目的创建和基本概念

一、vue的基本简介1. 什么是vue?Vue (发音为 /vjuː/&#xff0c;类似 view) 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建&#xff0c;并提供了一套声明式的、组件化的编程模型&#xff0c;帮助你高效地开发用户界面。无论是简单还是…

2.oracle保姆级安装教程

一、Oracle数据库安装1.找到软件的位置 D:\学习软件\Oracle&#xff0c;并解压软件2.双击setup.exe3.选择 是4.去掉勾&#xff0c;下一步5.创建和配置数据库&#xff0c;下一步6.桌面类&#xff0c;下一步7.配置安装路径地址和密码8.点完成9.正在安装&#xff0c;稍等片刻10.有…

STM32 软件模拟 I2C 读写 MPU6050--实现加速度与陀螺仪数据采集

演示视频&#xff1a; https://www.bilibili.com/video/BV1iCQRYXEBb/?share_sourcecopy_web&vd_source0e4269581b0bc60d57a80c9a27c98905一、前言在嵌入式开发中&#xff0c;MPU6050 六轴传感器因其集成加速度计和陀螺仪且成本低廉&#xff0c;广泛应用于平衡小车、飞控、…