Статьи

Контекстное меню Android Tutorial

Это продолжение учебника по меню опций, доступного ранее.
 
Напомним, что контекстное меню — это плавающий список пунктов меню, который появляется, когда пользователь касается и удерживает определенный элемент, отображаемый в виде, с которым связано меню.

Переходя к примеру, сначала я создаю ListView с отображаемыми именами перьев. Когда человек долго нажимает и удерживает одно из имен, появляется контекстное меню, как показано здесь:


И когда вы нажимаете на любое из контекстного меню, показанного выше, появляется экран:
 

Давайте перейдем к коду.

Во-первых, обыденный шаг создания ListView (вы можете увидеть учебник ListView для более подробного объяснения этого).  
Я создаю класс
ShowContextMenu,
расширяющий
ListActivity
. В его
методе OnCreate (…)
я связываю
массив Listview
с
ListAdapater,
как показано здесь:

открытый класс ShowContextMenu extends ListActivity {

     

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

setListAdapter(new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, getResources().getStringArray(R.array.names)));


}


Обратите внимание, что вместо жесткого кодирования элементов списка в виде строкового массива внутри класса, я следовал наилучшей практике  экстернализации строк в класс ресурсов strings.xml. Следовательно, я использую  getResources (). GetStringArray (R.array.names), чтобы получить массив имен перьев, которые я хочу отобразить в списке. Strings.xml файл в папке значение имеет эту запись:

<string-array name="names">
<item>MONT Blanc</item>
<item>Gucci</item>
<item>Parker</item>
<item>Sailor</item>
<item>Porsche Design</item>
<item>Rotring</item>
<item>Sheaffer</item>
<item>Waterman</item>
</string-array>


Как только этот
Listview
был создан, теперь мы хотим связать
ContextMenu
с каждой из строк в
элементе Listview
. То есть, если пользователь долго нажимал на один из пунктов, должно появиться меню. Для этого мы добавим также следующую строку в метод
onCreate (..)
.

registerForContextMenu (getListView ());

Но как нам создать
ContextMenu
? Всякий раз, когда происходит длительное нажатие,
вызывается
метод onCreateContextMenu (…) . Итак, нам нужно переопределить этот метод, как показано ниже:

    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.context_menu, menu);
}


 
И здесь, так же, как и в руководстве по меню параметров , я использую
MenuInflater
для создания контекстного меню, а не для того, чтобы делать это программно. Это, безусловно, лучшая практика разделения проблем. Представление и логика программирования хранятся отдельно, как и в программировании Android. Контекстное меню состоит из 4 пунктов —
Редактировать, Сохранить, Удалить, Просмотреть
. Итак, вот как это определено в
context_menu.xml
в
папке res / menu
:
 
<menu
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/edit"
android:title="@string/edit" />
<item android:id="@+id/save"
android:title="@string/save" />
<item android:id="@+id/delete"
android:title="@string/delete" />
<item android:id="@+id/view"
android:title="@string/view" />
</menu>

У меня есть
идентификатор
, связанный с каждым из пунктов меню, который однозначно определяет выбранный пункт меню. И у меня есть
связанная строка,
которая отображается в меню.

Теперь, когда контекстное меню создано, как обрабатывать, когда пункт меню нажимается? Для этого нам нужно переопределить метод
onContextItemSelected (…),
как показано ниже;

    public boolean onContextItemSelected(MenuItem item) {
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
String[] names = getResources().getStringArray(R.array.names);
switch(item.getItemId()) {
case R.id.edit:
Toast.makeText(this, "You have chosen the " + getResources().getString(R.string.edit) +
" context menu option for " + names[(int)info.id],
Toast.LENGTH_SHORT).show();
return true;
…………………..
default:
return super.onContextItemSelected(item);
}



Это метод обратного вызова, который вызывается при нажатии элемента контекстного меню. Обратный вызов получает ссылку на выбранный пункт меню в качестве элемента параметра.
 
Я использую метод
item.getItemId ()
для получения идентификатора элемента, по
которому щелкнули. Это тот же идентификатор,
который определен в
context_menu.xml
. Итак, основываясь на
идентификаторе
, я использовал оператор
switch
для перехода к соответствующему действию. Здесь действие состоит в том, чтобы просто отправить сообщение, в котором сообщается, какое контекстное меню было выбрано для какого элемента ListView. Как получить элемент ListView, по которому щелкнули?
 
Дополнительная информация о меню возвращается путем вызова
item.getMenuInfo ().
  Info.id будет идентификатором ListView. Я использую этот идентификатор, чтобы получить имя пера, как в
names [(
int
) info.id]
 
Вот и все. Вы хотите полный код? Вот.