为什么 MenuItemCompat.getActionProvider 返回 null?

25

我尝试在我的应用程序中的操作栏上使用android.support.v7.widget.ShareActionProvider。所以我按照Android文档中的示例进行了操作,但是遇到了一些问题。
这是我的菜单xml:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:myapp="http://schemas.android.com/apk/res-auto" >

    <item
        android:id="@+id/action_share"
        android:orderInCategory="100"
        android:icon="@drawable/ic_action_share"
        android:title="@string/action_share"
        myapp:showAsAction="ifRoom"
        myapp:actionProviderClass="android.support.v7.widget.ShareActionProvider" />

</menu>

这是我用来创建分享按钮的代码:

@Override
public void onCreateOptionsMenu (Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.share, menu);
    MenuItem shareItem = menu.findItem(R.id.action_share);
    ShareActionProvider mShareActionProvider = (ShareActionProvider)MenuItemCompat.getActionProvider(shareItem);
    mShareActionProvider.setShareIntent(getDefaultIntent());
    super.onCreateOptionsMenu(menu, inflater);
}

我的问题是:

  1. 对于我来说,MenuItemCompat.getActionProvider(shareItem)总是返回null,为什么会这样?
  2. 当我注释掉那些代码行时,分享按钮出现在菜单栏上但是点击无效,如何解决(如果问题1无法解决)?

顺便说一下,我查看了MenuItemCompat.getActionProvider的代码,它看起来像是检查菜单项是否实现了SupportMenuItem接口并在未实现时返回失败。我该怎么处理?


4
我能够重现MenuItemCompat总是返回null的情况。我的问题在于我使用了android:命名空间,而不是定义一个例如app:或myapp:的命名空间。在两种情况下,我都验证了menu.findItem返回的是SupportMenuItem的实例。 - josh527
我找到了我犯两个错误的原因,应用程序主题应该是theme.appcompat.*,而我使用了标准的holo主题,另外似乎在片段中执行onCreateOptionsMenu的顺序在活动之前。 - hago
我已经使用了一个appcompat主题,但我无法理解你提到的第二个原因的相关性。这个问题对我来说仍然没有解决。请参见http://stackoverflow.com/questions/24219842/getactionprovider-item-does-not-implement-supportmenuitem。 - faizal
12个回答

0
尝试添加到活动单元。
import android.support.v4.view.MenuItemCompat;

我曾经遇到过同样的问题,但已经找到了解决方案。


0

还有一个潜在的相关问题。如果您的MenuItem始终出现在ActionBar中,请使用以下代码:

menuItem?.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS) 

由此产生的菜单项将无法工作(它将可见,但不可用)。有两个选项,要么更改ShowAsAction类型,要么直接在onCreateOptionsMenu()函数中调用setShareIntent:

this@MyAwesomeActivity.runOnUiThread(java.lang.Runnable {
     actionProvider.setShareIntent(shareIntent)
})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接