Контекстное меню и подменю
Кроме стандартного меню в Android используется также контекстное меню, вызываемое при нажатии на объект в течение двух секунд (событие long-press). В отличие от обычного меню, в контекстном меню не поддерживаются значки и быстрые клавиши.
Программное создание контекстного меню
Для создания контекстного меню используется метод обратного вызова onCreateContextMenu(). В данный метод можно добавлять пункты меню при помощи методов add(). C помощью метода onContextItemSelected() можно обрабатывать выбор пункта. Но сначала надо зарегистрировать контекстное меню для нужного объекта, например, для TextView
public static final int IDM_OPEN = 101;
public static final int IDM_SAVE = 102;
final TextView textview = (TextView)findViewById(R.id.textView);
registerForContextMenu(textview);
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo)
{
super.onCreateContextMenu(menu, v, menuInfo);
menu.add(Menu.NONE, IDM_OPEN, Menu.NONE, "Открыть");
menu.add(Menu.NONE, IDM_SAVE, Menu.NONE, "Сохранить");
}
Если запустить проект, то уже сейчас можно увидеть контекстное меню, которое, правда, не будет реагировать на выбранные пункты меню. Допишем код.
@Override
public boolean onContextItemSelected(MenuItem item)
{
CharSequence message;
switch (item.getItemId())
{
case IDM_OPEN:
message = "Выбран пункт Открыть";
break;
case IDM_SAVE:
message = "Выбран пункт Сохранить";
break;
default:
return super.onContextItemSelected(item);
}
Toast toast = Toast.makeText(this, message, Toast.LENGTH_SHORT);
toast.setGravity(Gravity.CENTER, 0, 0);
toast.show();
return true;
}
Контекстное меню через ресурсы
Если вам нужно создать локализованный продукт, то программное добавление пунктов контекстного меню не подойдет. В таких случаях используется традиционный способ через файл ресурсов, рекомендованный Google.
Создадим XML-файл для меню, а также добавим на форму еще один TextView:
<?xml version="1.0" encoding="utf-8"?>
<menu
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/change_color"
android:title="@string/titleChangeColor" />
<item android:id="@+id/change_textsize"
android:title="@string/titleChangeTextSize" />
</menu>
registerForContextMenu(textview2);
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo)
{
super.onCreateContextMenu(menu, v, menuInfo);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.context_menu, menu);
}
@Override
public boolean onContextItemSelected(MenuItem item)
{
CharSequence message;
switch (item.getItemId())
{
case R.id.change_color:
message = "Меняем цвет";
textview2.setBackgroundColor(Color.RED);
break;
case R.id.change_textsize:
message = "Меняем размер шрифта";
textview2.setTextSize(18);
break;
default:
return super.onContextItemSelected(item);
}
Toast toast = Toast.makeText(this, message, Toast.LENGTH_SHORT);
toast.setGravity(Gravity.CENTER, 0, 0);
toast.show();
return true;
}
Мы используем похожий код, как и при создании стандартного меню. В результате получим контекстное меню, созданное из ресурсов. При выборе нужного пункта изменится либо цвет, либо размер шрифта в TextView.

