【Android】Popup menu:彈出式菜單

Popup menu:彈出式菜單

PopupMenu,彈出菜單,一個模態形式展示的彈出風格的菜單,綁在在某個View上,一般出現在被綁定的View的下方(如果下方有空間)。

注意:彈出菜單是在API 11和更高版本上才有效的。

核心步驟:

(1)通過PopupMenu的構造函數實例化一個PopupMenu對象,需要傳遞一個當前上下文對象以及綁定的View。

(2)調用PopupMenu.setOnMenuItemClickListener()設置一個PopupMenu選項的選中事件。

(3)使用MenuInflater.inflate()方法加載一個XML文件到PopupMenu.getMenu()中。

(4)在需要的時候調用PopupMenu.show()方法顯示。

需求

點擊右上角的"…“,下拉出來"重啟"和"關閉”,點擊"重啟"或者"關閉",彈出一個彈窗確認是否需要重啟或者關閉設備;再點擊確定,就會重啟或者關機該設備;點擊取消,什么都不做,繼續保持再主launcher界面。

在這里插入圖片描述

AndroidMainfest.xml

添加重啟和關機的權限

<uses-permission android:name="android.permission.REBOOT" />
<uses-permission android:name="android.permission.SHUTDOWN" />

res/menu/main_menu.xml

創建main_menu.xml文件,menu中包含item(重啟和關機);

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"><itemandroid:id="@+id/action_restart"android:title="重啟"android:icon="@drawable/ic_restart"app:showAsAction="never"/><itemandroid:id="@+id/action_shutdown"android:title="關機"android:icon="@drawable/ic_power_off"app:showAsAction="never"/>
</menu>

重啟圖標:drawable/ic_restart.xml

在這里插入圖片描述

<vector xmlns:android="http://schemas.android.com/apk/res/android"android:width="24dp"android:height="24dp"android:viewportWidth="24"android:viewportHeight="24"android:tint="?attr/colorControlNormal"><pathandroid:fillColor="@android:color/white"android:pathData="M17.65,6.35C16.2,4.9 14.21,4 12,4c-4.42,0 -7.99,3.58 -7.99,8s3.57,8 7.99,8c3.73,0 6.84,-2.55 7.73,-6h-2.08c-0.82,2.33 -3.04,4 -5.65,4 -3.31,0 -6,-2.69 -6,-6s2.69,-6 6,-6c1.66,0 3.14,0.69 4.22,1.78L13,11h7V4l-2.35,2.35z"/>
</vector>

tips:去掉android:tint=“?attr/colorControlNormal"這個屬性可以讓圖標變成白色,也就是android:fillColor=”@android:color/white"這個屬性可以生效。

關機圖標:drawable/ic_power_off.xml

在這里插入圖片描述

<vector xmlns:android="http://schemas.android.com/apk/res/android"android:width="24dp"android:height="24dp"android:viewportWidth="24"android:viewportHeight="24"android:tint="?attr/colorControlNormal"><pathandroid:fillColor="@android:color/white"android:pathData="M13,3h-2v10h2V3zM16.59,6.59L18,8c3.87,3.87 3.9,10.24 0.1,14.14 -3.79,3.9 -10.23,3.87 -14.12,-0.08C-0.1,18.1 -0.07,11.66 3.82,7.77l1.41,-1.41L4.2,5.2C-0.18,9.58 -0.16,17.03 4.3,21.4c4.47,4.36 11.91,4.35 16.37,-0.02 4.46,-4.38 4.47,-11.83 0.02,-16.2L16.59,6.59z"/>
</vector>

tips:去掉android:tint=“?attr/colorControlNormal"這個屬性可以讓圖標變成白色,也就是android:fillColor=”@android:color/white"這個屬性可以生效。

三個點圖標:drawable/ic_more_vert.xml

在這里插入圖片描述

<vector xmlns:android="http://schemas.android.com/apk/res/android"android:width="24dp"android:height="24dp"android:viewportWidth="24"android:viewportHeight="24"><pathandroid:fillColor="@android:color/white"android:pathData="M12,8c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2 -2,0.9 -2,2 0.9,2 2,2zM12,10c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2zM12,16c-1.1,0 -2,0.9 -2,2s0.9,2 2,2 2,-0.9 2,-2 -0.9,-2 -2,-2z"/>
</vector>

