我正在Android应用上实施Chrome自定义标签(使用最新版本23.3.0)。最新版本的chrome选项卡允许您使用“builder.addToolbarItem()”方法在底部工具栏上添加按钮(根据此stack overflow answer,其他可自定义的内容。现在我在添加操作意图时遇到问题我的底部工具栏按钮。我为我添加的每个工具栏项设置了两个不同的动作意图。但是当打开chrome自定义选项卡,并单击我添加的任何工具栏项时,启动了相同的意图。始终对应于为添加的第一个工具栏项设置的意图。
以下是我在单击回收站视图的项目时用于构建自定义选项卡的代码。
protected void openCustomTab(Listing listing, int position) {
CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder();
builder.setToolbarColor(ContextCompat.getColor(this, R.color.primary));
builder.setStartAnimations(this, R.anim.slide_in_right, R.anim.slide_out_left);
builder.setExitAnimations(this, R.anim.slide_in_left, R.anim.slide_out_right);
builder.setCloseButtonIcon(BitmapFactory.decodeResource(getResources(), R.drawable.ic_arrow_back));
addShareAction(listing, builder);
setBottomToolbar(listing, position, builder);
CustomTabActivityHelper.openCustomTab(
this, builder.build(), Uri.parse(listing.getListingURL()));
}
private void setBottomToolbar(Listing listing, int position, CustomTabsIntent.Builder builder) {
builder.setSecondaryToolbarColor(ContextCompat.getColor(this, R.color.color_bottom_toolbar));
addFavoriteButton(listing, position, builder);
addReportButton(position, builder);
}
private void addShareAction(Listing listing, CustomTabsIntent.Builder builder) {
Bitmap iconShare = BitmapFactory.decodeResource(getResources(),
R.drawable.ic_share_custom_tab);
Intent shareIntent = new Intent(Intent.ACTION_SEND);
shareIntent.setType("text/plain");
shareIntent.putExtra(Intent.EXTRA_SUBJECT, getResources().getString(R.string.share_item_message));
shareIntent.putExtra(Intent.EXTRA_TEXT, listing.getShareURL());
PendingIntent pi = PendingIntent.getActivity(this, 0, shareIntent, 0);
builder.setActionButton(iconShare, getString(R.string.share_item_message), pi, true);
}
private void addReportButton(int position, CustomTabsIntent.Builder builder) {
Bitmap reportIcon = BitmapFactory.decodeResource(getResources(),
R.drawable.detail_bottom_hide);
Bundle menuBundle = ActivityOptions.makeCustomAnimation(this, R.anim.slide_in_left,
R.anim.slide_out_right).toBundle();
Intent reportIntent = createDetailActionIntent(position, ViewsConstants.REPORT);
PendingIntent pi = PendingIntent.getActivity(this, ACTION_REPORT, reportIntent, 0, menuBundle);
builder.addToolbarItem(2, reportIcon, getString(R.string.report_listing_dialog_title), pi);
}
private void addFavoriteButton(Listing listing, int position, CustomTabsIntent.Builder builder) {
Bitmap favIcon;
if (listing.getIsFavorite()) {
favIcon = BitmapFactory.decodeResource(getResources(),
R.drawable.detailbottom_fav);
} else {
favIcon = BitmapFactory.decodeResource(getResources(),
R.drawable.detailbottom_nofav);
}
Bundle menuBundle = ActivityOptions.makeCustomAnimation(this, android.R.anim.slide_in_left,
android.R.anim.slide_out_right).toBundle();
Intent favIntent = createDetailActionIntent(position, ViewsConstants.FAVORITE);
PendingIntent pi = PendingIntent.getActivity(this, 0,favIntent, 0, menuBundle);
builder.addToolbarItem(1, favIcon, getString(R.string.add_favorite), pi);
}
private Intent createDetailActionIntent(int position, String action) {
Intent actionIntent = new Intent(getApplicationContext(), ListingActivity.class);
actionIntent.putExtra(ViewsConstants.SEARCH_PARAMETERS, getListingPresenter().getSearchParameters());
actionIntent.putExtra(ViewsConstants.POSITION, position);
actionIntent.putExtra(ViewsConstants.DETAIL_ACTION, action);
return actionIntent;
}
因此,运行此代码后,获取一个带有底部工具栏和两个按钮收藏夹和报告的Chrome自定义选项卡。单击任何按钮将始终启动收藏夹操作..我已经确保通过多次调试代码将值正确地传递给意图。 我不知道我在这里缺少什么。我开始认为它可能是Chrome自定义标签上的一个错误,但可能有一些我不知道的东西。任何帮助将受到高度赞赏。提前致谢。
已编辑
我根据给出的建议编辑了代码库,现在它可以正常运行每个按钮的操作。比你! 但关于这个职位,我还有一个问题。我正在设置在意图上选择的项目的位置,但是当打开chrome选项卡,单击任何操作按钮并返回到活动时,意图仅设置了操作但位置丢失。我不明白为什么?我正在上面的代码中显示的方法createDetailActionIntent()中设置所有意图值。
当从chrome自定义标签返回到活动并检索意图附加内容时,有关为何原因丢失的任何想法???
这post帮我解决了上一期的问题。
感谢所有为解决这个问题做出贡献的人!
答案 0 :(得分:3)
您需要将不同的requestCode传递给PendingIntent.getActivity
调用,否则会覆盖PendingIntent。查看PendingIntent docs了解更多详情。
自定义标签的Github演示版code以正确的方式实现了这一点。
您的代码应如下所示:
private static final int ACTION_CODE_REPORT = 1;
private static final int ACTION_CODE_SHARE = 2;
private void addShareAction(Listing listing, CustomTabsIntent.Builder builder) {
Bitmap iconShare = BitmapFactory.decodeResource(getResources(),
R.drawable.ic_share_custom_tab);
Intent shareIntent = new Intent(Intent.ACTION_SEND);
shareIntent.setType("text/plain");
shareIntent.putExtra(Intent.EXTRA_SUBJECT, getResources().getString(R.string.share_item_message));
shareIntent.putExtra(Intent.EXTRA_TEXT, listing.getShareURL());
PendingIntent pi = PendingIntent.getActivity(this, ACTION_CODE_SHARE, shareIntent, 0);
builder.setActionButton(iconShare, getString(R.string.share_item_message), pi, true);
}
private void addReportButton(int position, CustomTabsIntent.Builder builder) {
Bitmap reportIcon = BitmapFactory.decodeResource(getResources(),
R.drawable.detail_bottom_hide);
Bundle menuBundle = ActivityOptions.makeCustomAnimation(this, R.anim.slide_in_left,
R.anim.slide_out_right).toBundle();
PendingIntent pi = PendingIntent.getActivity(getApplicationContext(), ACTION_CODE_REPORT,
createDetailActionIntent(position, ViewsConstants.REPORT), 0, menuBundle);
builder.addToolbarItem(2, reportIcon, getString(R.string.report_listing_dialog_title), pi);
}
答案 1 :(得分:2)
启动了相同的意图,因为您使用相同的PendingIntent
操作和相同的请求代码创建了两个Intent
。
要解决您的问题,请更改PendingIntent.getActivity
中addFavoriteButton
的请求代码:
private void addFavoriteButton(Listing listing, int position, CustomTabsIntent.Builder builder) {
Bitmap favIcon;
if (listing.getIsFavorite()) {
favIcon = BitmapFactory.decodeResource(getResources(),
R.drawable.detailbottom_fav);
} else {
favIcon = BitmapFactory.decodeResource(getResources(),
R.drawable.detailbottom_nofav);
}
Bundle menuBundle = ActivityOptions.makeCustomAnimation(this, android.R.anim.slide_in_left,
android.R.anim.slide_out_right).toBundle();
Intent favIntent = createDetailActionIntent(position, ViewsConstants.FAVORITE);
PendingIntent pi = PendingIntent.getActivity(this, 1,favIntent, 0, menuBundle);
builder.addToolbarItem(1, favIcon, getString(R.string.add_favorite), pi);
}
如果您想详细了解PendingIntent
的工作原理,可以阅读StackOveflow answer。