3

我正在我们的 Android 应用程序上实现 Chrome 自定义选项卡(使用最新版本 23.3.0)。最新版本的 chrome 选项卡允许您使用“builder.addToolbarItem()”方法在底部工具栏上添加按钮(根据此堆栈溢出答案的其他可自定义的东西。现在我在为底部添加操作意图时遇到问题工具栏按钮。我为添加的每个工具栏项设置了两个不同的操作意图。但是当打开 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 自定义选项卡返回到活动并检索意图附加信息时为什么会丢失位置的任何想法???

这篇文章帮助我解决了我遇到的最后一个问题。

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

4

2 回答 2

3

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

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

于 2016-04-15T08:31:09.847 回答
1

您需要将不同的 requestCode 传递给PendingIntent.getActivity调用,否则 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);
}
于 2016-04-15T08:35:21.277 回答