Chrome自定义标签。设置多个工具栏项

时间:2016-04-15 08:20:24

标签: android android-toolbar chrome-custom-tabs

我正在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帮我解决了上一期的问题。

感谢所有为解决这个问题做出贡献的人!

2 个答案:

答案 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.getActivityaddFavoriteButton的请求代码:

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