gpt4 book ai didi

android - 如何通过多个操作来制定 Intent

转载 作者:IT老高 更新时间:2023-10-28 21:40:24 31 4
gpt4 key购买 nike

我想显示一个 Activity 选择器,显示所有可以查看和/或编辑某些数据的应用程序。有没有一种简单的方法可以做到这一点,还是我必须实现自己的 Activity 选择器对话框?或者我可以只继承 Intent?谢谢。

最佳答案

我通过使用 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 建议的那样,我认为一个完整的解决方案需要一个自定义应用选择器。

编辑(完整解决方案!):

我找到了一个不涉及编写自定义应用选择器的解决方案。为了将 ACTION_EDIT 应用程序与 ACTION_VIEW 应用程序区分开来,我找到了一种方法,通过使用 Tim 提供的代码行,将“(用于编辑)”字符串附加到其中一个(在我的情况下为 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);

enter image description here

编辑 2:错误

如果第一个 Intent 没有找到任何 Activity ,则不会显示任何 Activity ,包括第二个 Intent 找到的任何 Activity 。我最终编写了自己的选择器。我刚刚填充了一个 ExpandableListView,其中包含每种 Intent 类型的标题,并将它们各自的 Activity 作为子项(存储为单独的 LabeledIntents)。

关于android - 如何通过多个操作来制定 Intent ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11021021/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com