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

Cách ẩn/hiện Menu Item trên ActionBar/Toolbar Android

Giới thiệu

Ví dụ này minh họa cách ẩn/hiện (show/hide) một menu item trên ActionBar/Toolbar động theo sự kiện (ví dụ: ToggleButton) bằng MenuItem.setVisible() và setEnabled().

Các bước thực hiện

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

Android Studio → File → New Project → Empty Activity.

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:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center"
    tools:context=".MainActivity">

    <ToggleButton
        android:id="@+id/btnMenuItem"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textOn="Hiện Menu Item"
        android:textOff="Ẩn Menu Item" />

</LinearLayout>

Bước 3: Tạo Menu Resource (res/menu/menuitem.xml)

Chuột phải res → New → Android Resource Directory → Type: menu → OK. Chuột phải thư mục menu → New → Menu Resource File → Name: menuitem.xml.

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:app="https://schemas.android.com/apk/res-auto">

    <item
        android:id="@+id/menu_action_share"
        android:icon="@drawable/ic_share_black_24dp"
        android:title="Chia sẻ"
        app:showAsAction="ifRoom" />

</menu>

Lưu ý: Cần có icon ic_share_black_24dp trong res/drawable (hoặc dùng icon hệ thống android:drawable/ic_menu_share).

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

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.CompoundButton;
import android.widget.ToggleButton;

public class MainActivity extends AppCompatActivity {

    ToggleButton toggleButton;
    Menu myMenu;

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

        toggleButton = findViewById(R.id.btnMenuItem);
        toggleButton.setOnCheckedChangeListener((buttonView, isChecked) -> {
            if (myMenu != null) {
                MenuItem item = myMenu.findItem(R.id.menu_action_share);
                item.setVisible(isChecked);
                item.setEnabled(isChecked);
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.menuitem, menu);
        myMenu = menu; // Lưu reference để dùng sau
        return true;
    }
}

Bước 5: Manifest (androidManifest.xml)

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
    package="app.com.sample">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <activity android:name=".MainActivity">
            <intent-filter>
                

Chạy ứng dụng

Kết nối thiết bị, nhấn Run. Bật/tắt ToggleButton → Icon "Chia sẻ" trên ActionBar ẩn/hiện tương ứng.

Cách ẩn/hiện Menu Item trên ActionBar/Toolbar Android Cách ẩn/hiện Menu Item trên ActionBar/Toolbar Android

Giải thích kỹ thuật

  • onCreateOptionsMenu(): Được gọi khi Activity tạo menu. Lưu Menu object vào field myMenu để truy cập sau.
  • menu.findItem(id): Tìm MenuItem theo ID.
  • setVisible(false): Ẩn hoàn toàn item (không chiếm chỗ).
  • setEnabled(false): Vô hiệu hóa (mờ đi, không click được) nhưng vẫn hiển thị.

Mở rộng & Best Practices

1. Sử dụng Toolbar (AppCompat) thay vì ActionBar cũ

// Trong onCreate
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

// Menu handling giống hệt ActionBar

2. Invalidating menu để cập nhật ngay lập tức

Nếu thay đổi menu dựa trên trạng thái dữ liệu (không phải UI event), gọi:

invalidateOptionsMenu(); // Gọi onCreateOptionsMenu() lại
// Hoặc API 26+:
supportInvalidateOptionsMenu();

3. MenuItemCompat (Support Library cũ) - Không cần nữa

Trước API 26 dùng MenuItemCompat.setVisible(). Gây dùng trực tiếp MenuItem.setVisible().

4. Dynamic Menu (Thêm/xóa item hoàn toàn)

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    menu.clear(); // Xóa tất cả
    if (showShare) {
        menu.add(Menu.NONE, R.id.menu_share, 1, "Share").setIcon(R.drawable.ic_share).setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
    }
    return super.onPrepareOptionsMenu(menu);
}