25

アプリのアクションバーで android.support.v7.widget.ShareActionProvider を使用しようとしました。だから私はアンドロイドドキュメントの例に従いましたが、いくつかの問題がありました。
ここに私のメニューxmlがあります:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:myapp="http://schemas.android.com/apk/res-auto" >

    <item
        android:id="@+id/action_share"
        android:orderInCategory="100"
        android:icon="@drawable/ic_action_share"
        android:title="@string/action_share"
        myapp:showAsAction="ifRoom"
        myapp:actionProviderClass="android.support.v7.widget.ShareActionProvider" />

</menu>

共有アクションボタンを作成するコードは次のとおりです。

@Override
public void onCreateOptionsMenu (Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.share, menu);
    MenuItem shareItem = menu.findItem(R.id.action_share);
    ShareActionProvider mShareActionProvider = (ShareActionProvider)MenuItemCompat.getActionProvider(shareItem);
    mShareActionProvider.setShareIntent(getDefaultIntent());
    super.onCreateOptionsMenu(menu, inflater);
}

私の質問は:

  1. MenuItemCompat.getActionProvider(shareItem) が常に null を返すのはなぜですか?
  2. これらの行にコメントすると、バーに共有ボタンが表示されますが、クリックしても何もしません。修正方法(質問1が解決できない場合)?

ところで、MenuItemCompat.getActionProvider のコードを確認しました。このメソッドは、メニュー項目が SupportMenuItem インターフェイスを実装しているかどうかを確認し、そうでない場合は失敗を返すようです。どうすれば対処できますか?

4

12 に答える 12

20

私の場合、間違った名前空間でしたmenu.xml:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto">
  <item android:id="@+id/menu_item_share"
        app:actionProviderClass="android.support.v7.widget.ShareActionProvider"/>

に注意しapp:actionProviderClass="android.support.v7.widget.ShareActionProvider"てください:

  • 正しいパッケージ( android.widget android.support.v7.widget )
  • 正しい名前空間( Android アプリ)。

残念ながら、コンパイラはエラーなしでコンパイルしますが、Android Studio のみが下線付きで通知します。

于 2015-09-16T08:00:55.527 に答える
12

クラスが Activity だけでなく AppCompatActivity を拡張していることを確認してください。

注: 更新された app compat ライブラリを反映するように編集されました。

于 2013-10-23T03:40:27.980 に答える
1

同じタイプのエラーがありました。MenuItemCompat.getActionProvider が null を返しました。

私の問題はProGuardにありました。ProGuard をオフにすると解決しました。

于 2014-01-19T18:09:02.240 に答える
1

アプリで同じnullPointerの問題がありました。@ josh527 が述べたように、アプリケーションのカスタム xml 名前空間を定義するのを忘れていました。それがあなたの問題ではないことはわかっていますが、私のようにあなたの投稿にアクセスしてそれを見ない人もいるかもしれませんので、私はそれを見つけたかっただけです;)

于 2013-12-27T15:24:50.837 に答える
0

変数: Android.Support.V7.Widget.ShareActionProvider shareActionProvider;

this.MenuInflater.Inflate(Resource.Menu.share_action_provider, menu);
var shareItem = menu.FindItem(Resource.Id.menu_item_share_action_provider_action_bar);
MenuItemCompat.SetShowAsAction (shareItem,  MenuItemCompat.ShowAsActionIfRoom);
var actionprov = new Android.Support.V7.Widget.ShareActionProvider (this);
MenuItemCompat.SetActionProvider (shareItem, actionprov);
var test =  MenuItemCompat.GetActionProvider (shareItem);
shareActionProvider = test.JavaCast<Android.Support.V7.Widget.ShareActionProvider>();
var intent = new Intent(Intent.ActionSend);
intent.SetType("text/plain");
intent.PutExtra(Intent.ExtraText, "ActionBarCompat is Awesome! Support Lib v7 #Xamarin");
shareActionProvider.SetShareIntent (intent);
return base.OnCreateOptionsMenu(menu); 

これは私と一緒にトリックをしました...私は自分の shareactionprovider を作成しました! そして、私はそれを自分で設定し、それを取得します...そして、必要のないコードもあるかもしれません..しかし、それは多くのキャストであり、「ShareActionProvider」と入力するだけで、常に正しいものを使用していることを確認してください実際にV4を使用しています..!V7の代わりに

于 2015-01-13T15:06:14.343 に答える
0

活動の単位に追加してみてください

import android.support.v4.view.MenuItemCompat;

私は同じ問題を抱えていましたが、それは解決策でした。

于 2014-11-03T11:46:56.263 に答える