Работа с меню приложения
Главная » Работа с меню приложения

Поработаем сегодня над меню нашего приложения. Трудно представить приложение, в котором нету хоть какого то меню. Основы работы с ним довольно просты. Раньше меню вызывалось аппаратной кнопкой, сейчас эта кнопка стала сенсорной, но суть работы с ним не поменялась.

Создадим новый проект, выберем обычный Blank Activity. Уже сразу после создания нового проекта, оно снабжено стандартными методами работы с меню: onCreateOptionsMenu, который создает меню и onOptionsItemSelected, с помощью которого можно настраивать действия при выборе пунктов меню. Их можно увидеть, если зайти в MainActivity.java:

@Override
 public boolean onCreateOptionsMenu(Menu menu) {
 //Заполняем меню с соответствующего файла:
 getMenuInflater().inflate(R.menu.menu_main, menu);
 return true;
 }

 @Override
 public boolean onOptionsItemSelected(MenuItem item) {
 // Работаем с элементами action bar:
 int id = item.getItemId();


 if (id == R.id.action_settings) {
 return true;
 }

 return super.onOptionsItemSelected(item);
 }

Там же сразу можно увидеть и подсказки от Android Studio, которые описывают функционал этих методов. 

Само меню в приложениях на Android 4+ (до этого оно вызывалось просто соответствующей кнопкой устройства) выглядит, как 3 вертикальные точки на панели с названием приложения:

Меню

Если мы сейчас запустим приложение и нажмем на кнопку меню, то там будет находится всего одна строка с названием Settings. Давайте научимся редактировать и добавлять пункты к меню.

Чтобы это сделать, открываем файл menu_main.xml в папке menu приложения:

Сам файл выглядит так:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:app="http://schemas.android.com/apk/res-auto"
 xmlns:tools="http://schemas.android.com/tools" 
 tools:context=".MainActivity">
 
 <item 
 android:id="@+id/action_settings"
 android:title="@string/action_settings"
 android:orderInCategory="100" 
 app:showAsAction="never" />
 
</menu>

Как не сложно догадаться, тег item соответствует созданию одного пункта меню. Сейчас у нас создан один пункт меню и его имя задано не явно, а через ссылку на строковый ресурс:

android:title="@string/action_settings"

Команда orderInCategory назначает позицию элемента в списке по отношению к другим, showAsAction - настраиваем то, как будет отображаться элемент (never значит, что он будет отображаться только при раскрытом меню).

Перед тем, как добавить в меню свои пункты, давайте создадим для них названия в строковых ресурсах. Открываем файл strings.xml папки values и добавим туда несколько строк:

<string name="item1">Пункт 1</string>
<string name="item2">Пункт 2</string>
<string name="item3">Пункт 3</string>

Вернемся к файлу menu_main.xml и преобразим его. Удаляем пункт Settings и добавляем Пункт 1, Пункт 2 и Пункт 3:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:app="http://schemas.android.com/apk/res-auto"
 xmlns:tools="http://schemas.android.com/tools"
 tools:context=".MainActivity">

 <item
 android:id="@+id/i1"
 android:title="@string/item1"
 android:orderInCategory="100"
 app:showAsAction="never"/>
 <item
 android:id="@+id/i2"
 android:title="@string/item2"
 android:orderInCategory="100"
 app:showAsAction="never"/>
 <item
 android:id="@+id/i3"
 android:title="@string/item3"
 android:orderInCategory="100"
 app:showAsAction="never"/>

</menu>

Сейчас при попытке запустить приложение, нас ждет ошибка, чтобы ее устранить, идем в файл MainActivity.java и удаляем оттуда кусочек кода, касающийся уже удаленного пункта меню Settings:

 if (id == R.id.action_settings) {
 return true;
 }

Если сейчас запустить приложения и нажать по кнопке меню, то мы увидим, что оно теперь состоит из 3-х созданных нами пунктов.

На данный момент наши пункты, при нажатии на них, не выполняют никаких функций. Давайте их оживим. Для этого существует уже упомянутый в начале метод onOptionsItemSelected

Создадим в файле разметки интерфейса activity_main.xml элемент TextView:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
 android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
 android:paddingRight="@dimen/activity_horizontal_margin"
 android:paddingTop="@dimen/activity_vertical_margin"
 android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">
 
 <TextView
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:id="@+id/text"
 android:text="Выберите любой пункт меню"/>

</RelativeLayout>

Мы создали его для того, чтобы влиять на элемент TextView, делая выбор пунктов меню, чтобы как то визуализировать эти действия (то есть, для наглядности). 

Возвращаемся к файлу MainActivity.java и в методе обработки нажатий пунктов onOptionsItemSelected для первых 2-х пунктов настроим действие, которое будет применять элементу TextView различный текст, а 3-й пункт сделаем кнопкой выхода из программы.

В методе onOptionsItemSelected объявим объект TextView, привяжем его к созданному в activity_main.xml элементу TextView, и с помощью команды switch (id) настроим действие нажатия каждого пункта:

 @Override
 public boolean onOptionsItemSelected(MenuItem item) {
 int id = item.getItemId();

 TextView textView=(TextView)findViewById(R.id.text);

 switch (id) {
 case R.id.i1:
 textView.setText("Выбран Пункт 1");
 return true;
 case R.id.i2:
 textView.setText("Выбран Пункт 2");
 return true;
 case R.id.i3:
 finish();
 }
 return super.onOptionsItemSelected(item);
 }

Полный код MainActivity.java должен выглядеть так:

package home.study;

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;


public class MainActivity extends ActionBarActivity {

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


 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
 //Заполняем меню:
 getMenuInflater().inflate(R.menu.menu_main, menu);
 return true;
 }

 @Override
 public boolean onOptionsItemSelected(MenuItem item) {
 int id = item.getItemId();

 TextView textView=(TextView)findViewById(R.id.text);

 switch (id) {
 case R.id.i1:
 textView.setText("Выбран Пункт 1");
 return true;
 case R.id.i2:
 textView.setText("Выбран Пункт 2");
 return true;
 case R.id.i3:
 finish();
 }
 return super.onOptionsItemSelected(item);
 }
}

Все готово, запускаем приложение и любуемся нашими послушными кнопочками:). 

Конечно, это далеко не предел возможностей работы с меню, но для начала то хватит. Удачи!

Категория: Уроки программирования | Просмотров: 1098 | Добавил: Oleg | Теги: нажатие по кнопкам в меню, редактирование меню, добавление строк в меню, щелчок, меню приложения | Рейтинг: 0.0/0
Всего комментариев: 0
avatar