Групи в меню та підменю

Створення підменю

Для створення підменю у файлі розмітки меню визначимо внутрішній елемент menu:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/action_settings"
        android:title="Налаштування">
        <menu>
            <item android:id="@+id/save_settings"
                android:title="Зберегти" />
            <item android:id="@+id/open_settings"
                android:title="Відкрити" />
        </menu>
 
    </item>
    <item
        android:id="@+id/action_move"
        android:title="Перехід">
        <menu>
            <item android:id="@+id/forward"
                android:title="Вперед" />
            <item android:id="@+id/back"
                android:title="Назад" />
        </menu>
 
    </item>
</menu>

Після натискання на меню відобразяться елементи верхнього рівня, після натискання на які ми можемо перейти до підменю:

Групи в меню

Використання елемента group дозволяє оформити елементи меню в групу:

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

    <group android:checkableBehavior="single">
        <item
            android:id="@+id/action_settings"
            android:title="Налаштування"
            android:checked="true" />
        <item android:id="@+id/save_settings"
            android:title="Зберегти" />
        <item android:id="@+id/open_settings"
            android:title="Відкрити"  />
    </group>
</menu>

У визначенні групи ми можемо встановити атрибут android:checkableBehavior. Цей атрибут може приймати наступні значення: single (для кожного елемента створюється радіокнопка), all (для кожного елемента створюється прапорчик) та none.

У цьому випадку для кожного елемента буде створюватися радіокнопка (візуально кружок). І для першого елемента встановлюється відмічена радіокнопка (android:checked="true").

У файлі розмітки інтерфейсу activity_main.xml також повинно бути визначено текстове поле:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <TextView
        android:id="@+id/selectedMenuItem"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="28sp"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

А в класі MainActivity визначимо виділення радіокнопки у вибраному пункті меню:

package com.example.menuapp;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

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

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main_menu, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        TextView headerView = findViewById(R.id.selectedMenuItem);
        switch(id){
            case R.id.action_settings :
                headerView.setText("Налаштування");
                return true;
            case R.id.open_settings:
                headerView.setText("Відкрити");
                return true;
            case R.id.save_settings:
                headerView.setText("Зберегти");
                return true;
        }
        return super.onOptionsItemSelected(item);
    }
}

Програмне створення груп в меню та підменю

Також групи та підменю можна створювати програмним способом. Тож змінімо код MainActivity:

package com.example.menuapp;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

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

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);

        menu.add(0        // Група
                ,1        // id
                ,0        // порядок
                ,"Створити");  // заголовок

        menu.add(0,2,1,"Відкрити");
        menu.add(0,3,2,"Зберегти");
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        TextView headerView = findViewById(R.id.selectedMenuItem);

        switch(id){
            case 1 :
                headerView.setText("Створити документ");
                return true;
            case 2:
                headerView.setText("Відкрити документ");
                return true;
            case 3:
                headerView.setText("Зберегти документ");
                return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

Використаний тут метод add() додає пункт у меню, приймаючи наступні параметри: номер групи, id, порядок елемента в меню та заголовок елемента.