我想要顯示一個活動選擇器,其中顯示了所有可以查看和/或的應用程序編輯一些數據。有沒有簡單的方法來做到這一點,還是我必須實現我自己的活動選擇器對話框?或者,也許我可以繼承Intent
?謝謝。如何使用多個動作來製作目標
30
A
回答
55
我找到了部分解決方案通過使用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);
我說的部分,因爲如果一個應用程序同時支持ACTION_VIEW和ACTION_EDIT它會顯示在列表中了兩次,其中之一將打開該文件進行查看另一個用於編輯,你不一定知道哪個是哪個。 Tim認爲,我認爲完整的解決方案需要定製應用程序選擇器。
EDIT(完整的解決方案!):
我發現,不涉及編寫自定義的應用程序選擇器的解決方案。爲了將ACTION_EDIT應用程序與ACTION_VIEW應用程序區分開來,我找到了一種方法,通過使用Tim提供的代碼行將「(for editing)」字符串附加到其中一個(在我的例子中爲ACTION_EDIT)的標籤上。此外,爲了確保附加的字符串不似乎是應用程序名稱的一部分,我改變了顏色的它青色:
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);
編輯2:BUG
如果第一個意圖沒有找到任何活動,則將顯示NO活動,包括第二個意圖發現的任何活動。我結束了寫我自己的選擇器。我只爲每種意圖類型的標題填充了一個ExpandableListView,並將它們各自的活動作爲子項(作爲單獨的LabeledIntents存儲)。
4
取決於您的數據。但通常使用ACTION_VIEW和附加的一些數據,您可以使用IntentChoooser爲用戶填充選項列表。
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TEXT, "some data");
startActivity(Intent.createChooser(intent, "Open with"));
請務必正確設置您的類型,以便應用程序知道您希望打開他們可能能夠處理的內容。
編輯:我認爲你將不得不使用的軟件包管理器查詢,讓您的兩個列表,然後將它們組合成一個,使自己的活動/對話框會彈出,並逐漸加入包含在數據的組合名單。
這是使查詢的例子:
List<ResolveInfo> resInfo = getPackageManager().queryIntentActivities(intent, 0);
因此,如果你讓你的兩個意圖,並呼籲這兩次,通過在每個意圖,你應該能夠得到的名單相結合,讓你的全套可能性。然後創建一個活動或對話框來顯示它們。
相關問題
- 1. 製作文件中的多個目標
- 2. 如何僅製作一個目標BuildInParallel?
- 3. 如何在一個規則中製作多個目標
- 4. 動態目標在製作
- 5. 使用單個動作/規則生成多個目標
- 6. 如何使用xcode 4中的一個動作存檔多個目標
- 7. 如何使用'gsub'來製作多個替代品?
- 8. 如何使用多個表單動作?
- 9. 如何在Sublime text 3中不使用鼠標來製作多行光標?
- 10. 如何製作一個<select>標籤項目可拖動?
- 11. 如何克隆一個項目來製作第二個項目
- 12. 使用ANTLR C目標,我如何使用動作來打印令牌?
- 13. 如何在Delphi中動態製作多個標籤,編輯等?
- 14. 如何使用ActionScript 3.0創建拖放操作?多個項目被拖動到多個目標
- 15. 如何製作多個preg_macth
- 16. 如何使用css來製作箭頭?
- 17. 來自多個動作的一個動作或多個方法調用
- 18. 如何使用pdfmake製作目錄?
- 19. 如何使用UIImage製作CCMenuItemImage項目?
- 20. 製作:***多種目標圖案。停止
- 21. 如何創建制作目標文件
- 22. 如何參數化製作目標?
- 23. 如何爲目標語言製作CFLocale?
- 24. 如何使用django-tagging製作標籤?
- 25. 如何使用jQueryUI製作子標籤?
- 26. 如何製作多用戶?
- 27. 如何使用反射來製作多維數組或切片
- 28. 如何在目標c中使用多行製作彎曲文本
- 29. 如何使用目標C在iphone中製作.zip文件?
- 30. 如何使用UIBezierPath在目標c中製作簡單圖形?
結帳的代碼示例:https://gist.github.com/gelldur/9c199654c91b13478979 –