【问题标题】:NullPointerException on setShareIntent using ActionBarSherlock使用 ActionBarSherlock 在 setShareIntent 上出现 NullPointerException
【发布时间】:2016-06-26 16:03:47
【问题描述】:

我正在尝试在 SherlockActivity 中使用 ActionBarSherlock + ShareActionProvider。 我已经检查过了(NullPointerException using ShareActionProvider + actionbarsherlock),但它并没有解决我的问题。 我认为代码是正确的,但我不断收到 FC 和这个 logcat:

07-25 15:31:26.758: E/AndroidRuntime(911): FATAL EXCEPTION: main
07-25 15:31:26.758: E/AndroidRuntime(911): java.lang.NullPointerException
07-25 15:31:26.758: E/AndroidRuntime(911):  at com.corsalini.david.calcolopesi.ActCalcolo.onCreateOptionsMenu(ActCalcolo.java:162)
07-25 15:31:26.758: E/AndroidRuntime(911):  at com.actionbarsherlock.app.SherlockActivity.onCreatePanelMenu(SherlockActivity.java:173)
07-25 15:31:26.758: E/AndroidRuntime(911):  at com.actionbarsherlock.ActionBarSherlock.callbackCreateOptionsMenu(ActionBarSherlock.java:556)
07-25 15:31:26.758: E/AndroidRuntime(911):  at com.actionbarsherlock.internal.ActionBarSherlockCompat.preparePanel(ActionBarSherlockCompat.java:483)
07-25 15:31:26.758: E/AndroidRuntime(911):  at com.actionbarsherlock.internal.ActionBarSherlockCompat.dispatchInvalidateOptionsMenu(ActionBarSherlockCompat.java:273)
07-25 15:31:26.758: E/AndroidRuntime(911):  at com.actionbarsherlock.internal.ActionBarSherlockCompat$1.run(ActionBarSherlockCompat.java:988)
07-25 15:31:26.758: E/AndroidRuntime(911):  at android.os.Handler.handleCallback(Handler.java:587)
07-25 15:31:26.758: E/AndroidRuntime(911):  at android.os.Handler.dispatchMessage(Handler.java:92)
07-25 15:31:26.758: E/AndroidRuntime(911):  at android.os.Looper.loop(Looper.java:123)
07-25 15:31:26.758: E/AndroidRuntime(911):  at android.app.ActivityThread.main(ActivityThread.java:3683)
07-25 15:31:26.758: E/AndroidRuntime(911):  at java.lang.reflect.Method.invokeNative(Native Method)
07-25 15:31:26.758: E/AndroidRuntime(911):  at java.lang.reflect.Method.invoke(Method.java:507)
07-25 15:31:26.758: E/AndroidRuntime(911):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
07-25 15:31:26.758: E/AndroidRuntime(911):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
07-25 15:31:26.758: E/AndroidRuntime(911):  at dalvik.system.NativeStart.main(Native Method)

代码如下:

public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getSupportMenuInflater();
    inflater.inflate(R.menu.menu_main, menu);
    MenuItem menuItem = menu.findItem(R.id.miShare);
    ShareActionProvider mShareActionProvider = (ShareActionProvider) menuItem.getActionProvider();
    // Set the default share intent
    Intent shareIntent = new Intent(Intent.ACTION_SEND);
    shareIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
    shareIntent.setType("text/plain");
    shareIntent.putExtra(Intent.EXTRA_TEXT, getString(R.string.share_text));
    shareIntent.putExtra(Intent.EXTRA_SUBJECT, getString(R.string.share_subject));
    mShareActionProvider.setShareIntent(shareIntent);  //Line 162
    return true;
}    

这里是菜单的xml:

<menu xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:id="@+id/miPref"
        android:icon="@drawable/ic_action_settings"
        android:showAsAction="ifRoom"
        android:title="@string/settings"
        android:visible="true" />
    <item
        android:id="@+id/miReset"
        android:icon="@drawable/ic_action_reset"
        android:showAsAction="ifRoom"
        android:title="@string/reset"
        android:visible="true" />
    <item
        android:id="@+id/miShare"
        android:actionProviderClass="android.widget.ShareActionProvider"
        android:showAsAction="ifRoom"
        android:title="@string/share" />
</menu>

编辑1:

我正在尝试添加这一行: mShareActionProvider.setShareHistoryFileName(ShareActionProvider.DEFAULT_SHARE_HISTORY_FILE_NAME);

现在 NullPointerException 就在这里。是否有可能没有这样的文件,所以我得到了例外?

编辑 2:不要照顾编辑 1 我发现问题出在 XML 中。 你必须使用:

    android:actionProviderClass="com.actionbarsherlock.widget.ShareActionProvider"

但我仍在使用原始的 android 小部件。 我还包括:

    menuItem.setActionProvider(mShareActionProvider);

