Я хочу использовать addIntentOptions
для управления моими меню, когда это возможно. Это кажется самым чистым способом обеспечить их. Вместо того, чтобы подробно описывать действия, просто попросите меню со списком всех действий, которые доступны для моего элемента данных.
Итак, я пытаюсь собрать контекстное меню для ListView
. Работает отлично. Единственная проблема заключается в том, что у меня есть действие с двумя намерениями, которые используют мой тип данных, и отображается только первое.
Активность, о которой идет речь в AndroidManifest.xml
<activity android:name=".ui.MyActivity" android:label="The title">
<intent-filter android:label="First context label">
<action android:name="com.sample.action.FIRST_ACTION" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.ALTERNATIVE" />
<category android:name="android.intent.category.SELECTED_ALTERNATIVE" />
<data android:scheme="myscheme" />
</intent-filter>
<intent-filter android:label="Second context label">
<action android:name="com.sample.action.SECOND_ACTION" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.ALTERNATIVE" />
<category android:name="android.intent.category.SELECTED_ALTERNATIVE" />
<data android:scheme="myscheme" />
</intent-filter>
</activity>
Код для генерации контекстного меню
@Override
public void onCreateContextMenu(ContextMenu menu, View view,
ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, view, menuInfo);
Uri uri = Uri.fromParts("myscheme", getOpaqueUriOfSelectedItem(view), null)
Intent intent = new Intent(null, uri);
intent.addCategory(Intent.CATEGORY_SELECTED_ALTERNATIVE);
// Search and populate the menu with acceptable offering applications.
menu.addIntentOptions(
0, // Menu group to which new items will be added
0, // Unique item ID (none)
0, // Order for the items (none)
this.getComponentName(), // The current Activity name
null, // Specific items to place first (none)
intent, // Intent created above that describes our requirements
0, // Additional flags to control items (none)
null); // Array of MenuItems that correlate to specific items
// (none)
}
Как я уже сказал, первый смысл действия отображается в контекстном меню и ведет себя как сон. Но я не вижу второго намерения и не вижу веской причины, по которой оно не должно появиться. Если Android допускает только одно намерение с определенной категорией для каждого вида деятельности, это довольно слабое ограничение.
Я вижу, как я создаю фиктивную деятельность, которая просто переходит на MyActivity
. Но это неуклюже, и я хотел бы избежать этого, если это возможно.
РЕДАКТИРОВАТЬ : Если посмотреть на намерение, которое передается действию из контекстного меню (или, предположительно, меню параметров), даже если оба намерения отображаются в меню, действие не будет достаточно информации, чтобы сказать, какое намерение было выбрано, так как в действии getIntent().getAction()
пусто.
Это похоже на неудачный недосмотр. Конечно, не так уж необычно иметь деятельность, которая может потреблять тип данных более чем одним способом?
Если один из вас, добрые люди, не знает что-то, что я пропустил, похоже, что я собираюсь создавать свои фиктивные действия.
EDIT : Как и предполагал CommonsWare, я попытался использовать queryIntentActivityOptions
. Я добавил в этот код до menu.addIntentOptions
в моем коде выше.
PackageManager pm = getPackageManager();
final List<ResolveInfo> available =
pm.queryIntentActivityOptions(this.getComponentName(), null, intent, 0);
И в отладчике я обнаружил, что available
не включает оба доступных намерения для MyActivity
. Так что проблема не в addIntentOptions
, она глубже, в queryIntentActivityOptions
где-то.