我正在基于谷歌提供的记事本应用程序构建一个简单的应用程序。我的第一步是尽可能将应用程序转换为使用 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) 结果菜单,Edit Note 和 Edit Title,由 onPrepareOptionsMenu() 在选择项目时生成,使用默认图标并且没有分配快捷方式。我可以通过 android:icon="" 将意图过滤器设置为具有不同的图标,但是分配字母和数字快捷方式没有这样的运气......我想指定这些,并希望可能有一种方法在 XML 中定义这些菜单项,并且当它们通过被意图过滤器识别而被应用程序引入时,还拉取 XML 并以某种方式膨胀/导入它。有什么建议或指示吗?
2)在onCreateOptionsMenu()中,为什么使用CATEGORY_ALTERNATIVE的addIntentOptions()调用没有将意图过滤器设置为category.ALTERNATIVE的活动添加到菜单中(在这种情况下不添加是正确的行为,只是想弄清楚如何在 onCreateOptionsMenu() 和 onPrepareOptionsMenu() 中对 addIntentOptions() 的几乎相同的调用导致不同的菜单)。