NullPointerException异常使用ActionBarSherlock setShareIntent [英] NullPointerException on setShareIntent using ActionBarSherlock
问题描述
我试图用ActionBarSherlock + ShareActionProvider在SherlockActivity。 我已经检查过这(<一href="http://stackoverflow.com/questions/10633140/nullpointerexception-using-shareactionprovider-actionbarsherlock">NullPointerException使用ShareActionProvider + actionbarsherlock ),但它并没有解决我的问题。 我认为,code是正确的,但我不断收到FC,这logcat的:
07-25 15:31:26.758:E / AndroidRuntime(911):致命异常:主要
07-25 15:31:26.758:E / AndroidRuntime(911):显示java.lang.NullPointerException
07-25 15:31:26.758:E / AndroidRuntime(911):在com.corsalini.david.calcolopesi.ActCalcolo.onCreateOptionsMenu(ActCalcolo.java:162)
07-25 15:31:26.758:E / AndroidRuntime(911):在com.actionbarsherlock.app.SherlockActivity.onCreatePanelMenu(SherlockActivity.java:173)
07-25 15:31:26.758:E / AndroidRuntime(911):在com.actionbarsherlock.ActionBarSherlock.callbackCreateOptionsMenu(ActionBarSherlock.java:556)
07-25 15:31:26.758:E / AndroidRuntime(911):在com.actionbarsherlock.internal.ActionBarSherlockCompat.$p$pparePanel(ActionBarSherlockCompat.java:483)
07-25 15:31:26.758:E / AndroidRuntime(911):在com.actionbarsherlock.internal.ActionBarSherlockCompat.dispatchInvalidateOptionsMenu(ActionBarSherlockCompat.java:273)
07-25 15:31:26.758:E / AndroidRuntime(911):在com.actionbarsherlock.internal.ActionBarSherlockCompat $ 1.运行(ActionBarSherlockCompat.java:988)
07-25 15:31:26.758:E / AndroidRuntime(911):在android.os.Handler.handleCallback(Handler.java:587)
07-25 15:31:26.758:E / AndroidRuntime(911):在android.os.Handler.dispatchMessage(Handler.java:92)
07-25 15:31:26.758:E / AndroidRuntime(911):在android.os.Looper.loop(Looper.java:123)
07-25 15:31:26.758:E / AndroidRuntime(911):在android.app.ActivityThread.main(ActivityThread.java:3683)
07-25 15:31:26.758:E / AndroidRuntime(911):在java.lang.reflect.Method.invokeNative(本机方法)
07-25 15:31:26.758:E / AndroidRuntime(911):在java.lang.reflect.Method.invoke(Method.java:507)
07-25 15:31:26.758:E / AndroidRuntime(911):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:839)
07-25 15:31:26.758:E / AndroidRuntime(911):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
07-25 15:31:26.758:E / AndroidRuntime(911):在dalvik.system.NativeStart.main(本机方法)
下面是code:
公共布尔onCreateOptionsMenu(功能菜单){
MenuInflater充气= getSupportMenuInflater();
inflater.inflate(R.menu.menu_main,菜单);
菜单项菜单项= menu.findItem(R.id.miShare);
ShareActionProvider mShareActionProvider =(ShareActionProvider)menuItem.getActionProvider();
//设置默认共享意向
意图shareIntent =新的意图(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); //线162
返回true;
}
这里是XML的菜单:
&LT;菜单的xmlns:机器人=http://schemas.android.com/apk/res/android&GT;
&LT;项目
机器人:ID =@ + ID / MI preF
机器人:图标=@可绘制/ ic_action_settings
机器人:showAsAction =ifRoom
机器人:标题=@字符串/设置
机器人:可见=真/&GT;
&LT;项目
机器人:ID =@ + ID / miReset
机器人:图标=@可绘制/ ic_action_reset
机器人:showAsAction =ifRoom
机器人:标题=@字符串/复位
机器人:可见=真/&GT;
&LT;项目
机器人:ID =@ + ID / miShare
机器人:actionProviderClass =android.widget.ShareActionProvider
机器人:showAsAction =ifRoom
机器人:标题=@字符串/股/&GT;
&LT; /菜单&gt;
编辑1:
我想加入这一行: mShareActionProvider.setShareHistoryFileName(ShareActionProvider.DEFAULT_SHARE_HISTORY_FILE_NAME);
而现在的NullPointerException异常是在这里。是否有可能,有没有这样的文件,所以我得到异常?
编辑2:不照顾编辑1 我发现这个问题是在XML。 你必须使用:
安卓actionProviderClass =com.actionbarsherlock.widget.ShareActionProvider
但我还是用原生Android窗口小部件。 我还包括:
menuItem.setActionProvider(mShareActionProvider);
在活动,但我认为这是多余的。
现在我有两个问题: 1.应用程序不仅崩溃,如果共享按钮不会在操作栏中显示出来,如果我尝试把它放在列表,应用程序崩溃的顶部,并给予同样的logcat作为一个张贴在这里。 2.当我点击共享什么也没有发生。
备注
我试图复制你的错误,并且只有两个办法,我可以使 mShareActionProvider
是空
是
- 将了这一点完全:
安卓actionProviderClass = ...
- 使用安卓类:
安卓actionProviderClass =android.widget.ShareActionProvider
正如你在EDIT 2发现合适的ActionBarSherlock code是:
安卓actionProviderClass =com.actionbarsherlock.widget.ShareActionProvider
建议
1)...如果我试图把(菜单项)在列表顶部,应用程序崩溃,并给出了相同的logcat
尝试创建一个新的菜单的XML文件,它保存为RES /菜单/ temp_menu.xml:
&LT;菜单的xmlns:机器人=http://schemas.android.com/apk/res/android&GT;
&LT;项目
机器人:ID =@ + ID / miShare
机器人:actionProviderClass =com.actionbarsherlock.widget.ShareActionProvider
机器人:showAsAction =总是
机器人:标题=分享/&GT;
&LT; /菜单&gt;
和与加载它:
inflater.inflate(R.menu.temp_menu,菜单);
2)如果共享是在溢出菜单时,我选择它什么也不会发生。
这是一个ActionBarSherlock向后兼容性怪癖这里详述,问题#455 。
空指针异常
这是一些您的意见,我想澄清究竟抛出NullPointerException。当你试图加入这一行:
<$p$p><$c$c>mShareActionProvider.setShareHistoryFileName(ShareActionProvider.DEFAULT_SHARE_HISTORY_FILE_NAME);您说:
而现在的NullPointerException异常是在这里。是否有可能,有没有这样的文件,所以我得到的异常?
在NPE搬到这里的原因是因为 mSharedActionProvider
仍是空。不能引用的概念null.method()
或你的情况 null.setShareHistoryFileName()
,这是一个NPE是。换句话说,你不能要求无关的东西。不要紧,这里的文件是否存在,应用程序崩溃的在的这一点。
您可以在调试器或通过添加这样一行证明自己这一点:
ShareActionProvider mShareActionProvider =(ShareActionProvider)menuItem.getActionProvider();
Log.w(NullPointerException异常,是mShareActionProvider空:+(mShareActionProvider == NULL));
希望帮助!
I'm trying to use ActionBarSherlock + ShareActionProvider in a SherlockActivity. I've already checked this ( NullPointerException using ShareActionProvider + actionbarsherlock) but it doesn't solve my problem. I think the code is correct, but I keep getting FC and this 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)
Here is the code:
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;
}
And here is the xml for the menu:
<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>
EDIT 1:
I'm trying to add this line: mShareActionProvider.setShareHistoryFileName(ShareActionProvider.DEFAULT_SHARE_HISTORY_FILE_NAME);
And now the NullPointerException is here. Is it possible that there is no such file and so i get the exception?
EDIT 2: Do not take care of EDIT 1 I've found that the problem was in the XML. You have to use:
android:actionProviderClass="com.actionbarsherlock.widget.ShareActionProvider"
but i was still using the original android widget. I have also included:
menuItem.setActionProvider(mShareActionProvider);
in the activity, but i think it's redundant.
Now i've got two problems: 1. the app doesn't crash only if the "share" button doesn't show up in the action bar, if i try to put it on top of the list, the app crash and give the same logcat as the one posted here. 2. When i click "share" nothing happens.
Notes
I have tried to duplicate your error and the only two ways I can cause mShareActionProvider
to be null
is to:
- leave this out entirely:
android:actionProviderClass=...
- use the Android class:
android:actionProviderClass="android.widget.ShareActionProvider"
As you discovered in EDIT 2 the appropriate ActionBarSherlock code is:
android:actionProviderClass="com.actionbarsherlock.widget.ShareActionProvider"
Suggestions
1) ... If I try to put (the menu item) on top of the list, the app crashes and gives the same logcat
Try creating a new menu XML file, save this as 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>
And load it with:
inflater.inflate(R.menu.temp_menu, menu);
2) If "share" is in the overflow menu nothing happens when I select it.
This is an ActionBarSherlock backwards compatibility quirk detailed here, Issue #455.
Null Pointer Exception
From a few of your comments, I want to clarify what exactly a NullPointerException is. When you tried adding this line:
mShareActionProvider.setShareHistoryFileName(ShareActionProvider.DEFAULT_SHARE_HISTORY_FILE_NAME);
You said:
And now the NullPointerException is here. Is it possible that there is no such file and so I get the exception?
The reason the NPE moved here is because mSharedActionProvider
is still null. You cannot reference the concept of null.method()
or in your case null.setShareHistoryFileName()
, this is what a NPE is. In other words, you cannot ask nothing to do something. It doesn't matter here whether the file exists or not, the app crashes before this point.
You can prove this for yourself in the debugger or by adding a line like this:
ShareActionProvider mShareActionProvider = (ShareActionProvider) menuItem.getActionProvider();
Log.w("NullPointerException", "Is mShareActionProvider null: " + (mShareActionProvider == null));
Hope that helps!
这篇关于NullPointerException异常使用ActionBarSherlock setShareIntent的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!