使用ActionBarSherlock对setShareIntent进行NullPointerException

时间:2012-07-25 15:53:42

标签: android nullpointerexception android-actionbar actionbarsherlock shareactionprovider

我正在尝试在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.当我点击“分享”时,没有任何事情发生。

1 个答案:

答案 0 :(得分:6)

备注

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

  1. 完全遗漏:android:actionProviderClass=...
  2. 使用Android类:android:actionProviderClass="android.widget.ShareActionProvider"
  3. 正如您在编辑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


    空指针异常

    从您的一些评论中,我想澄清究竟是什么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));
    

    希望有所帮助!