Ich möchte eine Aktivitätsauswahl anzeigen, die alle Anwendungen zeigt, die und/oder Daten bearbeiten können. Gibt es einen einfachen Weg dies zu tun, oder muss ich meinen eigenen Aktivitätsauswahldialog implementieren? Oder kann ich einfach Unterklasse Intent
? Vielen Dank.So machen Sie eine Absicht mit mehreren Aktionen
Antwort
fand ich eine Teillösung unter Verwendung EXTRA_INITIAL_INTENTS:
Intent viewIntent = new Intent(Intent.ACTION_VIEW);
Intent editIntent = new Intent(Intent.ACTION_EDIT);
viewIntent.setDataAndType(uri, type);
editIntent.setDataAndType(uri, type);
Intent chooserIntent = Intent.createChooser(editIntent, "Open in...");
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] { viewIntent });
startActivity(chooserIntent);
ich teilweise sagen, denn wenn eine App sowohl ACTION_VIEW unterstützt und ACTION_EDIT es zweimal in der Liste angezeigt wird, von denen die Datei für die Anzeige wird geöffnet und die andere für die Bearbeitung, und Sie würden nicht unbedingt wissen, welches was ist. Ich denke, eine komplette Lösung würde einen benutzerdefinierten App-Chooser erfordern, wie Tim vorgeschlagen hat.
EDIT (Komplettlösung!):
ich eine Lösung gefunden, die denen nicht eine benutzerdefinierte App Chooser zu schreiben. Um ACTION_EDIT-Apps von ACTION_VIEW-Apps zu unterscheiden, habe ich eine Möglichkeit gefunden, eine "(zum Bearbeiten)" - Zeichenfolge an die Beschriftungen für eine von ihnen (in meinem Fall ACTION_EDIT) anzuhängen, indem die angegebene Codezeile verwendet wird. Darüber hinaus ist die beigefügte Zeichenfolge, um sicherzustellen, nicht ein Teil des App-Namen zu sein scheint, änderte ich die Farbe davon Cyan:
PackageManager pm = kyoPrint.getPackageManager();
Intent viewIntent = new Intent(Intent.ACTION_VIEW);
Intent editIntent = new Intent(Intent.ACTION_EDIT);
viewIntent.setDataAndType(uri, type);
editIntent.setDataAndType(uri, type);
Intent openInChooser = Intent.createChooser(viewIntent, "Open in...");
// Append " (for editing)" to applicable apps, otherwise they will show up twice identically
Spannable forEditing = new SpannableString(" (for editing)");
forEditing.setSpan(new ForegroundColorSpan(Color.CYAN), 0, forEditing.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
List<ResolveInfo> resInfo = pm.queryIntentActivities(editIntent, 0);
Intent[] extraIntents = new Intent[resInfo.size()];
for (int i = 0; i < resInfo.size(); i++) {
// Extract the label, append it, and repackage it in a LabeledIntent
ResolveInfo ri = resInfo.get(i);
String packageName = ri.activityInfo.packageName;
Intent intent = new Intent();
intent.setComponent(new ComponentName(packageName, ri.activityInfo.name));
intent.setAction(Intent.ACTION_EDIT);
intent.setDataAndType(uri, type);
CharSequence label = TextUtils.concat(ri.loadLabel(pm), forEditing);
extraIntents[i] = new LabeledIntent(intent, packageName, label, ri.icon);
}
openInChooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, extraIntents);
startActivity(openInChooser);
EDIT 2: BUG
Wenn von der ersten Absicht keine Aktivitäten gefunden werden, werden KEINE Aktivitäten angezeigt, einschließlich der durch die zweite Absicht gefundenen. Ich habe am Ende meinen eigenen Chooser geschrieben. Ich füllte gerade eine ExpandableListView mit Überschriften für jede Art von Absicht mit ihren jeweiligen Aktivitäten als Kinder (gespeichert als einzelne LabeledIntents).
Große Antwort!Ich wollte eine Auswahl mit Intents machen, die von verschiedenen Typen kommen, und sogar eine In-App-Aktivität, und das hat es mir ermöglicht, alle in einem einzigen Chooser zusammenzuführen. – nobre
Das ist ausgezeichnet !! Ich wollte so viele Browser wie möglich starten, um eine lokale HTML-Datei mit all den verschiedenen Absichten, die ich entdeckt habe, anzuzeigen. Das funktioniert perfekt, danke. – daveD
@Ken ist es möglich, doppelte Einträge in der Auswahl zu vermeiden? ich spreche über Gegenstände, die aus einer Absicht und auch aus der anderen Absicht bestehen? Ich versuche, eine Auswahl für die Freigabe zu erstellen, und möchte die Nachricht für SMS kurz, aber ich kann nicht herausfinden, wie es geht. –
hängt davon ab, was Ihre Daten sind. Im Allgemeinen können Sie jedoch mit ACTION_VIEW und einigen angehängten Daten einen IntentChoooser verwenden, um die Liste der Auswahlmöglichkeiten für den Benutzer aufzufüllen.
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TEXT, "some data");
startActivity(Intent.createChooser(intent, "Open with"));
Seien Sie sicher, dass Ihre Art richtig einzustellen, so dass Anwendungen wissen, dass Sie etwas öffnen wollen, die sie verarbeiten können zu können.
EDIT: Ich denke, Sie müssten eine Paket-Manager-Abfrage verwenden, um Ihre zwei Listen dann kombinieren sie zu einem und machen Sie Ihre eigenen Aktivität/Dialog, Pop-up-Popup und mit den Daten in Ihrem enthalten sein wird kombinierte Liste. Hier
ist ein Beispiel für die Abfrage machen:
List<ResolveInfo> resInfo = getPackageManager().queryIntentActivities(intent, 0);
so, wenn Sie Ihre zwei Intents und nennen das zweimal machen, in jeder Absicht vorbei sollten Sie in der Lage sein, die Ergebnislisten zu kombinieren, um Ihren vollen Satz zu erhalten Möglichkeiten. Dann ist es an der Zeit, eine Aktivität oder einen Dialog zu erstellen, um sie zu zeigen.
- 1. So senden Sie eine Absicht mit Telegramm
- 2. So starten Sie eine Absicht in PreferenceChangeListener
- 3. So machen Sie separate Aktionen für Listenansicht und hinzugefügte Elemente
- 4. HTML-Formular mit mehreren „Aktionen“
- 5. So machen Sie Twitter-App-Stil Schnelle Aktionen auf Android
- 6. Verwenden Sie den Befehl: g in vim mit mehreren Aktionen
- 7. Umgang mit einem Formular mit mehreren Aktionen
- 8. Zuverlässige Möglichkeit, eine ACTION_IMAGE_CAPTURE Absicht zu machen?
- 9. So öffnen Sie eine Datei in Android über eine Absicht
- 10. Redux connect() mit mehreren Aktionen/Zuständen
- 11. So senden Sie eine LatLng-Instanz an neue Absicht
- 12. Android Broadcast Empfänger mit mehreren Aktionen
- 13. Machen UITableViewCell Aktionen überlappen Inhalt
- 14. If-Anweisung mit mehreren Aktionen in R
- 15. So machen Sie eine 'svn copy' rückgängig
- 16. So rufen Sie Aktionen zwischen Klassen auf?
- 17. So erfassen Sie mit Windows Media Player ausgeführte Aktionen
- 18. So starten Sie Android-Kalender-Anwendung mit Absicht (Froyo)
- 19. So versenden Sie mehrere Aktionen nacheinander
- 20. So registrieren Sie benutzerdefinierte Aktionen für Nachrichten
- 21. So machen Sie eine Property-Injektion für TypeAliases mit spring.net
- 22. So machen Sie NSURL mit Sonderzeichen
- 23. So filtern Sie eine Liste in AngularJS mit mehreren Links
- 24. So stellen Sie eine Sharepoint-Veröffentlichungssite mit mehreren Standorten bereit
- 25. So binden Sie eine Ansicht mit mehreren ObservableCollection
- 26. So erstellen Sie eine ListView mit mehreren Text
- 27. So erhalten Sie eine Elasticsearch-Aggregation mit mehreren Feldern
- 28. So machen Sie statische Analyse mit ANTLR
- 29. So generieren Sie Suchvorschläge mit mehreren Wörtern
- 30. implizite Absicht, quadratische Fotos zu machen
Kasse Codebeispiel: https://gist.github.com/gelldur/9c199654c91b13478979 –