Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


¿Por qué MenuItemCompat.getActionProvider devuelve nulo?

Intenté usar android.support.v7.widget.ShareActionProvider en la barra de acción de mi aplicación. Así que seguí el ejemplo del documento de Android, pero tengo algunos problemas.
Aquí está mi menú 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> 

Aquí está mi código para crear el botón de acciones de acción:

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

Mi pregunta es:

  1. MenuItemCompat.getActionProvider (shareItem) devuelve siempre null para mí, ¿por qué?
  2. Cuando comento esas líneas, el botón de compartir aparece en la barra pero no hace nada al hacer clic, ¿cómo arreglarlo (si la pregunta 1 no puede resolverse)?

Btw, comprobé los códigos de MenuItemCompat.getActionProvider, parece que este método comprobará si el elemento de menú implementa la interfaz de SupportMenuItem y devuelve fallar si no lo es. ¿Cómo podría lidiar con eso?

10 Solutions collect form web for “¿Por qué MenuItemCompat.getActionProvider devuelve nulo?”

Aquí esta es la única solución que funciona para hacer ShareActionProvider no nulo … yo uso Set ActionProvider vez … vea el código a continuación:

 @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.messages_activity_menu, menu); MenuItem menuItem = menu.findItem(R.id.menu_item_share); shareActionProvider = new ShareActionProvider(this); MenuItemCompat.setActionProvider(menuItem, shareActionProvider); return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { if(item.getItemId() == R.id.menu_item_share){ onShareAction(); } return super.onOptionsItemSelected(item); } private void onShareAction(){ // Create the share Intent String playStoreLink = "https://play.google.com/store/apps/details?id=" + getPackageName(); String yourShareText = getResources().getString(R.string.share_text) + playStoreLink; Intent shareIntent = ShareCompat.IntentBuilder.from(this).setType("text/plain").setText(yourShareText).getIntent(); // Set the share Intent if (shareActionProvider != null) { shareActionProvider.setShareIntent(shareIntent); } } 

Y … xml

  <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@+id/menu_item_share" android:icon="@drawable/ic_action_share" android:showAsAction="ifRoom|withText" android:title="@string/menu_item_share" /> </menu> 

Y otras cosas que se pueden comprobar:

La actividad tiene que extender ActionBarActivity:

 MyActivity extends ActionBarActivity 

Comprobar y utilizar estas importaciones:

 import android.support.v4.app.ShareCompat; import android.support.v4.view.MenuItemCompat; import android.support.v7.app.ActionBar; import android.support.v7.app.ActionBar.OnNavigationListener; import android.support.v7.app.ActionBarActivity; import android.support.v7.widget.ShareActionProvider; 

En AndroidManifest.xml ponga esta línea en los atributos de etiqueta de su actividad:

 android:theme="@style/Theme.AppCompat.Light" 

Si no sabe importar las bibliotecas de compatibilidad v7 y v4, consulte: http://developer.android.com/tools/support-library/setup.html

En mi caso era espacio de nombres incorrecto en 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"/> 

Preste atención a la app:actionProviderClass="android.support.v7.widget.ShareActionProvider" : debería tener

  • Paquete correcto ( android.widget android.support.v7.widget )
  • Espacio de nombres correcto ( aplicación android ).

Desafortunadamente, el compilador lo compila sin errores, solo Android Studio hace la notificación con subrayado.

Asegúrese de que su clase extiende AppCompatActivity en lugar de sólo Actividad.

Nota: Editado para reflejar la biblioteca de compatibilidad de aplicaciones actualizada.

Después de leer un poco y que incluye probablemente algunas de las respuestas de ustedes, por último, esta emitida se resuelve:

  1. Share_Menu.xml . Asegúrese de que tiene un espacio de nombres personalizado y la clase actionProvider es de ese espacio de nombres personalizado, así como el valor correcto: android.support.v7.widget.ShareActionProvider

    <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:title="@string/action_detail_share" myapp:showAsAction="always" myapp:actionProviderClass="android.support.v7.widget.ShareActionProvider"></item> </menu>

  2. Detalle_Actividad.java
    2.1. Heredar de ActionBarActivity en lugar de Actividad
    2.2. Añadir las importaciones correctas

    import android.support.v4.app.Fragment; import android.support.v4.view.MenuItemCompat; import android.support.v7.app.ActionBarActivity; import android.support.v7.widget.ShareActionProvider;

  3. AndroidManifest.xml Añadir el android: theme = " @ style / Theme.AppCompat.Light "

    <activity android:name=".detail_activity" android:label="@string/title_activity_detail_activity" android:theme="@style/Theme.AppCompat.Light" android:parentActivityName=".main_activity" >

  4. Construir una planta
    4.1. En mi caso sólo para permanecer en el lado seguro me doy vuelta ProGuard en Debug .

    debug { runProguard false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' }

4.2. Asegúrese de que tiene la siguiente sección de compilación en dependencias

 `compile 'com.android.support:appcompat-v7:20.0.+'` 

Si alguien quiere mantener el progaurd y seguir usando el código:

 ShareActionProvider mShareActionProvider = (ShareActionProvider)MenuItemCompat.getActionProvider(shareItem); 

Sólo hay que añadir a proguard :

 -keep class android.support.v7.widget.ShareActionProvider { *; } 

Tuve el mismo problema nullPointer en mi aplicación. Como @ josh527 declaró, me olvidé de definir un espacio de nombres personalizado xml para mi aplicación. Sé que no fue tu problema, pero algunas personas pueden llegar a tu puesto como yo y no ver que así que sólo quería verlo;)

Tuve el mismo tipo de error. MenuItemCompat.getActionProvider devuelto null.

Mi problema estaba en ProGuard. Apagar ProGuard lo solucionó para mí.

Trate de añadir a la unidad de actividad

 import android.support.v4.view.MenuItemCompat; 

He tenido el mismo problema y fue una solución.

La variable: 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); 

Esto hizo el truco conmigo … i acaba de crear mi propio shareactionprovider! Y lo pongo yo mismo, y luego conseguirlo … y tal vez theres algún código incluso eso no es necesario .. pero es un montón de casting Y asegúrese de usar los correctos todo el tiempo, si sólo escribe "ShareActionProvider" que son De hecho usando V4 ..! En lugar de V7

Debe cambiar la declaración y la definición de la función onCreateOptionsMenu. Ha cambiado la declaración de función de la de la clase base. Esto significa que el método no se anula.

Prueba esto :

 @Override public boolean onCreateOptionsMenu (Menu menu) { inflater.inflate(R.menu.share, menu);// declare a local layout inflater MenuItem shareItem = menu.findItem(R.id.action_share); ShareActionProvider mShareActionProvider = (ShareActionProvider)MenuItemCompat.getActionProvider(shareItem); mShareActionProvider.setShareIntent(getDefaultIntent()); // super.onCreateOptionsMenu(menu, inflater); <--- Remove this line or put in the first line because base class constructor should be called in the first line of the method. return super.onCreateOptionsMenu(menu);//<-- Add this line to set the menu after adding menu items } 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.