2011-01-08 2 views
0

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

+0

@pmmenneg: FWIW, ' addIntentOptions() 'обычно не используется вне этого конкретного бита кода примера. – CommonsWare

+0

@CommonsWare: Ах, спасибо, какой рекомендуемый способ добавить пункты меню, связанные с намерениями? –

+1

@pmmenneg: Рекомендуемый способ - не добавлять пункты меню, связанные с 'Intents'. Google определил, что это приведет к загрязнению меню, поскольку третьи стороны добавляют произвольные «намерения», чтобы они могли появляться в меню других приложений, с или без веских причин быть там. – CommonsWare

ответ

0

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

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

Смежные вопросы