【问题标题】:ShareActionProvider not clickable and not rendering properly on first renderShareActionProvider 不可点击且在首次渲染时无法正确渲染
【发布时间】:2012-08-23 07:58:14
【问题描述】:

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

我附上了一张描述这种情况的图片:

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

  2. 定向后,所有选项都按预期可见。

  3. 旋转回纵向会重新渲染 ActionBar,现在 3 点菜单按原样显示,并且可以点击。

对这里发生的事情有什么想法吗?

这是我的 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;
}

【问题讨论】:

    标签: android android-actionbar shareactionprovider


    【解决方案1】:

    这是因为你必须在 onCreateOptionsMenu 上膨胀菜单后立即向 ShareActionPRovider 添加一个意图。

    如果您仅在 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,并且会按预期工作。

    【讨论】:

    • 非常有趣!一旦我有空闲时间,我会研究这个。谢谢!
    【解决方案2】:

    因此,似乎在 Fragment 中的 onCreateView 中调用“getActivity().invalidateOptionsMenu()”会使菜单按应有的方式重新呈现。虽然它应该在第一次运行时正确呈现,但在不对其进行更改的情况下使菜单无效并不是一个合适的解决方案。

    【讨论】:

      【解决方案3】:

      它看起来像平台错误。您可以查看此http://code.google.com/p/android/issues/detail?id=25467 了解更多信息。

      【讨论】:

        【解决方案4】:

        我不认为这是一个错误。因为你的头衔变了。它最初更短(“Details”而不是“ReceiptDetail”),因此系统一定认为有更多空间可以显示更多操作项。

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

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

        【讨论】:

        • 谢谢,我假期回来后会调查的。
        猜你喜欢
        • 1970-01-01
        • 2019-07-21
        • 2015-03-10
        • 2020-07-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多