Я создаю простое приложение на основе приложения Google Note Note. Одним из моих первых шагов является преобразование приложения для использования меню XML, где это возможно. В основном упражнении, в списке заметок, я использую MenuInflater, чтобы показать опцию меню «Создать» по умолчанию:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
// menu initialization, use the baseline menu from XML
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.noteslist, menu);
// generate any additional actions that can be performed on the
// overall list. In a normal install, there are no additional
// actions found here, but this allows other applications to extend
// our menu with their own actions.
Intent intent = new Intent(null, getIntent().getData());
intent.addCategory(Intent.CATEGORY_ALTERNATIVE);
menu.addIntentOptions(Menu.CATEGORY_ALTERNATIVE, 0, 0, new ComponentName(this, NotesList.class), null, intent, 0, null);
return true;
}
С noteslist.xml:
<?xml version="1.0" encoding="utf-8"?>
<menu
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/compose_note"
android:icon="@drawable/ic_menu_compose"
android:title="@string/menu_compose"
android:alphabeticShortcut="c"
android:numericShortcut="3" />
</menu>
Все отлично работает. Теперь в соответствии с примером (и измененным, поскольку пример пытается добавить параметры намерения, когда в списке также не выбраны элементы), я хочу добавить некоторые дополнительные параметры, если в списке есть элементы, и один из них выбран :
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
super.onPrepareOptionsMenu(menu);
// determine if we have any items in the list via the ListAdapter
final boolean haveItems = (getListAdapter().getCount() > 0);
// do we have items?
if (haveItems) {
// there are items, check if any are selected
//Toast.makeText(getApplicationContext(), "position: " + getSelectedItemPosition(), Toast.LENGTH_SHORT).show();
if (getSelectedItemPosition() >= 0) {
// an item is selected, add the intents for one of our list items to the menu
Uri uri = ContentUris.withAppendedId(getIntent().getData(), getSelectedItemId());
// build menu on the fly... always starts with the EDIT action
Intent[] specifics = new Intent[1];
specifics[0] = new Intent(Intent.ACTION_EDIT, uri);
MenuItem[] items = new MenuItem[1];
// now add additional CATEGORY_ALTERNATIVE intent-based actions, (see the manifest)
Intent intent = new Intent(null, uri);
intent.addCategory(Intent.CATEGORY_ALTERNATIVE);
menu.addIntentOptions(Menu.CATEGORY_ALTERNATIVE, 0, 0, null, specifics, intent, 0, items);
// finally, add a shortcut to the edit menu item
if (items[0] != null) {
items[0].setShortcut('1', 'e');
}
}
} else {
menu.removeGroup(Menu.CATEGORY_ALTERNATIVE);
}
return true;
}
Наконец, ссылка на AndroidManifest.xml, без изменений по умолчанию для демонстрационного приложения:
http://developer.android.com/resources/samples/NotePad/AndroidManifest.html
Итак, у меня два вопроса:
1) Результирующие меню, «Редактировать заметку» и «Редактировать заголовок», созданные методом onPrepareOptionsMenu () при выборе элемента, используют значок по умолчанию и не имеют назначенных ярлыков. Я могу установить для фильтра намерений другой значок с помощью android: icon = "", но мне не повезло с назначением буквенных и числовых ярлыков ... Я хотел бы указать их, и надеялся, что может быть способ чтобы определить эти пункты меню в XML, и когда они должны быть введены приложением посредством идентификации с помощью фильтров намерений, также извлекают XML и каким-то образом раздувают / импортируют его. Любые предложения или указатели?
2) В onCreateOptionsMenu () почему вызов addIntentOptions () с CATEGORY_ALTERNATIVE НЕ добавляет в меню действия с фильтром намерений, установленным в category.ALTERNATIVE (в этом случае не добавляется правильное поведение, просто пытаюсь получить мой Обдумайте, как практически идентичные вызовы addIntentOptions () в onCreateOptionsMenu () и onPrepareOptionsMenu () приводят к появлению разных меню).