2012-05-31 9 views
15

Sto provando a impostare l'icona ShareActionProvider, è necessario un bianco fisso anziché quello semitrasparente bianco.Impostazione di un'icona di condivisione personalizzata sulla barra delle azioni ShareActionProvider

Tuttavia, l'impostazione in share_menu.xml e il codice non funzionano. Basta chiedersi se qualcuno ha risolto questo problema prima di estendere ShareActionProvider. (Sto usando ActionBarSherlock)

@Override 
public void onCreateOptionsMenu(final Menu menu, final MenuInflater inflater) { 
    inflater.inflate(R.menu.share_menu, menu); 
    MenuItem actionItem = menu.findItem(R.id.share_action_provider); 

    ShareActionProvider actionProvider = (ShareActionProvider) actionItem.getActionProvider(); 
    actionProvider.setShareIntent(mShareIntent); 

    // re-setting the icon as it's not being picked up from the menu xml file 
    actionItem.setIcon(R.drawable.ic_action_share); 

    super.onCreateOptionsMenu(menu, inflater); 

} 

share_menu.xml

<item android:id="@+id/share_action_provider" 
     android:showAsAction="ifRoom" 
     android:title="@string/share_with" 
     android:icon="@drawable/ic_action_share" 
     android:actionProviderClass="com.actionbarsherlock.widget.ShareActionProvider" /> 

Aggiornamento: provato anche l'impostazione nello stile, ma nessuna gioia

<style name="Theme.MyApp" parent="Theme.Sherlock.Light"> 
     <item name="actionModeStyle">@style/ActionModeStyle</item> 
     <item name="android:actionModeStyle">@style/ActionModeStyle</item> 
</style> 

<style name="ActionModeStyle" parent="Widget.Sherlock.ActionMode"> 
     <item name="actionModeShareDrawable">@drawable/ic_action_share</item> 
    </style> 

risposta

17

quando sto cercando di personalizzare la barra delle azioni, di solito il primo posto che guardo sono i temi e gli stili di ActionBarSherlock.

Ho trovato che il tema Sherlock utilizza "actionModeShareDrawable" come trovato nel file theme.xml.

Provare a modificare il tema per includere direttamente l'elemento "actionModeShareDrawable".

<style name="Theme.MyApp" parent="Theme.Sherlock.Light"> 
    <item name="actionModeShareDrawable">@drawable/ic_action_share</item> 
</style> 
+8

Funzionerà solo perché la versione interna è utilizzata su tutte le piattaforme. Il built-in 'ShareActionProvider' utilizza una risorsa non pubblica per specificare il drawable, quindi questa soluzione è molto specifica per ActionBarSherlock. –

+3

L'aggiunta di actionModeShareDrawable al tema principale sembra funzionare sia su gingerbread che su ics. – scottyab

+2

Non ha fatto alcuna differenza per me su JB o GB. –

1

È possibile sovrascrivere l'attributo non pubblico come questo.

<style name="Theme.MyApp" parent="android:Theme.Holo"> 
     <item name="*android:actionModeShareDrawalbe">@drawable/icon</item> 
</style> 

(*) significa riferimento alle risorse non pubbliche in Android

+1

Questa opzione causa arresti anomali su vari dispositivi. È altamente sconsigliato utilizzare attributi Android non pubblici. –

+3

Quindi c'è una soluzione per i temi non Sherlock? Sto usando un tema personalizzato che estende Holo.Light. Il fatto è che la mia icona di azione condivisa deve essere bianca invece di icona grigio scuro di Holo.Light. Ho provato a eseguire l'override dell'attributo non pubblico come mostrato, ma il mio dispositivo si arresta in modo anomalo all'avvio. Non è necessario testare ulteriormente :). Quindi ... qualsiasi altra soluzione? – bajicdusko

7

Per AppCompat sono necessarie le modifiche al 2 stili:

1)

