Создание контекстного меню

| 12.02.2014

Контекстное меню появляется, когда мы долго жмем на каком-то пункте списка или любом элементе экрана (если, конечно, для этого элемента добавлен обработчик). В этом уроке мы создадим небольшое контекстное меню, которое будет появляться при «затяжном» нажатии на строку текста. В меню будет три опции выбора размера текста данного текста. После выбора какого-то пункта контекстное меню должно исчезнуть, а размеру текста должно присвоиться выбранное значение (22, 24 или 26).

Создаем проект (здесь я его назвал «First») и добавляем Layout типа RelativeLayout с одним текстовым TextView. Визуально это будет выглядеть так:

Создание контекстного меню для Андроида

А код данного Layout-а такой (файл activity_main.xml):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<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:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >
 
    <TextView
        android:id="@+id/text_field"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />
 
</RelativeLayout>

Как видите, вместо того, чтобы прописывать напрямую содержимое текста, мы используем строковый ресурс @string/hello_world. Как вы уже знаете, это — правильный подход.

Теперь рассмотрим код MainActivity.java, в котором, собственно, и разыгрывается все представление.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
package com.example.first;
 
import android.os.Bundle;
import android.app.Activity;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
 
public class MainActivity extends Activity {
 
    final int ITEM_SIZE_22 = 22;
    final int ITEM_SIZE_24 = 24;
    final int ITEM_SIZE_26 = 26;
    final int ITEM_CANCEL = 0;
 
    TextView txt;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        txt = (TextView) findViewById(R.id.text_field);
        registerForContextMenu(txt);
    }
 
    /**
     * Метод, вызывающийся при построении контекстного меню
     */
    @Override
    public void onCreateContextMenu(ContextMenu menu, View v,
            ContextMenuInfo menuInfo) {
        menu.setHeaderTitle("Выберите размер шрифта");
        menu.add(0, ITEM_SIZE_22, 0, "22");
        menu.add(0, ITEM_SIZE_24, 0, "24");
        menu.add(0, ITEM_SIZE_26, 0, "26");
        menu.add(0, ITEM_CANCEL, 0, "Cancel");
    }
 
    /**
     * Метод, осуществляющий обработку выбора пункта меню
     */
    @Override
    public boolean onContextItemSelected(MenuItem item) {
        switch (item.getItemId()) {	        
           case ITEM_SIZE_22:
               txt.setTextSize(22);
               txt.setText("Размер текста 22");
               break;
           case ITEM_SIZE_24:
               txt.setTextSize(24);
               txt.setText("Размер текста 24");
               break;
           case ITEM_SIZE_26:
               txt.setTextSize(26);
               txt.setText("Размер текста 26");
               break;
           case ITEM_CANCEL:
               closeContextMenu();
               break;
        }    	    	
 
        return true;    	
    }         
}

Пояснения. В самом начале класса мы объявили несколько констант, которые будут использоваться далее при создании пунктов контекстного меню (их значение будет использоваться как идентификатор отдельного пункта, чтобы мы могли понять, какая же опция выбрана).

В методе onCreate мы добавляем «регистрируем» для нашего текста контекстное меню (с помощью метода registerForContextMenu). Метод onCreateContextMenu всегда вызывается перед созданием контекстного меню, и здесь мы можем задать заголовок для него методом setHeaderTitle.

Создание контекстного меню

Метод onContextItemSelected вызывается при выборе какого-либо пункта (в качестве параметра передается сам пункт). С помощью конструкции switch — case мы проверяем, какой именно пункт был выбран и в зависимости от этого задаем размер для нашего текста (setText).

Также я добавил в меню кнопку Cancel, при нажатии на которую мы закрываем программно наше контекстное меню методом closeContextMenu().

Создание контекстного меню

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

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

*