Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Android

Ví dụ Popup Menu trong Android

Giới thiệu

PopupMenu hiển thị menu ngữ cảnh (contextual menu) gắn vào một View (thường là Button), xuất hiện ở trên hoặc dưới View tùy không gian màn hình.

Bước 1: Tạo dự án mới

Android Studio → File → New Project.

Bước 2: Giao diện (res/layout/activity_main.xml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://schemas.android.com/tools"
    android:id="@+id/rootview"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="#C1C1C1"
    android:gravity="center_horizontal"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/popup"
        android:text="Menu"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

Bước 3: Menu XML (res/menu/popup_menu_example.xml)

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="https://schemas.android.com/apk/res/android">
    <item android:id="@+id/android" android:title="Android" />
    <item android:id="@+id/java" android:title="JAVA" />
    <item android:id="@+id/kotlin" android:title="Kotlin" />
</menu>

Bước 4: Logic PopupMenu (src/MainActivity.java)

package com.example.andy.myapplication;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.PopupMenu;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    Button popupButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        popupButton = findViewById(R.id.popup);
        popupButton.setOnClickListener(v -> showPopupMenu());
    }

    private void showPopupMenu() {
        PopupMenu popup = new PopupMenu(this, popupButton);
        popup.getMenuInflater().inflate(R.menu.popup_menu_example, popup.getMenu());

        popup.setOnMenuItemClickListener(item -> {
            Toast.makeText(MainActivity.this, item.getTitle(), Toast.LENGTH_SHORT).show();
            return true;
        });

        popup.show();
    }
}

Giải thích các bước

  1. new PopupMenu(Context, View anchor): Tạo PopupMenu gắn vào anchor View
  2. getMenuInflater().inflate(R.menu.xxx, menu): Nạp menu từ XML
  3. setOnMenuItemClickListener: Xử lý click item
  4. show(): Hiển thị popup

Chạy ứng dụng

Chạy app → Nhấn Button "Menu" → PopupMenu hiện ra (dưới Button do không gian trên không đủ). Chọn item → Toast hiển thị tên item.

Mẹo: PopupMenu với Icon

<item
    android:id="@+id/android"
    android:title="Android"
    android:icon="@drawable/ic_android" />

Icon chỉ hiển thị trên một số thiết bị/version. Để đảm bảo hiện icon, dùng reflection:

try {
    Field[] fields = popup.getClass().getDeclaredFields();
    for (Field field : fields) {
        if ("mPopup".equals(field.getName())) {
            field.setAccessible(true);
            Object menuPopupHelper = field.get(popup);
            Class classPopupHelper = Class.forName(menuPopupHelper.getClass().getName());
            Method setForceIcons = classPopupHelper.getMethod("setForceShowIcon", boolean.class);
            setForceIcons.invoke(menuPopupHelper, true);
            break;
        }
    }
} catch (Exception e) { e.printStackTrace(); }