在活动中,但我认为这是多余的。

现在我有两个问题: 1. 仅当“共享”按钮未出现在操作栏中时,应用程序才不会崩溃,如果我尝试将其放在列表顶部,则应用程序崩溃并给出与此处发布的相同的 logcat . 2. 当我点击“分享”时没有任何反应。

【问题讨论】:

  • 好的,让我们看一下提供的信息:“at com.corsalini.david.calcolopesi.ActCalcolo.onCreateOptionsMenu(ActCalcolo.java:162)” ActCalcolo.java 中的第 162 行是什么?跨度>
  • mShareActionProvider.setShareIntent(shareIntent); //第 162 行对不起 =)
  • 我从未使用过 ActionBarSherlock,但 mShareActionProvider 为 null,因此此 menuItem.getActionProvider(); 找不到任何内容(它只是返回 null)。接下来我们将检查文档...
  • 我想我没听懂你的回答。 menuItem.getActionProvider() 从上面的行中获取菜单项,并且该项目肯定存在。还是我错过了什么?
  • 嗯,NPE 在第 162 行。唯一可能导致这种情况的变量是 mShareActionProvider,所以当您初始化 mShareActionProvider 时,出现了问题。 menuItem 很好(这里没有 NPE)所以关于 getActionProvider() 和在 miShare 中设置你的 ActionProvider 是关闭的。 (但我在网上找不到太多文档......仍在寻找)

标签: android nullpointerexception android-actionbar actionbarsherlock shareactionprovider


【解决方案1】:

备注

我试图复制您的错误,我可以使 mShareActionProvider 成为 null 的唯一两种方法是:

  1. 完全忽略这个:android:actionProviderClass=...
  2. 使用Android类:android:actionProviderClass="android.widget.ShareActionProvider"

正如您在 EDIT 2 中发现的,相应的 ActionBarSherlock 代码是:

android:actionProviderClass="com.actionbarsherlock.widget.ShareActionProvider"

建议

1) ... 如果我尝试将(菜单项)放在列表​​顶部,应用程序会崩溃并给出相同的 logcat

尝试创建一个新的菜单 XML 文件,将其保存为 res/menu/temp_menu.xml:

<menu xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:id="@+id/miShare"
        android:actionProviderClass="com.actionbarsherlock.widget.ShareActionProvider"
        android:showAsAction="always"
        android:title="Share" />
</menu>

然后加载它:

inflater.inflate(R.menu.temp_menu, menu);

2) 如果“共享”在溢出菜单中,当我选择它时什么也不会发生。

这是一个 ActionBarSherlock 向后兼容的怪癖,在此处详述,Issue #455


空指针异常

从你们的几个 cmets 中,我想澄清 NullPointerException 到底是什么。当您尝试添加此行时:

mShareActionProvider.setShareHistoryFileName(ShareActionProvider.DEFAULT_SHARE_HISTORY_FILE_NAME);

你说:

现在 NullPointerException 就在这里。是否有可能没有这样的文件,所以我得到了异常?

NPE 移到这里的原因是mSharedActionProvider 仍然为空。您不能引用 null.method() 的概念,或者在您的情况下是 null.setShareHistoryFileName(),这就是 NPE。换句话说,你不能要求什么都不做。文件是否存在在这里并不重要,应用程序在此之前崩溃

您可以在调试器中自己证明这一点,或者添加如下一行:

ShareActionProvider mShareActionProvider = (ShareActionProvider) menuItem.getActionProvider();
Log.w("NullPointerException", "Is mShareActionProvider null: " + (mShareActionProvider == null));

希望有帮助!

【讨论】:

  • 我找不到这个方法,SupporteED 有点奇怪,这个和支持都不起作用。另外,hereABS 的创建者在回答问题时并没有提到 getSupportedActionProvider()。
  • 我认为 getSupportActionProvider 不存在,当我写下它时出现错误,Eclipse 没有通过自动完成找到它,我在互联网上找不到它。但是关于nullpointerexception的解释,其实把问题说清楚了。
  • ' /** * 获取 {@link ActionProvider}。 * * return 动作提供者。 * * 见 ActionProvider * 见 #setActionProvider(ActionProvider) */ public ActionProvider getActionProvider();'这是com.actionbarsherlock.view.MenuItem中的方法。
  • 昨天当我意识到我正在阅读我阅读的内容,而不是所写的内容时,我自嘲了。你是对的:没有像 getSupportActionProvider() 这样的方法,我很抱歉。我安装了 ActionBarSherlock 来尝试解决这个问题,我更新了我的答案。
  • @DavidCorsalini 嗨伙计,你解决了这个问题吗?我遇到了同样的问题,找不到原因。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-23
  • 1970-01-01
  • 1970-01-01
  • 2014-12-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多