Android 實現底部彈窗

文章目錄

    • 在 Android 中創建優雅的底部選項彈窗 (BottomSheetDialogFragment) 📱
      • 第一步:設計底部彈窗的布局 🎨
      • 第二步:創建 `BottomSheetDialogFragment` 類 ??
      • 第三步:觸發并顯示底部彈窗 🚀

在 Android 中創建優雅的底部選項彈窗 (BottomSheetDialogFragment) 📱

在現代安卓應用中,底部彈窗 (BottomSheet) 是一種非常常見且用戶友好的交互方式,通常用于展示“更多選項”、“分享”或“操作列表”等場景。BottomSheetDialogFragment 是 Material Components 庫提供的一個標準實現,可以讓我們輕松創建這種效果。

這篇指南將帶你一步步創建一個功能完整的底部選項彈窗。

第一步:設計底部彈窗的布局 🎨

首先,我們需要為彈窗創建一個 XML 布局文件。這個文件定義了彈窗的外觀和內容。

我們將創建 bottom_sheet_layout.xml 文件,其中包含“舉報”和“分享”兩個選項。

res/layout/bottom_sheet_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"android:paddingVertical="8dp"><LinearLayoutandroid:id="@+id/option_report"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"android:gravity="center_vertical"android:clickable="true"android:focusable="true"android:background="?attr/selectableItemBackground"android:paddingHorizontal="16dp"android:minHeight="48dp"><ImageViewandroid:layout_width="24dp"android:layout_height="24dp"android:src="@drawable/ic_report"android:contentDescription="@string/report_description" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginStart="16dp"android:text="@string/report_text"android:textAppearance="?attr/textAppearanceBody1" /></LinearLayout><LinearLayoutandroid:id="@+id/option_share"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"android:gravity="center_vertical"android:clickable="true"android:focusable="true"android:background="?attr/selectableItemBackground"android:paddingHorizontal="16dp"android:minHeight="48dp"><ImageViewandroid:layout_width="24dp"android:layout_height="24dp"android:src="@drawable/ic_share"android:contentDescription="@string/share_description" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginStart="16dp"android:text="@string/share_text"android:textAppearance="?attr/textAppearanceBody1" /></LinearLayout></LinearLayout>

? 優化點說明:

  • android:paddingVertical: 使用 paddingVerticalpaddingHorizontal 替代 paddingTop/BottompaddingStart/End,使代碼更簡潔。
  • ?attr/selectableItemBackground: 這是一個非常實用的屬性,它能為列表項提供一個標準的、帶波紋效果的點擊反饋,增強用戶體驗。
  • 字符串資源: 建議將所有硬編碼的文本(如 “舉報”)和內容描述提取到 strings.xml 文件中,便于國際化和維護。

第二步:創建 BottomSheetDialogFragment 類 ??

接下來,我們創建一個繼承自 BottomSheetDialogFragment 的 Java 類。這個類負責將上一步創建的布局加載到彈窗中,并處理其內部的交互邏輯。

MoreOptionsBottomSheetDialogFragment.java

