android 支持自定義布局、線程安全、避免內存泄漏的 Toast 工具類

支持自定義布局:可以靈活地顯示自定義樣式的 Toast。

線程安全:確保在主線程中顯示 Toast,避免崩潰。

避免內存泄漏:使用 ApplicationContext 和取消機制,防止內存泄漏問題。

工具類:作為一個通用的工具類,方便在項目中復用。

ToastUtil

import android.content.Context;
import android.os.Handler;
import android.os.Looper;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;public class ToastUtil {private static Toast toast; // 全局Toast對象,避免重復創建private static final int DEFAULT_GRAVITY = Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL; // 默認顯示位置private static final int DEFAULT_Y_OFFSET = 100; // 默認Y軸偏移量private static final Handler mainHandler = new Handler(Looper.getMainLooper()); // 主線程Handler/*** 顯示短時間的Toast** @param context 上下文* @param message 要顯示的消息*/public static void showShort(Context context, String message) {showToast(context, message, Toast.LENGTH_SHORT, DEFAULT_GRAVITY, 0, DEFAULT_Y_OFFSET);}/*** 顯示長時間的Toast** @param context 上下文* @param message 要顯示的消息*/public static void showLong(Context context, String message) {showToast(context, message, Toast.LENGTH_LONG, DEFAULT_GRAVITY, 0, DEFAULT_Y_OFFSET);}/*** 顯示短時間的Toast(使用字符串資源ID)** @param context 上下文* @param resId   字符串資源ID*/public static void showShort(Context context, int resId) {showShort(context, context.getString(resId));}/*** 顯示長時間的Toast(使用字符串資源ID)** @param context 上下文* @param resId   字符串資源ID*/public static void showLong(Context context, int resId) {showLong(context, context.getString(resId));}/*** 顯示自定義位置的Toast** @param context  上下文* @param message  要顯示的消息* @param gravity  顯示位置(例如 Gravity.TOP)* @param xOffset  X軸偏移量* @param yOffset  Y軸偏移量*/public static void showAtPosition(Context context, String message, int gravity, int xOffset, int yOffset) {showToast(context, message, Toast.LENGTH_SHORT, gravity, xOffset, yOffset);}/*** 顯示自定義布局的Toast** @param context     上下文* @param layoutResId 自定義布局資源ID* @param message     要顯示的消息*/public static void showCustom(Context context, int layoutResId, String message) {runOnUiThread(() -> {if (toast != null) {toast.cancel(); // 取消之前的Toast}// 使用ApplicationContext,避免內存泄漏Context appContext = context.getApplicationContext();LayoutInflater inflater = (LayoutInflater) appContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);View layout = inflater.inflate(layoutResId, null);// 查找布局中的TextView(假設id為text)TextView textView = layout.findViewById(R.id.text);if (textView != null) {textView.setText(message);}toast = new Toast(appContext);toast.setDuration(Toast.LENGTH_SHORT);toast.setView(layout);toast.show();});}/*** 顯示自定義布局的Toast(支持自定義顯示時長)** @param context     上下文* @param layoutResId 自定義布局資源ID* @param message     要顯示的消息* @param duration    顯示時長(Toast.LENGTH_SHORT 或 Toast.LENGTH_LONG)*/public static void showCustom(Context context, int layoutResId, String message, int duration) {runOnUiThread(() -> {if (toast != null) {toast.cancel(); // 取消之前的Toast}// 使用ApplicationContext,避免內存泄漏Context appContext = context.getApplicationContext();LayoutInflater inflater = (LayoutInflater) appContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);View layout = inflater.inflate(layoutResId, null);// 查找布局中的TextView(假設id為text)TextView textView = layout.findViewById(R.id.text);if (textView != null) {textView.setText(message);}toast = new Toast(appContext);toast.setDuration(duration);toast.setView(layout);toast.show();});}/*** 核心方法:顯示Toast** @param context  上下文* @param message  要顯示的消息* @param duration 顯示時長(Toast.LENGTH_SHORT 或 Toast.LENGTH_LONG)* @param gravity  顯示位置* @param xOffset  X軸偏移量* @param yOffset  Y軸偏移量*/private static void showToast(Context context, String message, int duration, int gravity, int xOffset, int yOffset) {runOnUiThread(() -> {if (toast != null) {toast.cancel(); // 取消之前的Toast}// 使用ApplicationContext,避免內存泄漏Context appContext = context.getApplicationContext();toast = Toast.makeText(appContext, message, duration);toast.setGravity(gravity, xOffset, yOffset); // 設置顯示位置toast.show();});}/*** 取消Toast*/public static void cancelToast() {if (toast != null) {toast.cancel();toast = null; // 釋放引用}}/*** 確保在主線程中運行** @param runnable 需要執行的任務*/private static void runOnUiThread(Runnable runnable) {if (Looper.myLooper() == Looper.getMainLooper()) {runnable.run(); // 當前是主線程,直接運行} else {mainHandler.post(runnable); // 當前是子線程,切換到主線程運行}}
}

