0

我正在基于谷歌提供的记事本应用程序构建一个简单的应用程序。我的第一步是尽可能将应用程序转换为使用 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() 的几乎相同的调用导致不同的菜单)。

4

1 回答 1

0

为了解决这个问题,我将从上述评论中发布 CommonsWare 的解决方案,本质上,由于菜单污染,Android 开发已经不再使用 Intents 来生成菜单项,正如成员在此线程中所指出的那样安卓团队:

“......我们放弃了这种方法,因为管理任意数量的附加项目的 UI 是一项挑战......”

于 2011-09-17T22:29:22.217 回答