【Android】三種彈窗 Fragment彈窗管理

在這里插入圖片描述

三三要成為安卓糕手

零:布局轉換

在很多工程當中用的都是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;廣泛應用于平衡小車、飛控、…