activity_main.xml

此文件中指出三個點圖標的位置

<LinearLayout
...
...
<ImageViewandroid:id="@+id/menuButton"android:layout_width="40dp"android:layout_height="40dp"android:layout_marginStart="10dp"android:src="@drawable/ic_more_vert"android:padding="8dp"/>
</LinearLayout>	

android:src="@drawable/ic_more_vert"是三個點的圖標,將三個點的圖標顯示在LinearLayout中

MainActivity.java

  1. 在OnCreate方法中綁定三個點圖標的監聽事件

     protected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);setupClickListeners();}
    
  2. 監聽

    findViewById(R.id.menuButton).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {showPopupMenu(view);}});
    

R.id.menuButton是activity_main.xml中設置的id,setOnClickListener監聽點擊事件,當點擊時觸發showPopupMenu(view)

showPopupMenu方法

 private void showPopupMenu(View view) {// View當前PopupMenu顯示的相對View的位置PopupMenu popupMenu = new PopupMenu(this, view);// menu布局popupMenu.getMenuInflater().inflate(R.menu.main_menu, popupMenu.getMenu());// menu的item點擊事件popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {@Overridepublic boolean onMenuItemClick(MenuItem item) {if (item.getItemId() == R.id.action_restart) {showConfirmationDialog("重啟設備", "您確定要重啟設備嗎?", item.getItemId());} else if (item.getItemId() == R.id.action_shutdown) {showConfirmationDialog("關閉設備", "您確定要關閉設備嗎?", item.getItemId());}return false;}});
//        // PopupMenu關閉事件
//        popupMenu.setOnDismissListener(new PopupMenu.OnDismissListener() {
//            @Override
//            public void onDismiss(PopupMenu menu) {
//                Toast.makeText(getApplicationContext(), "關閉PopupMenu", Toast.LENGTH_SHORT).show();
//            }
//        });popupMenu.show();}

當點擊重啟或者關機按鈕時觸發事件

popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {@Overridepublic boolean onMenuItemClick(MenuItem item) {if (item.getItemId() == R.id.action_restart) {showConfirmationDialog("重啟設備", "您確定要重啟設備嗎?", item.getItemId());} else if (item.getItemId() == R.id.action_shutdown) {showConfirmationDialog("關閉設備", "您確定要關閉設備嗎?", item.getItemId());}return false;}});

showConfirmationDialog

private void showConfirmationDialog(String title, String message, int itemId) {new AlertDialog.Builder(this).setTitle(title).setMessage(message).setPositiveButton("確定", (dialog, which) -> {dialog.cancel();if (R.id.action_restart == itemId) {restartDevice();} else {shutdownDevice();}}).setNegativeButton("取消", (dialog, which) -> {}).setIcon(R.id.action_restart == itemId ? R.drawable.ic_restart : R.drawable.ic_power_off).show();
}

restartDevice

