Настройка параметров меню при использовании menu.addIntentOptions () - PullRequest
0 голосов
/ 08 января 2011

Я создаю простое приложение на основе приложения 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 () приводят к появлению разных меню).

1 Ответ

0 голосов
/ 18 сентября 2011

Чтобы закрыть этот вопрос, я опубликую решение CommonsWare из приведенных выше комментариев, которое заключается в том, что по сути разработка Android отошла от использования Intents для создания пунктов меню из-за загрязнения меню, как указано на этом thread от члена команды Android:

"... Мы отошли от этого подхода, потому что управление пользовательским интерфейсом для произвольного числа дополнительных элементов является сложной задачей ..."

...