Главная » Работа с меню приложения | |
Поработаем сегодня над меню нашего приложения. Трудно представить приложение, в котором нету хоть какого то меню. Основы работы с ним довольно просты. Раньше меню вызывалось аппаратной кнопкой, сейчас эта кнопка стала сенсорной, но суть работы с ним не поменялась. Создадим новый проект, выберем обычный 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);
}
}
Все готово, запускаем приложение и любуемся нашими послушными кнопочками:). Конечно, это далеко не предел возможностей работы с меню, но для начала то хватит. Удачи! | |
|
Всего комментариев: 0 | |