Я создаю простое приложение, основанное на приложении Google Note Note. Одним из моих первых шагов является преобразование приложения для использования XML-меню, где это возможно. В основной деятельности, список заметок, я использую MenuInflater показать по умолчанию пункт меню «сочинить»:Настройка параметров меню при использовании menu.addIntentOptions()
@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 НЕ добавляет действия с фильтром намерений, установленным в категорию. ALTERNATIVE в меню (не добавляя правильное поведение в этом случае, просто пытайтесь получить моя голова вокруг того, как практически идентичные вызовы addIntentOptions() в onCreateOptionsMenu() и onPrepareOptionsMenu() приводят к различным меню).
@pmmenneg: FWIW, ' addIntentOptions() 'обычно не используется вне этого конкретного бита кода примера. – CommonsWare
@CommonsWare: Ах, спасибо, какой рекомендуемый способ добавить пункты меню, связанные с намерениями? –
@pmmenneg: Рекомендуемый способ - не добавлять пункты меню, связанные с 'Intents'. Google определил, что это приведет к загрязнению меню, поскольку третьи стороны добавляют произвольные «намерения», чтобы они могли появляться в меню других приложений, с или без веских причин быть там. – CommonsWare