<style name="MyAppTheme" parent="@style/Theme.AppCompat.Light.DarkActionBar"> 
    <item name="actionBarWidgetTheme">@style/Theme.AppCompat.CustomShareIcon</item> 
    <item name="android:actionBarWidgetTheme">@style/Theme.AppCompat.CustomShareIcon</item> 
</style> 

In altre parole , specificando attr:actionModeShareDrawable nel tuo MyAppTheme non è quello che ti serve veramente, ma dovrebbe essere menzionato nel tuo attr:actionBarWidgetTheme come segue:

2)

<style name="Theme.AppCompat.CustomShareIcon" parent="@style/Theme.AppCompat"> 
    <item name="actionModeShareDrawable">@drawable/abc_ic_menu_share_holo_dark</item> <!-- your icon goes here --> 
</style> 
6

UPDATE: Dimenticate il modo TRICKY di seguito, appena sotto-classe ShareActionProvider, restituire nulla in onCreateActionView metodo, e di fornire la propria icona nel file di menu.xml, tutto andrà bene

===========================

ho trovato un modo molto difficile ma nessuno-ActionBarSherlock-specifica :

  1. sottoclasse ShareActionProvider, con solo un piccolo trucco:

    @Override 
    public View onCreateActionView() { 
        View target = super.onCreateActionView(); 
        ViewGroup viewGroup = (ViewGroup) LayoutInflater.from(context).inflate(R.layout.actionbutton_share, null); 
        ImageView overlay = (ImageView) viewGroup.findViewById(R.id.overlay); 
        ViewGroup container = (ViewGroup) viewGroup.findViewById(R.id.container); 
        container.addView(target); 
        container.getLayoutParams().width = overlay.getLayoutParams().width; 
        container.getLayoutParams().height = overlay.getLayoutParams().height; 
        return viewGroup; 
    } 
    
  2. Creare un file di layout (R.layout.actionbutton_share), che pongono la vista originale in alto, ma trasparente per l'utente (Si noti la " Android: alpha = 0" parte):

    <?xml version="1.0" encoding="utf-8"?> 
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
        xmlns:tools="http://schemas.android.com/tools" 
        android:layout_width="wrap_content" 
        android:layout_height="match_parent" 
        android:orientation="vertical" > 
    
        <FrameLayout 
         android:id="@+id/container" 
         android:layout_width="wrap_content" 
         android:layout_height="wrap_content" 
         android:layout_centerHorizontal="true" 
         android:layout_centerVertical="true" 
         android:alpha="0" /> 
    
        <ImageView 
         android:id="@+id/overlay" 
         android:layout_width="wrap_content" 
         android:layout_height="wrap_content" 
         android:layout_centerHorizontal="true" 
         android:layout_centerVertical="true" 
         android:layout_marginLeft="7dp" 
         android:layout_marginRight="7dp" 
         android:src="@drawable/yours_whatever_share_icon" 
         tools:ignore="ContentDescription" /> 
    
    </RelativeLayout> 
    
  3. Utilizzare lo ShareActionProvider violato nel menu.

+0

Super. L'override e il ritorno Null hanno funzionato magnificamente – LumberHack

+1

L'idea null ereditata e di ritorno dovrebbe essere composta da una propria risposta. Ha funzionato per me. Il modo in cui questa risposta è scritta all'inizio è confuso. –

3

vivimice 's soluzione file XML è buona, ma l'icona dell'ultima app utilizzato per la condivisione diventa nascosto troppo.

ho fatto icona di condivisione personalizzato come voce di menu comune senza alcun ShareActionProvider, giusto in onOptionsItemSelected() il metodo utilizzato questo codice:

Intent sendIntent = new Intent(); 
sendIntent.setAction(Intent.ACTION_SEND); 
sendIntent.putExtra(Intent.EXTRA_TEXT, "This is my text to send."); 
sendIntent.setType("text/plain"); 
startActivity(Intent.createChooser(sendIntent, getResources().getText(R.string.send_to))); 

Non crea un menu a comparsa, ma una finestra di selezione.