private void restartDevice() {try {// 需要系統應用簽名PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);pm.reboot(null);} catch (Exception e) {Toast.makeText(this, "重啟失敗: " + e.getMessage(), Toast.LENGTH_LONG).show();}
}

shutdownDevice

private void shutdownDevice() {try {PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);Method shutdownMethod = pm.getClass().getMethod("shutdown", boolean.class,String.class, boolean.class);shutdownMethod.invoke(pm, false, null, false); // 執行關機} catch (Exception e) {Toast.makeText(this, "關機失敗: " + e.getMessage(), Toast.LENGTH_LONG).show();}
}

最終效果

點擊三個點按鈕
在這里插入圖片描述
點擊重啟或者關機
在這里插入圖片描述
點擊取消回到主界面;
點擊確定重啟或者關機執行操作。

注意:普通權限可以執行重啟操作,但是不能執行關機操作,關機操作需要系統簽名獲取系統權限。

簽名總結

由于Android studio出現些許問題,未能實踐成功,但具體步驟如下:

  1. AndroidManifest.xml
    添加shareuid屬性

  2. build中選擇如下選項
    在這里插入圖片描述

  3. APK
    在這里插入圖片描述

  4. 首次創建選Create new…
    在這里插入圖片描述

  5. 創建一個.jks文件
    在這里插入圖片描述

  6. 點擊next

  7. 選擇release版本
    在這里插入圖片描述

  8. 點擊create生產簽名的apk

  9. 其他總結:
    在這里插入圖片描述
    鏈接:https://blog.csdn.net/Sunxiaolin2016/article/details/100891402

命令:jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore path/to/your/keystore.keystore your_app.apk your_alias_name

path/to/your/keystore.keystore 這個是本地的簽名文件路徑

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

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

相關文章

20250724-day21

Main Memory Database System&#xff08;MMDB&#xff09;&#xff1a;基于內存的數據庫系統 File Database&#xff08;FDB&#xff09;&#xff1a;基于文件的數據庫 Netware Database&#xff08;NDB&#xff09;&#xff1a;基于網絡的數據庫 daemon&#xff1a;守護進程 …

API是什么,如何保障API安全?

API&#xff08;應用程序編程接口&#xff09;是什么&#xff1f; API&#xff08;Application Programming Interface&#xff09;是不同軟件系統之間通信的“橋梁”。它定義了應用程序如何請求服務、交換數據或調用功能&#xff0c;無需了解底層實現細節。例如&#xff0c;當…

深度分析Java多線程機制

Java 多線程是掌握高性能、高響應性應用程序開發的關鍵&#xff0c;它涉及到語言特性、JVM 實現、操作系統交互以及并發編程的核心概念。 核心目標&#xff1a; 充分利用現代多核 CPU 的計算能力&#xff0c;提高程序吞吐量&#xff08;單位時間內處理的任務量&#xff09;和響…

Android熱修復實現方案深度分析

熱修復的核心目標是在**不發布新版本、不重新安裝、不重啟應用&#xff08;或僅輕量級重啟&#xff09;**的情況下&#xff0c;修復線上應用的 Bug 或進行小范圍的功能更新&#xff0c;極大地提升用戶體驗和問題響應速度。 一、熱修復的核心原理 無論哪種方案&#xff0c;其核心…

HTML前端顏色漸變動畫完整指南

漸變動畫已經成為現代網頁設計中不可或缺的元素&#xff0c;它們不僅能為網站增添視覺吸引力&#xff0c;還能顯著提升用戶體驗。通過巧妙運用CSS漸變動畫&#xff0c;開發者可以創造出令人印象深刻的動態背景效果&#xff0c;而無需依賴圖片或復雜的腳本。 漸變動畫的魅力所在…

b-up:Enzo_mi:Transformer DETR系列

1.視頻1&#xff1a;self-Attention&#xff5c;自注意力機制 &#xff5c;位置編碼 &#xff5c; 理論 代碼 注意&#xff1a; q-查詢; k-商品標簽&#xff1b; v-值&#xff08;具體商品&#xff09; * 不是指乘法&#xff0c;類似概念 a1:相似度&#xff1b; b1:總分 若想…

算法題(179):單調棧

審題&#xff1a; 本題是單調棧的模板題 補充&#xff1a;單調棧 單調棧中的數據始終保持單調遞增或單調遞減 使用情景&#xff1a;給定一個數組&#xff0c;要求尋找 1.某個數左側&#xff0c;離他最近且值大于他的數 2.某個數左側&#xff0c;離他最近且值小于他的數 3.某個數…

CF每日5題(1500-1600)

545C 貪心 1500 題意&#xff1a;給 n 棵樹在一維數軸上的坐標 xix_ixi? &#xff0c;以及它們的長度 hih_ihi?。現在要你砍倒這些樹&#xff0c;樹可以向左倒也可以向右倒&#xff0c;砍倒的樹不能重合、當然也不能覆蓋其他的樹原來的位置&#xff0c;現在求最大可以砍倒的…

HW藍隊:天眼告警監測分析之Web攻擊

Web攻擊 信息泄露 敏感數據包括但不限于:口令、密鑰、證書、會話標識、License、隱私數據(如短消息的內容)、授權憑據、個人數據(如姓名、住址、電話等)等&#xff0c;在程序文件、配置文件、日志文件、備份文件及數據庫中都有可能包含敏感數據 信息收集方法 漏洞分類 備份文…

大騰智能國產3D CAD軟件正式上架華為云云商店

深圳市大騰信息技術有限公司&#xff08;以下簡稱“大騰智能”&#xff09;與華為云達成深度合作&#xff0c;大騰智能CAD軟件及配套服務通過了華為云在功能適配、安全可用、穩定高效等方面的嚴選商品認證&#xff0c;已正式上架華為云云商店&#xff0c;成為華為云云商店的聯營…

論文復現-windows電腦在pycharm中運行.sh文件

1.更改終端路徑&#xff08;前提&#xff1a;已下載git bash&#xff09;2.授權打開pycharm終端&#xff0c;輸入 chmod x 文件名3.根據當前位置&#xff0c;運行.sh文件

開關電源安全保護電路:浪涌保護、過流保護、過壓保護

開關電源安全保護電路:浪涌保護、過流保護、過壓保護 引言 對于開關電源而言, 安全、可靠性歷來被視為重要的性能之一. 開關電源在電氣技術指標滿足電子設備正常使用要求的條件下, 還要滿足外界或自身電路或負載電路出現故障的情況下也能安全可靠地工作. 為此, 須有多種保護措…

C語言(十)

一、函數概述函數是面向過程編程思想的具體體現&#xff0c;主要作用&#xff1a;降低程序之間的耦合性提高代碼的復用性和可維護性一個完整的 C 程序由**一個或多個程序模塊&#xff08;源文件&#xff09;**組成。為便于開發與調試&#xff0c;通常會將代碼拆分為多個源文件&…

QT項目-仿QQ音樂的音樂播放器(第二節)

目錄 自定義控件&#xff1a; BtForm類中實現 BtForm上的動畫效果 自定義控件&#xff1a; 該控件實際由&#xff1a;圖?、?字、動畫三部分組成。圖?和?字分別?QLabel展?&#xff0c;動畫部分內部實際為4 個QLabel。 ① 將BtForm的geometry的寬度和?度修改為200*35。…

【世紀龍科技】數字課程資源-新能源汽車概論

一、課程介紹本課程為通過項目任務式教學&#xff0c;全面系統的講解了新能源汽車的基礎知識及相關技能&#xff0c;培養和提高學生的動手能力和理論知識的工程應用能力。以典型工作任務帶動知識與技能的學習&#xff0c;采用項目教學培養學生的崗位技能、學習能力和職業素養。…

iOS Core Data 本地數據庫 使用詳解:從模型關系到數據操作

一、引言&#xff1a;Core Data&#xff0c;在本地數據持久化中的地位在 iOS 開發中&#xff0c;本地數據存儲幾乎是每一個 App 都繞不開的問題。無論是緩存用戶信息、離線瀏覽內容&#xff0c;還是記錄用戶操作歷史&#xff0c;一個合適的數據持久化方案都能大大提升應用的體驗…

Java-79 深入淺出 RPC Dubbo 動態路由架構詳解:從規則設計到上線系統集成

點一下關注吧&#xff01;&#xff01;&#xff01;非常感謝&#xff01;&#xff01;持續更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持續更新中&#xff01;&#xff08;長期更新&#xff09; AI煉丹日志-30-新發布【1T 萬億】參數量大模型&#xff01;Kim…

Linux內核中動態內存分配函數解析

在C語言中&#xff0c;動態內存分配通常用于在運行時申請內存。在內核編程中&#xff0c;動態內存分配與用戶空間有所不同&#xff0c;因為內核需要更謹慎地處理內存&#xff0c;且不能使用用戶空間的庫&#xff08;如glibc&#xff09;。下面我們將詳細分析Linux內核中動態申請…

Next.js 中配置不同頁面布局方案

在 Next.js 應用中&#xff0c;你可以通過多種方式實現某些頁面全屏、某些頁面帶菜單/頁眉/頁腳的需求。以下是幾種實現方案&#xff1a; 方案一&#xff1a;使用多個布局組件 1. 創建不同的布局組件 // app/default-layout.tsx import Header from /components/header; import…

Spring Boot 使用外置 Servlet 容器:從配置到部署全指南

在 Spring Boot 開發中&#xff0c;我們通常使用嵌入式 Servlet 容器&#xff08;如 Tomcat&#xff09;&#xff0c;它能將應用打包成可執行 JAR&#xff0c;簡化部署流程。但在某些場景下&#xff08;如需要支持 JSP、復雜的容器定制或企業級部署規范&#xff09;&#xff0c…