/** Copyright (c) 2025 Yan Zhizhong* All rights reserved.*/package top.mryan2005.CantoneseLanguageDictionary.App;import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.google.android.material.bottomsheet.BottomSheetDialogFragment;public class MoreOptionsBottomSheetDialogFragment extends BottomSheetDialogFragment {@Nullable@Overridepublic View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {// 加載布局文件return inflater.inflate(R.layout.bottom_sheet_layout, container, false);}@Overridepublic void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {super.onViewCreated(view, savedInstanceState);// 獲取布局中的視圖LinearLayout reportOption = view.findViewById(R.id.option_report);LinearLayout shareOption = view.findViewById(R.id.option_share);// 為“舉報”選項設置點擊事件reportOption.setOnClickListener(v -> {// 在這里處理舉報邏輯Toast.makeText(getContext(), "已舉報", Toast.LENGTH_SHORT).show();dismiss(); // 點擊后關閉彈窗});// 為“分享”選項設置點擊事件shareOption.setOnClickListener(v -> {// 在這里處理分享邏輯Toast.makeText(getContext(), "分享...", Toast.LENGTH_SHORT).show();dismiss(); // 點擊后關閉彈窗});}
}

? 優化點說明:

  • onViewCreated(): 這是處理 Fragment 視圖中控件的最佳位置。在 onCreateView() 返回視圖后,系統會立即調用此方法。
  • 事件處理: 我們在這里為“舉報”和“分享”選項添加了點擊監聽器。當用戶點擊某個選項時,可以執行相應的操作(例如彈出一個 Toast 提示),并通過調用 dismiss() 方法來關閉底部彈窗。

第三步:觸發并顯示底部彈窗 🚀

最后一步是在你的 ActivityFragment 中,通過點擊一個按鈕或其他交互來顯示我們剛剛創建的底部彈窗。

假設你有一個名為 moreButton 的按鈕,可以這樣設置它的點擊事件:

// 在你的 Activity 或 Fragment 中
moreButton.setOnClickListener(v -> {MoreOptionsBottomSheetDialogFragment bottomSheet = new MoreOptionsBottomSheetDialogFragment();bottomSheet.show(getSupportFragmentManager(), "MoreOptionsBottomSheetDialogFragmentTag");
});

? 代碼說明:

  • getSupportFragmentManager(): 獲取用于管理 Fragment 的 FragmentManager 實例。
  • bottomSheet.show(...): 這個方法會負責將 BottomSheetDialogFragment 添加到屏幕上并以動畫形式滑出。
  • Tag: 第二個參數是一個唯一的字符串標簽(Tag),用于在需要時通過 FragmentManager 找到這個 Fragment 實例。

通過以上三個步驟,你就成功地在你的應用中集成了一個美觀且功能完備的底部選項彈窗!請添加圖片描述

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

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

相關文章

LAN8720 寄存器概覽和STM32 HAL庫讀寫測試

目錄 寄存器0x00:Basic Control Register&#xff08;BCR&#xff09;0x01:Basic Status Register&#xff08;BSR&#xff09; 連接測試寄存器讀寫測試 補充 寄存器 // 0x00:Basic Control Register&#xff08;BCR&#xff09; BIT15:Soft Reset 寫1復位&#xff0c;寫1之…

滲透測試深度分析:空密碼Administrator賬戶引發的安全風暴

滲透測試深度分析&#xff1a;空密碼Administrator賬戶引發的安全風暴0x01 測試背景 在內網滲透測試中&#xff0c;對Windows主機 192.168.1.98 使用 enum4linux 進行枚舉&#xff1a; enum4linux -u Administrator -p -a 192.168.1.98關鍵發現&#xff1a;Administrator賬戶空…

OpenCV CUDA模塊設備層-----高效地計算兩個 uint 類型值的帶權重平均值

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 OpenCV 的 CUDA 模塊&#xff08;cudev&#xff09; 中的一個設備端內聯函數&#xff0c;用于高效地計算兩個 uint 類型值的帶權重平均值。 該函…

[學習記錄]Unity毛發渲染[URP]-Shell基礎版

毛發&#xff0c;無論是人類的頭發、動物的皮毛&#xff0c;還是奇幻生物的絨毛&#xff0c;都是構成生命感和真實感不可或缺的元素。它對光線的獨特散射、吸收和反射&#xff0c;賦予了物體柔軟、蓬松、有生命力的質感。它不僅僅是讓角色看起來更“毛茸茸”那么簡單&#xff0…

數字孿生技術引領UI前端設計潮流:增強現實(AR)的集成應用

hello寶子們...我們是艾斯視覺擅長ui設計、前端開發、數字孿生、大數據、三維建模、三維動畫10年經驗!希望我的分享能幫助到您!如需幫助可以評論關注私信我們一起探討!致敬感謝感恩!一、引言&#xff1a;AR 與數字孿生融合的設計革新浪潮在體驗經濟與技術融合的雙重驅動下&…

碰一碰發視頻源碼搭建與定制化開發:支持OEM

在近場通信&#xff08;NFC&#xff09;技術與移動終端深度融合的背景下&#xff0c;“碰一碰發視頻” 功能憑借便捷的交互體驗&#xff0c;在商業推廣、信息傳遞等場景中快速落地。不同于標準化解決方案的黑盒模式&#xff0c;基于源碼的定制化開發能從底層優化傳輸效率、提升…

Ubuntu 24.04 安裝配置 Redis 7.0 開機自啟

下載源碼 wget https://download.redis.io/releases/redis-7.0.12.tar.gz安裝依賴 & 準備環境 sudo apt update && sudo apt upgrade -y sudo apt install -y build-essential tcl curl解壓 tar xzf redis-7.0.12.tar.gz編譯安裝 cd redis-7.0.12 make -j$(nproc) …

【Linux 系統】基礎IO——Linux中對文件的理解

13.基礎IO(1) 文章目錄13.基礎IO(1)文件的基本概念&#xff1a;內容與屬性文件的打開機制&#xff1a;fopen 和 open被打開的文件與磁盤文件的區別文件的內核數據結構文件與進程的交互方式標準輸入/輸出/錯誤與文件流系統調用與文件描述符文件打開模式&#xff08;r/w/a/a&…

Go調度器的搶占機制:從協作式到異步搶占的演進之路|Go語言進階(7)

想象一下這樣的場景&#xff1a;你在餐廳排隊等位&#xff0c;前面有個人點了餐卻一直霸占著座位玩手機&#xff0c;后面的人只能干等著。這就是Go早期版本面臨的問題——一個goroutine如果不主動讓出CPU&#xff0c;其他goroutine就只能餓著。 今天我們來聊聊Go調度器是如何解…

開源模型應用落地-讓AI更懂你的每一次交互-Mem0集成Qdrant、Neo4j與Streamlit的創新實踐(四)

一、前言 在人工智能迅速發展的今天,如何讓AI系統更懂“你”?答案或許藏在個性化的記憶管理之中。Mem0作為一個開源的記憶管理系統,正致力于為AI賦予長期記憶與個性化服務能力。通過結合高性能向量數據庫Qdrant、圖數據庫Neo4j的強大關系分析能力以及Streamlit的高效可視化交…

基于微信小程序的校園二手交易平臺、微信小程序校園二手商城源代碼+數據庫+使用說明,layui+微信小程序+Spring Boot

school-market 介紹 基于微信小程序的校園二手交易平臺 功能結構圖 軟件架構 系統分為三個端&#xff0c;分別是客戶端、管理端、服務端&#xff1b; 客戶端&#xff1a;使用原生微信小程序實現 管理端&#xff1a;使用Layui實現 服務端&#xff1a;使用Java SpringBoot…

IDEA與Gradle構建沖突,導致java重復類的解決方案

項目構建總是報錯&#xff1a;錯誤提示1&#xff1a;java:重復類或錯誤提示2&#xff1a;Internal error in the mapping processor: java.lang.RuntimeException: javax.annotation.processing.FilerException: Attempt to recreate a file排查發現build/generated/sources/an…

如何調節筆記本電腦亮度?其實有很多種方式可以調整亮度

長時間面對屏幕工作、學習或娛樂&#xff0c;很多人會感到眼睛干澀、疲勞&#xff0c;甚至出現視力下降等問題。其實&#xff0c;這些問題的背后&#xff0c;往往隱藏著一個看似簡單卻極易被忽視的設置—屏幕亮度。 合適的屏幕亮度不僅能提升視覺體驗&#xff0c;還能有效緩解…

國際數字影像產業園創作空間升級 打造更優質營商環境

國際數字影像產業園創作空間升級后表現顯著&#xff0c;聚焦設施數字化與用戶體驗優化。整體提升了創意生態系統的競爭力&#xff0c;有效吸引全球企業。 升級核心改進 基礎設施現代化&#xff1a;引入智能硬件如5G網絡和云渲染設備&#xff0c;支持高清影像處理&#xff0c;…

淺談 webshell 構造之如何獲取惡意函數

前言這篇文章主要是總結一下自己學習過的如何獲取惡意函數的篇章&#xff0c;重點是在如何獲取惡意函數get_defined_functions(PHP 4 > 4.0.4, PHP 5, PHP 7, PHP 8)get_defined_functions — 返回所有已定義函數的數組我們主要是可以通過這個獲取危險的函數比如比如當然還有…

Python 單例模式與魔法方法:深度解析與實踐應用

在 Python 編程領域,設計模式解決常見問題的通用方案,而魔法方法則是 Python 語言賦予類強大功能的特殊接口。單例模式和魔法方法看似獨立,實則緊密關聯,魔法方法常被用于實現單例模式。深入理解并熟練運用它們,能夠幫助開發者編寫出結構清晰、高效且具有高復用性的代碼。…

pybind11 導出 C++ map 在 Python 層 get 訪問慢的優化方案

pybind11 導出 C map 在 Python 層 get 訪問慢的優化方案 問題描述 通過 pybind11 導出 C 的 std::map 或 std::unordered_map&#xff0c;在 Python 代碼中頻繁使用 get 方法訪問 value 時&#xff0c;性能非常低下。其主要原因是&#xff1a; pybind11 的 map 綁定會導致每次…

RTC實時時鐘DS1339U-33國產替代FRTC1339M

FRTC1339M是一款實時時鐘&#xff08;RTC&#xff09;芯片&#xff0c;由NYFEA徠飛公司制造。 FRTC13399M串行實時時鐘是一種低功耗的時鐘日期設備&#xff0c;具有兩個可編程的每日時間警報和一個可編程的方波輸出。通過2線雙向總線進行串行地址和數據傳輸。時鐘/日期提供秒、…

網絡常用端口號歸納

ICMP端口號&#xff1a;1IGMP端口號&#xff1a;2TCP端口號&#xff1a;6UDP端口號&#xff1a;17FTP端口號&#xff1a;20(控制信息傳輸)、21&#xff08;數據傳輸&#xff09;SSH端口號&#xff1a;22Telnet端口號&#xff1a;23SMTP端口號&#xff1a;25IPV6端口號&#xff…

Agent learn

1.人物設定&#xff1a; 1.1塑造智能體的思維能力與問題拆解與拆解分析能力 1.2個性化&#xff1a;輸出預期輸出示例&#xff08;設定智能體的-》性格&#xff0c;語言風格&#xff09; 1.3插件&#xff0c;調用工具 1.4可設定結構化表達 1.5調優 1.6常見問題&#xff1a; …