Icono personalizado de Android ShareActionProvider?

Estoy utilizando un ShareActionProvider, pero quiero personalizar el icono (quiero cambiar el color, porque en la actualidad, es blanco).

Estoy usando este código:

mShareActionProvider = (ShareActionProvider) item.getActionProvider(); Intent myIntent = new Intent(Intent.ACTION_SEND); myIntent.setType("text/plain"); myIntent.putExtra(Intent.EXTRA_TEXT, str_share); mShareActionProvider.setShareIntent(myIntent); 

El XML:

 <item android:id="@+id/menu_item_share" android:showAsAction="ifRoom" android:title="@string/titlePartager" android:actionProviderClass="android.widget.ShareActionProvider" android:icon="@drawable/ic_share"/> 

¿Cómo puedo cambiar el icono (o el color)?

Gracias,

Editar / Respuesta corta: si utiliza ShareActionProvider de AppCompat, sólo proporcione una nueva actionModeShareDrawable en la definición de su tema.

 <style name="MyTheme" parent="Theme.AppCompat"> <item name="actionModeShareDrawable">@drawable/my_share_drawable</item> </style> 

Si no utiliza AppCompat, este recurso se define para Lollipor o más reciente , pero no para versiones anteriores.


A continuación se muestra la respuesta del ShareActionProvider nativo (que era el ámbito original de esta pregunta).

Para cambiar esta imagen, debe cambiar el valor de actionModeShareDrawable para el tema de su aplicación. Eche un vistazo al ShareActionProvider onCreateActionView() :

 public View onCreateActionView() { // Create the view and set its data model. ... // Lookup and set the expand action icon. TypedValue outTypedValue = new TypedValue(); mContext.getTheme().resolveAttribute(R.attr.actionModeShareDrawable, outTypedValue, true); Drawable drawable = mContext.getResources().getDrawable(outTypedValue.resourceId); ... 

Lamentablemente, este atributo no es público en el marco de Android (aunque lo es si se utilizan bibliotecas de compatibilidad, como AppCompat o ActionBarSherlock). En ese caso, es sólo cuestión de superar ese valor para el tema.

Si no está usando ninguna de estas bibliotecas, la única solución (que sé) es crear una subclase de ShareActionProvider y ShareActionProvider onCreateActionView() método onCreateActionView() . A continuación, puede utilizar cualquier dibujable que desee en su lugar.

EDIT Sin embargo esto se complica aún más por el hecho de que la implementación de onCreateActionView() utiliza otras clases que no son públicas tampoco. Para evitar duplicar una gran cantidad de código, sólo puede cambiar el icono a través de la reflexión, como esto:

 public class MyShareActionProvider extends ShareActionProvider { private final Context mContext; public MyShareActionProvider(Context context) { super(context); mContext = context; } @Override public View onCreateActionView() { View view = super.onCreateActionView(); if (view != null) { try { Drawable icon = ... // the drawable you want (you can use mContext to get it from resources) Method method = view.getClass().getMethod("setExpandActivityOverflowButtonDrawable", Drawable.class); method.invoke(view, icon); } catch (Exception e) { Log.e("MyShareActionProvider", "onCreateActionView", e); } } return view; } } 

Al igual que con cualquier solución que implique reflexión, esto puede ser quebradizo si la implementación interna de ShareActionProvider cambia en el futuro.

Para cambiar el icono de ShareActionProvider, debe extender el tema de AppCompat y establecer su icono personalizado en "actionModeShareDrawable":

 <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <item name="actionModeShareDrawable">@drawable/ic_share</item> </style> 

Usted puede cambiar color de fondo definiendo el estilo de encargo, como:

 <resources> <style name="MyTheme" parent="@android:style/Theme.Holo.Light"> <item name="android:actionBarStyle">@style/MyActionBar</item> </style> <style name="MyActionBar" parent="@android:style/Widget.Holo.Light.ActionBar"> <item name="android:background">ANY_HEX_COLOR_CODE</item> </style> </resources> 

Ahora necesitas establecer "MyTheme" como tema para la application / activity.

  • Uso de ShareActionProvider con el botón en el diseño
  • Excepción de puntero nulo al usar el proveedor de acciones de la biblioteca de soporte
  • Android: XML personalizado para ShareActionProvider
  • Comparte el menú usando android.support.v7 no muestra los iconos de las aplicaciones
  • Aspecto de ShareActionProvider
  • ActionBarSherlock & ShareActionProvider causar InflateException
  • onPrepareSubMenu en un ActionProvider personalizado nunca llamado
  • No se puede emitir de ActionProvider a ShareActionProvider
  • ActionBarSherlock problema ShareActionProvider
  • No se puede emitir Proveedor de acciones para compartir el proveedor de acciones
  • ShareActionProvider no se puede hacer clic y no se procesa correctamente en el primer procesamiento
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.