Для создания подменю в файле разметки меню определим внутренний элемент 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, порядок элемента в меню и заголовок элемента.