2

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)

コードは次のとおりです。

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);

活動中ですが、冗長だと思います。

今、私は2つの問題を抱えています.1.「共有」ボタンがアクションバーに表示されない場合にのみ、アプリがクラッシュしません。ここに投稿されたものと同じlogcat。2. [共有] をクリックしても何も起こりません。

4

1 に答える 1

6

ノート

私はあなたのエラーを複製しようとしましたが、私が引き起こすことができる唯一の2つの方法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 の下位互換性の問題であり、こちらの問題 #455で詳しく説明されています。


NULL ポインター例外

あなたのいくつかのコメントから、NullPointerException が正確に何であるかを明確にしたいと思います。この行を追加しようとしたとき:

mShareActionProvider.setShareHistoryFileName(ShareActionProvider.DEFAULT_SHARE_HISTORY_FILE_NAME);

あなたが言った:

そして今、NullPointerException がここにあります。そのようなファイルがないために例外が発生する可能性はありますか?

NPE がここに移動した理由mSharedActionProviderは、まだ null であるためです。null.method()またはの概念を参照することはできませんnull.setShareHistoryFileName()。これが NPE です。つまり、何かをするために何も要求することはできません。ここでは、ファイルが存在するかどうかは関係ありません。アプリはこの時点より前にクラッシュします。

デバッガーで、または次のような行を追加することで、これを自分で証明できます。

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

それが役立つことを願っています!

于 2012-07-25T18:40:32.280 に答える