Программное создание и изменений меню опций (Options Menu)

| 19.08.2014

Мы уже рассматривали создание простейшего меню опций с использованием описания в xml. На этот раз мы рассмотрим программное создание и изменение этого меню.

Программное создание и изменений меню опций (Options Menu)

Создадим новый проект, в котором будем использовать:

strings.xml — строковые ресурсы
main.xml — описание базового меню из одного пункта
activity_main.xml — layout для Активити
MainActivity.java — класс Активити

Добавим строковые ресурсы res/values/strings.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="app_name">Options Menu</string>
    <string name="hello_world">Hello world!</string>
    <string name="action_settings">Settings</string>
    <string name="refresh">Refresh</string>
    <string name="load_data">Load Data</string>

</resources>

Структура изначального меню, которое мы затем будем менять динамически — res/menu/main.xml:

<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>

Добавьте значения отступов в res/values/dimens.xml

<resources>
    <!-- Default screen margins, per the Android Design guidelines. -->
    <dimen name="activity_horizontal_margin">16dp</dimen>
    <dimen name="activity_vertical_margin">16dp</dimen>
</resources>

Разметка layout-a res/layout/activity_main.xml:

<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:text="@string/hello_world"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</RelativeLayout>

Здесь RelativeLayout с одним TextView (для декора).

Ну и, наконец, код Активити — MainActivity.java:

package ru.androiddocs.optionsmenu;

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;


public class MainActivity extends ActionBarActivity {

    private static final String LOG_TAG = "my_tag";
    private static final int REFRESH_ID = 1;
    private static final int LOAD_DATA_ID = 2;

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


    @Override
    public boolean  onPrepareOptionsMenu(Menu menu) {
        Log.d(LOG_TAG, "onPrepareOptionsMenu");
        menu.removeItem(R.id.action_settings);

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

        menu.add(0, REFRESH_ID, 1, R.string.refresh);
        menu.add(0, LOAD_DATA_ID, 2, R.string.load_data);

        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.action_settings:
                return true;
            case 1:
                // refresh
                Log.d(LOG_TAG, "action: refresh");
                return true;
            case 2:
                // load data
                Log.d(LOG_TAG, "action: load data");
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }
}

Немного пояснений. Метод onCreateOptionsMenu() отрабатывается один раз при первом создании меню. Здесь мы программно добавляем два новых пункта (refresh и load data) методом add():

menu.add(0, REFRESH_ID, 1, R.string.refresh);

где в качестве параметров:

0 — это идентификатор группы (у нас для всех пунктов 0, т.е. по группам не разбиваем)
REFRESH_ID — id пункта (подставляем значение константы), который будем использовать при обработка нажатия
1 — порядковый номер в списке пунктов
R.string.refresh — строковое значение пункта (берем из ресурсов)

После того, как мы добавили наши пункты меню, добавляем еще и базовое меню из main.xml:

getMenuInflater().inflate(R.menu.main, menu);

Перед непосредственным показом меню вызывается метод onPrepareOptionsMenu(). Здесь (только в качестве примера) мы динамически меняем наше меню, удаляя пункт из main.xml:

menu.removeItem(R.id.action_settings);

В методе onOptionsItemSelected() мы определяем, какая опция была выбрана и выводим результат в логи.

Запускаем приложение и тестируем. При вызове меню опций будут показаны два пункта.

Программное создание и изменений меню опций (Options Menu)

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*