2014-05-24 16 views
5

sto usando un ShareActionProvider, ma voglio personalizzare l'icona (voglio cambiare il colore, perché al momento è bianco).Icona personalizzata Android ShareActionProvider?

sto usando questo codice:

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

L'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"/> 

come posso cambiare l'icona (o colore)?

thx,

risposta

7

Modifica/Risposta breve: se si utilizza ShareActionProvider di AppCompat, fornire semplicemente un nuovo actionModeShareDrawable nella definizione del tema.

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

Se non utilizzando AppCompat, poi this resource is defined for Lollipor or newer, ma non per le versioni precedenti.


Qui di seguito è la risposta per il nativo ShareActionProvider (che era lo scopo originale di questa domanda).

Per modificare questa immagine, è necessario modificare il valore di actionModeShareDrawable per il tema dell'app. Date un'occhiata al metodo di 's il ShareActionProvideronCreateActionView():

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

Purtroppo questo attributo è non pubblico nel quadro Android (anche se è se librerie di compatibilità che utilizzano, come AppCompat o ActionBarSherlock). In tal caso, è solo una questione di ignorare quel valore per il tema.

Se non si utilizza nessuna di queste librerie, l'unica soluzione (che io sappia) è creare una sottoclasse di ShareActionProvider e reimplementare il metodo onCreateActionView(). Puoi quindi utilizzare qualsiasi cosa drawable desideri.

EDIT Tuttavia questo è ulteriormente complicato dal fatto che l'implementazione di onCreateActionView() utilizza altre classi che non sono pubbliche. Per evitare di ripetere un sacco di codice, si può semplicemente cambiare l'icona attraverso la riflessione, in questo modo:

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

Come con tutte le soluzioni che coinvolgono la riflessione, questo può essere fragile se l'implementazione interna di ShareActionProvider modifiche in futuro.

+0

mhhh, non capisco come reimplementare la vista oncreateaction, qual è il codice iniziale in questa funzione? – deveLost

+0

@devLost Il codice originale è https://github.com/android/platform_frameworks_base/blob/master/core/java/android/widget/ShareActionProvider.java Sei sicuro che non stai utilizzando la libreria 'appcompat'? Perché se lo facessi, sarebbe molto più facile, questo approccio implica la duplicazione di un sacco di codice framework. – matiash

+0

mhh, ho provato a modificare questo codice, per cambiare il drawable, ma ho avuto molti errori. Ci riproverò. Cosa cambia se importo la libreria appcompat? – deveLost

0

È possibile modificare il colore di sfondo attraverso la definizione di stile personalizzato, come:

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

Ora è necessario impostare "MyTheme" come tema per application/activity.

+0

Io non voglio cambiare il colore di sfondo:/ – deveLost

+0

il tema Sherlock usa "actionModeShareDrawable" come si trova nel file theme.xml. Provare a modificare il tema per includere direttamente l'elemento "actionModeShareDrawable".

+0

ok, cercherò in pochi minuti, thx – deveLost

2

Per cambiare l'icona per la ShareActionProvider è necessario estendere il tema AppCompat e impostare la vostra icona personalizzata per "actionModeShareDrawable":

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