NullPointerException异常使用ActionBarSherlock setShareIntent [英] NullPointerException on setShareIntent using ActionBarSherlock

本文介绍了NullPointerException异常使用ActionBarSherlock setShareIntent的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图用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:机器人=htt​​p://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

  1. 将了这一点完全:安卓actionProviderClass = ...
  2. 使用安卓类:安卓actionProviderClass =android.widget.ShareActionProvider

正如你在EDIT 2发现合适的ActionBarSherlock code是:

 安卓actionProviderClass =com.actionbarsherlock.widget.ShareActionProvider
 


建议

  

1)...如果我试图把(菜单项)在列表顶部,应用程序崩溃,并给出了相同的logcat

尝试创建一个新的菜单的XML文件,它保存为RES /菜单/ temp_menu.xml:

 &LT;菜单的xmlns:机器人=htt​​p://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:

  1. leave this out entirely: android:actionProviderClass=...
  2. 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