使用示例

  1. 顯示自定義布局的 Toast
ToastUtil.showCustom(MainActivity.this, R.layout.custom_toast, "這是一個自定義Toast");

在子線程中調用:

new Thread(() -> {// 在子線程中調用ToastUtil.showCustom(MainActivity.this, R.layout.custom_toast, "子線程中的自定義Toast");
}).start();

自定義布局示例:
假設 res/layout/custom_toast.xml 是一個自定義布局文件,例如:

<!-- res/layout/custom_toast.xml -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="wrap_content"android:layout_height="wrap_content"android:background="@drawable/toast_background"android:padding="16dp"android:orientation="horizontal"><ImageViewandroid:id="@+id/icon"android:layout_width="24dp"android:layout_height="24dp"android:src="@drawable/ic_toast_icon"android:layout_marginEnd="8dp"/><TextViewandroid:id="@+id/text"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textColor="@android:color/white"android:textSize="16sp"/>
</LinearLayout>

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/897277.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/897277.shtml
英文地址,請注明出處:http://en.pswp.cn/news/897277.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

嵌入式人工智能應用-第6章 人臉檢測

嵌入式人工智能應用 人臉檢測 嵌入式人工智能應用1 人臉檢測1.1 CNN 介紹1.2 人臉檢測原理1.3 MTCNN介紹1.4 NCNN介紹2 系統安裝2.1 安裝依賴庫NCNN2.2 運行對應的庫3 總結1 人臉檢測 1.1 CNN 介紹 卷積神經網絡。卷積是什么意思呢?從數學上說,卷積是一種運算。它是我們學習…

RocketMQ提供了哪些過濾機制?

前言 本篇文章比較簡單&#xff0c;分別介紹RocketMQ支持幾種過濾機制&#xff0c;其原理和使用。 RocketMQ 提供了多種消息過濾機制&#xff0c;幫根據業務需求高效篩選消息&#xff0c;可以減少不必要的消息傳輸和處理。以下是其核心過濾機制及使用場景&#xff1a; 1. Tag…

Redis數據結構深度解析:從String到Stream的奇幻之旅(一)

Redis系列文章 《半小時掌握Redis核心操作&#xff1a;從零開始的實戰指南》-CSDN博客 Redis數據結構深度解析&#xff1a;從String到Stream的奇幻之旅&#xff08;一&#xff09;-CSDN博客 Redis數據結構深度解析&#xff1a;從String到Stream的奇幻之旅&#xff08;二&…

【Java開發指南 | 第三十五篇】Maven + Tomcat Web應用程序搭建

讀者可訂閱專欄&#xff1a;Java開發指南 |【CSDN秋說】 文章目錄 前言Maven Tomcat Web應用程序搭建1、使用Maven構建新項目2、單擊項目&#xff0c;連續按兩次shift鍵&#xff0c;輸入"添加"&#xff0c;選擇"添加框架支持"3、選擇Java Web程序4、點擊&…

機器始終是一個機器:技術本質與哲學邊界

機器始終是一個機器&#xff1a;技術本質與哲學邊界 這句話揭示了人工智能發展中的核心矛盾——無論技術如何進步&#xff0c;機器的本質仍是基于規則與數據的計算系統。這種「機器性」既是其能力的源泉&#xff0c;也是其與生命體智能不可逾越的邊界的根源。以下從技術本質、…

JAVA編程【jvm垃圾回收的差異】

jvm垃圾回收的差異 JVM&#xff08;Java Virtual Machine&#xff09;的垃圾回收&#xff08;GC&#xff09;機制是自動管理內存的一種方式&#xff0c;能夠幫助開發者釋放不再使用的內存&#xff0c;避免內存泄漏和溢出等問題。不同的垃圾回收器&#xff08;GC&#xff09;有…

親測解決筆記本觸摸板使用不了Touchpad not working

這個問題可以通過FnFxx來解決&#xff0c;筆記本鍵盤上Fxx會有一個觸摸板圖標。如果不行應該玉藻設置中關了&#xff0c;打開即可。 解決辦法 在藍牙&#xff0c;觸摸板里打開即可。 Turn it on in settings。

RAG技術深度解析:從基礎Agent到復雜推理Deep Search的架構實踐

重磅推薦專欄: 《大模型AIGC》 《課程大綱》 《知識星球》 本專欄致力于探索和討論當今最前沿的技術趨勢和應用領域,包括但不限于ChatGPT和Stable Diffusion等。我們將深入研究大型模型的開發和應用,以及與之相關的人工智能生成內容(AIGC)技術。通過深入的技術解析和實踐經…

數據結構篇——串(String)

