Je veux utiliser addIntentOptions
pour piloter mes menus lorsque c'est possible. Cela semble le moyen le plus propre de les fournir. Plutôt que de détailler explicitement les activités, demandez simplement un menu répertoriant toutes les activités disponibles pour mon élément de données.Ajouter au menu en utilisant addIntentOptions fournissant plusieurs intentions pour une seule activité
Donc j'essaye de mettre en place un menu contextuel pour un ListView
. Cela fonctionne très bien. Le seul problème est que j'ai une activité qui a deux intentions qui consomment mon type de données, et seulement le premier apparaît.
L'activité en question 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>
Le code pour générer le menu contextuel
@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)
}
Comme je l'ai dit, la première intention de l'activité apparaît dans le menu contextuel et se comporte comme un rêve. Mais je ne vois pas la deuxième intention, et je ne vois pas pourquoi cela ne devrait pas se produire. Si Android n'autorise qu'une intention avec une catégorie particulière par activité, c'est une restriction assez boiteuse.
Je peux me voir construire une activité factice qui passe simplement à MyActivity
. Mais c'est maladroit et j'aimerais l'éviter si possible. En regardant l'intention qui est passée à une activité à partir d'un menu contextuel (ou d'un menu d'options, vraisemblablement), même si les deux intentions apparaissaient dans le menu, l'activité n'aurait pas assez d'informations pour Indique quelle intention a été sélectionnée, car dans l'activité getIntent().getAction()
est null.
Cela semble être un oubli malheureux. Il n'est sûrement pas inhabituel d'avoir une activité qui peut consommer un type de données de plus d'une façon? À moins que l'un de vous ne sache quelque chose que j'ai manqué, il semble que je vais créer mes activités factices.
EDIT: Comme CommonsWare suggéré, j'ai essayé d'utiliser queryIntentActivityOptions
. J'ai ajouté dans ce code avant menu.addIntentOptions
dans mon code ci-dessus.
PackageManager pm = getPackageManager();
final List<ResolveInfo> available =
pm.queryIntentActivityOptions(this.getComponentName(), null, intent, 0);
Et dans le débogueur, je trouve que available
ne comprenait pas les deux intentions disponibles pour MyActivity
. Donc, le problème ne se trouve pas dans addIntentOptions
, c'est plus profond, dans queryIntentActivityOptions
quelque part.
@SamStephens: FWIW, Google a été backpedaling de 'addIntentOptions()' à peu près depuis Android 1.0. Cela ne veut pas dire que vous ne pouvez pas l'utiliser, mais ne vous attendez pas à ce que ce modèle devienne un véritable amour pour l'avenir. En particulier, cela ne me surprendrait pas du tout s'il y a des bugs pour des cas bizarres comme le vôtre. Pensez à utiliser 'queryIntentActivityOptions()' et à remplir le menu vous-même. – CommonsWare
La liste que 'queryIntentActivityOptions()' renvoie ne retournera qu'une seule entrée pour chaque activité correspondante. – codelark
@CommonsWare: Existe-t-il une documentation de la raison d'être de Google pour cette disponibilité, ou quoi que ce soit à propos de ce que nous sommes censés faire à la place. 'addIntentOptions()' est un excellent moyen de configurer un menu contextuel. Une quantité minimale de code, et presque toutes les informations déclaratives, pas impératives. Particulièrement par rapport aux autres menus contextuels que j'ai vus, avec des règles de code et des changements requis dans plusieurs endroits pour changer les options disponibles. – SamStephens