Это продолжение учебника по меню опций, доступного ранее.
Напомним, что контекстное меню — это плавающий список пунктов меню, который появляется, когда пользователь касается и удерживает определенный элемент, отображаемый в виде, с которым связано меню.
Переходя к примеру, сначала я создаю ListView с отображаемыми именами перьев. Когда человек долго нажимает и удерживает одно из имен, появляется контекстное меню, как показано здесь:
И когда вы нажимаете на любое из контекстного меню, показанного выше, появляется экран:
Давайте перейдем к коду.
Во-первых, обыденный шаг создания ListView (вы можете увидеть учебник ListView для более подробного объяснения этого).
Я создаю класс
ShowContextMenu,
расширяющий
ListActivity
. В его
методе OnCreate (…)
я связываю
массив Listview
с
ListAdapater,
как показано здесь:
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 (..)
.
Listview
был создан, теперь мы хотим связать
ContextMenu
с каждой из строк в
элементе Listview
. То есть, если пользователь долго нажимал на один из пунктов, должно появиться меню. Для этого мы добавим также следующую строку в метод
onCreate (..)
.
registerForContextMenu (getListView ());
Но как нам создать
ContextMenu
? Всякий раз, когда происходит длительное нажатие,
вызывается
метод onCreateContextMenu (…) . Итак, нам нужно переопределить этот метод, как показано ниже:
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
:
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 (…),
как показано ниже;
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.getItemId ()
для получения идентификатора элемента, по
которому щелкнули. Это тот же идентификатор,
который определен в
context_menu.xml
. Итак, основываясь на
идентификаторе
, я использовал оператор
switch
для перехода к соответствующему действию. Здесь действие состоит в том, чтобы просто отправить сообщение, в котором сообщается, какое контекстное меню было выбрано для какого элемента ListView. Как получить элемент ListView, по которому щелкнули?
Дополнительная информация о меню возвращается путем вызова
item.getMenuInfo ().
Info.id будет идентификатором ListView. Я использую этот идентификатор, чтобы получить имя пера, как в
names [(
int
) info.id]
item.getMenuInfo ().
Info.id будет идентификатором ListView. Я использую этот идентификатор, чтобы получить имя пера, как в
names [(
int
) info.id]
Вот и все. Вы хотите полный код? Вот.