当前位置: 首页 > 知识库问答 >
问题:

Chrome自定义选项卡。设置多个工具栏项目

孟花蜂
2023-03-14

我正在Android应用程序上实现Chrome自定义选项卡(使用最新版本23.3.0)。最新版本的chrome选项卡允许您使用“builder.addToolbarItem()”方法在底部工具栏上添加按钮(根据堆栈溢出的答案,还有其他可自定义的内容。现在,我在为底部工具栏按钮添加操作意图时遇到了一个问题。我为我添加的每个工具栏项设置了两个不同的操作意图。但是,当打开chrome自定义选项卡,并单击我添加的任何工具栏项时,会启动相同的意图。启动的意图始终对应于t表示添加的第一个工具栏项。

这是我在单击回收器视图的项目时用于构建自定义选项卡的代码。

 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()中的所有intent值。

你知道为什么在从chrome自定义选项卡返回到活动并检索意图附加项时,位置会丢失吗???

这篇文章帮助我解决了上一个问题。

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

共有2个答案

空浩淼
2023-03-14

您需要向PendingIntent.get活动调用传递不同的Request estCode,否则PendingIntent将被覆盖。有关更多详细信息,请查看PendingIntent文档。

自定义标签的Github演示有以正确方式实现这一点的代码。

您的代码应如下所示:

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);
}
璩正志
2023-03-14

启动相同的intent是因为您创建了两个具有相同的intent操作和相同的请求代码的PendingIntent。

要解决您的问题,请更改PendingContent的请求代码。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答案。

 类似资料:
  • 我正在我的android应用程序中实施Fit-bit rest客户端授权。我使用自定义选项卡打开Fitbit授权URL,如“https://www.fitbit.com/oauth2/authorize?response_type=code 未报告此行为的日志。 任何建议都可能有助于我理解这种行为。

  • 在我的应用程序中,我通过Chrome自定义标签打开了一个url。我们知道,当用户点击设备后退按钮或自定义后退按钮时,Chrome自定义标签会被关闭。是否有可能关闭Chrome自定义标签通过编程而不需要用户干预。

  • 在使用网页视图时,我可以使用重新加载()来刷新网页。但是在Chrome自定义标签中,我如何重新加载网页?请引导我。 谢谢

  • WooCommerce的设置指仪表盘 - WooCommerce - 设置下的选项卡,有常规、产品、配送等等。很多WooCommerce插件会在这里增加自己的设置选项,它们是怎么做的呢?本文将介绍向WooCommerce设置里添加自定义选项卡和字段的方法。 WooCommerce设置 – 向产品设置里添加自定义选项卡和字段 目标:如上图所示,在产品选项卡下添加Example Section,里面就

  • 有没有办法使用自定义Chrome标签页发送带有网址的帖子数据?就像使用网络视图一样: 在留档或示例中找不到任何相关信息。

  • 我有一个活动,将一个外部url加载到我应用程序内的webview中。我想使用Chrome自定义标签,当它可用,但我支持的设备可能没有一个版本的Chrome支持他们。 它说,如果绑定成功,自定义选项卡可以安全使用。有没有一个简单的方法绑定来测试这个? 我假设是这样的: