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

spa*_*pan 10 android android-actionbar shareactionprovider

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

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

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

  2. 定位后,所有选项都可以按预期显示.

  3. 旋转回肖像重新渲染ActionBar,现在三点菜单显示为应该可以点击它.

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

ActionBar说明

这是我的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>
Run Code Online (Sandbox Code Playgroud)

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

 /**
 * 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;
}
Run Code Online (Sandbox Code Playgroud)

leo*_*ine 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;
}
Run Code Online (Sandbox Code Playgroud)

通过这种方式,ShareActionProviderIntent从头开始,并将按预期工作.