一、引入 在計算機中的處理的數據內容大致可分為以整形、浮點型等的數值處理和字符、字符串等的非數值處理。 今天我們主要學習的就是字符串數據。本章主要圍繞“串的定義、串的類型、串的結構及其運算”來進行串介紹與學習。 二、串的定義 2.1、串的基本定義 串&#xff08;s…

【智能體架構:Agent】LangChain智能體類型ReAct、Self-ASK的區別

1. 什么是智能體 將大語言模型作為一個推理引擎。給定一個任務&#xff0c; 智能體自動生成完成任務所需步驟&#xff0c; 執行相應動作&#xff08;例如選擇并調用工具&#xff09;&#xff0c; 直到任務完成。 2. 先定義工具&#xff1a;Tools 可以是一個函數或三方 API也…

OmniParser技術分析(一)

1.引言 通過上篇文章介紹 OmniParser:下一代純視覺UI自動化測試先驅相信大家已經對OmniParser有初步了解&#xff0c;接下來詳細介紹下OmniParser使用了哪些技術模型實現了對UI純視覺的檢測和理解。 2.整體方案 通過閱讀OmniParser提供的運行Demo代碼知道&#xff0c;其實整…

設計心得——繼承和實例

一、繼承的應用場景 在上篇文章分析了繼承的應用&#xff0c;本文反過來講繼承和實例。可以理解對上文的繼承進行一下基礎知識的鋪墊&#xff0c;繼承的應用場景非常多&#xff0c;典型的應用場景包括&#xff1a; 1、單純屬性的繼承 這種繼承非常常見&#xff0c;在前面也舉過…

從連接到交互:SDN 架構下 OpenFlow 協議的流程與報文剖析

在SDN架構中&#xff0c;交換機與控制器之間的通信基于 OpenFlow協議&#xff0c;其設計目的是實現控制平面與數據平面的解耦。以下是 交換機連接控制器 和 數據包進入交換機觸發交互 的詳細流程及協議報文分析&#xff1a; 一、交換機連接控制器的流程&#xff08;初始化階段&…

opentitan riscv

OpenTitan?是一個開源的硅根信任&#xff08;Root of Trust, RoT&#xff09;項目&#xff0c;旨在使硅RoT的設計和實現更加透明、可信和安全&#xff0c;適用于企業、平臺提供商和芯片制造商。該項目由lowRISC CIC管理&#xff0c;作為一個協作項目&#xff0c;旨在生產高質量…

R語言使用scitable包交互效應深度挖掘一個陌生數據庫

很多新手剛才是總是覺得自己沒什么可以寫的&#xff0c;自己不知道選什么題材進行分析&#xff0c;使用scitable包后這個完全不用擔心&#xff0c;選題多到你只會擔心你寫不完&#xff0c;寫得不夠快。 今天演示一下使用scitable包深度挖掘一個陌生數據庫 先導入R包和數據 li…

電腦內存智能監控清理,優化性能的實用軟件

軟件介紹 Memory cleaner是一款內存清理軟件。功能很強&#xff0c;效果很不錯。 Memory cleaner會在內存用量超出80%時&#xff0c;自動執行“裁剪進程工作集”“清理系統緩存”以及“用全部可能的方法清理內存”等操作&#xff0c;以此來優化電腦性能。 同時&#xff0c;我…

C#控制臺應用程序學習——3.8

一、語言概述 1、平臺相關性 C# 主要運行在.NET 平臺上。.NET 提供了一個龐大的類庫&#xff0c;C# 程序可以方便地調用這些類庫來實現各種功能&#xff0c;如文件操作、數據庫訪問、網絡通信等。 2、語法風格 C# 的語法與 C、C 和 Java 有一定的相似性。例如&#xff0c;它使用…

鴻蒙HarmonyOS-Navagation基本用法

Navagation基本用法 Navigation組件是路由導航的根視圖容器&#xff0c;一般作為Page頁面的根容器使用&#xff0c;其內部默認包含了標題欄&#xff0c;內容欄和公工具欄&#xff0c;其中內容區默認首頁顯示導航內容&#xff08;Navigation的子組件&#xff09;或非首頁顯示&am…

初階數據結構(C語言實現)——4.1棧

目錄 1.棧1.1棧的概念及結構1.2 棧的實現1.1.0 棧的初始化1.1.1 銷毀1.1.2 入棧1.1.3 出棧1.1.4 獲取棧中有效元素個數1.1.5 檢測棧是否為空&#xff0c;如果為空返回非零結果&#xff0c;如果不為空返回01.1.6 獲取棧頂元素1.1.7 驗證 附錄 棧的C語言實現源碼.h文件.c文件test…

計算光學成像與光學計算概論

計算光學成像所涉及研究的內容非常廣泛&#xff0c;雖然計算光學成像的研究內容是發散的&#xff0c;但目的都是一致的&#xff1a;如何讓相機記錄到客觀實物更豐富的信息&#xff0c;延伸并擴展人眼的視覺感知。總的來說&#xff0c;計算光學成像現階段已經取得了很多令人振奮…