2012-06-13 4 views
30

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

+0

Kasse Codebeispiel: https://gist.github.com/gelldur/9c199654c91b13478979 –

Antwort

55

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); 

enter image description here

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).

+0

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

+0

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

+0

@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. –

4

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.

+0

ich alle apps zeigen wollen, dass ACTION_VIEW unterstützen ** oder ** ACTION_EDIT, nicht ACTION_VIEW nur ​​ – Ken

+0

Ahh, wie ich sehe. Sie müssen ein bisschen mehr von der Arbeit selbst machen, als ich denke. Siehe meine Bearbeitung. – FoamyGuy

Verwandte Themen