Dav*_*ini 2 android nullpointerexception actionbarsherlock android-actionbar shareactionprovider
我正在尝试在SherlockActivity中使用ActionBarSherlock + ShareActionProvider.我已经检查了这个(使用ShareActionProvider + actionbarsherlock的NullPointerException),但它没有解决我的问题.我认为代码是正确的,但我一直得到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)
Run Code Online (Sandbox Code Playgroud)
这是代码:
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;
}
Run Code Online (Sandbox Code Playgroud)
这是菜单的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>
Run Code Online (Sandbox Code Playgroud)
编辑1:
我想加入这一行:mShareActionProvider.setShareHistoryFileName(ShareActionProvider.DEFAULT_SHARE_HISTORY_FILE_NAME);
现在NullPointerException就在这里.是否有可能没有这样的文件,所以我得到了例外?
编辑2:不要处理编辑1我发现问题出在XML中.你必须使用:
android:actionProviderClass="com.actionbarsherlock.widget.ShareActionProvider"
Run Code Online (Sandbox Code Playgroud)
但我仍然使用原始的Android小部件.我还包括:
menuItem.setActionProvider(mShareActionProvider);
Run Code Online (Sandbox Code Playgroud)
在活动中,但我认为这是多余的.
现在我有两个问题:1.只有当"共享"按钮没有显示在操作栏中时,应用程序才会崩溃,如果我尝试将其放在列表顶部,应用程序崩溃并给出与此处发布的logcat相同的logcat.2.当我点击"分享"时,没有任何反应.
笔记
我试图复制你的错误,并且只有两个方法,我可能会导致mShareActionProvider将null是:
android:actionProviderClass=...android:actionProviderClass="android.widget.ShareActionProvider"正如您在EDIT 2中发现的那样,相应的ActionBarSherlock代码是:
android:actionProviderClass="com.actionbarsherlock.widget.ShareActionProvider"
Run Code Online (Sandbox Code Playgroud)
建议
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>
Run Code Online (Sandbox Code Playgroud)
加载它:
inflater.inflate(R.menu.temp_menu, menu);
Run Code Online (Sandbox Code Playgroud)
2)如果"分享"在溢出菜单中,当我选择它时没有任何反应.
这是一个ActionBarSherlock向后兼容性的怪癖,详见第455期.
空指针异常
从您的一些评论中,我想澄清究竟是什么NullPointerException.当您尝试添加此行时:
mShareActionProvider.setShareHistoryFileName(ShareActionProvider.DEFAULT_SHARE_HISTORY_FILE_NAME);
Run Code Online (Sandbox Code Playgroud)
你说:
现在NullPointerException就在这里.是否有可能没有这样的文件,所以我得到了例外?
NPE搬到这里的原因是因为mSharedActionProvider仍然是空的.您不能参考null.method()或在您的情况下null.setShareHistoryFileName(),这是NPE 的概念.换句话说,你不能不做任何事情.这里的文件是否存在无关紧要,应用程序在此之前崩溃.
您可以在调试器中自行证明这一点,或者添加如下所示的行:
ShareActionProvider mShareActionProvider = (ShareActionProvider) menuItem.getActionProvider();
Log.w("NullPointerException", "Is mShareActionProvider null: " + (mShareActionProvider == null));
Run Code Online (Sandbox Code Playgroud)
希望有所帮助!
| 归档时间: |
|
| 查看次数: |
3292 次 |
| 最近记录: |