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
new PopupMenu(Context, View anchor): Tạo PopupMenu gắn vào anchor ViewgetMenuInflater().inflate(R.menu.xxx, menu): Nạp menu từ XMLsetOnMenuItemClickListener: Xử lý click itemshow(): 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(); }