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.

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);
}