ShareActionProvider无法在第一次渲染时无法点击并且无法正确渲染

时间:2012-08-23 07:58:14

标签: android android-actionbar shareactionprovider

我的ActionBar中有一个ShareActionProvider和其他一些选项。然而,似乎ShareActionProvider在第一次以纵向模式渲染时无法正确渲染,并且在第一次渲染时无法单击。方向更改会重新渲染屏幕,然后所有可见的选项都可见,并且当旋转回ActionBar时再次重新渲染,但这次它也在纵向模式下正确渲染。

我附上了描述情况的图片:

  1. “共享”选项未正确呈现,旁边应该有一个图标,如果它不适合布局,则应该成为一个三点菜单。

  2. 定位后,所有选项均按预期显示。

  3. 旋转回肖像重新渲染动作栏,现在三点式菜单显示应该可以点击。

  4. 关于这里发生了什么的任何想法?

    ActionBar description

    这是我的XML:

        <?xml version="1.0" encoding="utf-8"?>
    <menu xmlns:android="http://schemas.android.com/apk/res/android" >
    
        <item
            android:id="@+id/item_delete"
            android:icon="@android:drawable/ic_menu_delete"
            android:showAsAction="ifRoom|withText"
            android:title="Delete"
            android:visible="false"/>
        <item
            android:id="@+id/item_edit"
            android:icon="@android:drawable/ic_menu_edit"
            android:showAsAction="ifRoom|withText"
            android:title="Edit"
            android:visible="false"/>
        <item
            android:id="@+id/item_share"
            android:actionProviderClass="android.widget.ShareActionProvider"
            android:showAsAction="ifRoom|withText"
            android:title="Share"
            android:visible="false"/>
        <item
            android:id="@+id/item_save"
            android:icon="@android:drawable/ic_menu_save"
            android:showAsAction="ifRoom|withText"
            android:title="Save"
            android:visible="false"/>
        <item
            android:id="@+id/menu_search"
            android:actionViewClass="android.widget.SearchView"
            android:icon="@android:drawable/ic_menu_search"
            android:showAsAction="ifRoom"
            android:title="@string/menu_search"
            android:visible="false"/>
    
    </menu>
    

    这就是我处理片段中的选项菜单的方法:

     /**
     * Hook into the OptionsMenu and add an Edit, Delete and Share option.
     */
    @Override
    public void onPrepareOptionsMenu(Menu menu) {
        MenuItem deleteItem = menu.findItem(R.id.item_delete);
        deleteItem.setVisible(true);
    
        MenuItem editItem = menu.findItem(R.id.item_edit);
        editItem.setVisible(true);
    
        MenuItem shareItem = menu.findItem(R.id.item_share);
        shareItem.setVisible(true);
        shareActionProvider = (ShareActionProvider) shareItem.getActionProvider();
        shareActionProvider.setShareIntent(getShareIntent());
    
        super.onPrepareOptionsMenu(menu);
    }
    
    /**
     * Builds an intent that takes the path for the image and passes it to 
     * the sharing mechanism as a stream built on the URI of the image path.
     * @return the intent to share the image as a stream
     */
    private Intent getShareIntent()
    {
        Intent shareIntent = new Intent();
        shareIntent.setAction(Intent.ACTION_SEND);
        shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://" + receipt.getPhoto()));
        shareIntent.setType("image/jpeg");
        return shareIntent;
    }
    

4 个答案:

答案 0 :(得分:30)

这是因为您必须在ShareActionPRovider上夸大菜单后立即向onCreateOptionsMenu添加意图。

如果仅在onPrepareOptionsMenu中执行此操作,则必须手动调用invalidateOptionsMenu()以触发ActionBar更新(如所选答案所示)。但那不是这样做的方式。

配置发生变化时效果很好,因为onPrepareOptionsMenu()被调用,然后你的分享按钮就可以了,因为它现在有一个Intent。

要解决这个问题,请执行以下操作:

@Override
public boolean onCreateOptionsMenu(Menu menu) {

    getSupportMenuInflater().inflate(R.menu.YOUR_MENU_XML, menu);

    ShareActionProvider provider = (ShareActionProvider) menu.findItem(R.id.menu_share).getActionProvider();

    if (provider != null) {
        Intent shareIntent = new Intent();
        shareIntent.setAction(Intent.ACTION_SEND);
        shareIntent.putExtra(Intent.EXTRA_TEXT, YOUR_TEXT);
        shareIntent.setType("text/plain");
        provider.setShareIntent(shareIntent);
    }

    return true;
}

这样,ShareActionProvider从一开始就会有Intent,并且会按预期工作。

答案 1 :(得分:1)

因此,似乎在片段中的 onCreateView 中调用“ getActivity()。invalidateOptionsMenu()”会使菜单重新渲染。它应该在第一次运行中正确渲染,使菜单无效而不对其进行更改,这不是一个合适的解决方案。

答案 2 :(得分:1)

它像平台bug一样接缝。您可以查看此http://code.google.com/p/android/issues/detail?id=25467以获取更多信息。

答案 3 :(得分:1)

我不认为这是一个错误。这是因为你的头衔改变了。最初它更短(“详细信息”而不是“收据详细信息”),因此系统必须认为有更多空间来显示更多操作项。

ShareActionProvider的宽度也是动态的(它可以达到正常宽度的2倍以上)。

为了测试一两件事,我建议你将共享操作项移动到第一个位置,删除临时解决方法,看看它是否仍然存在。您还可以删除共享操作项,并使用3个或更多传统操作项作为测试。