2012-09-28 19 views
11

Vedo impostare il colore del testo del pulsante di azione "done"/"close". Questo è quello che ho provato:Modalità testo pulsante di chiusura colore testo

<item name="android:actionModeCloseButtonStyle">@style/ActionModeCloseButton</item> 
.... 
<style name="ActionModeCloseButton" parent="android:style/Widget.Holo.ActionButton.CloseMode"> 
    <item name="android:textColor">@android:color/white</item> 
</style> 

ma non ha alcun effetto.

enter image description here

Si noti che il JB, basta che faccio genitore dello stile ActionModeCloseButton il tema Holo regolare. Funziona bene lì (senza l'impostazione textColor pari).

Qualche idea? Grazie.

risposta

6

Prima di tutto, la vista testuale "Fatto" è visibile solo su dispositivi di grandi dimensioni. Acquista nella fonte Android. Quindi lo android:actionModeCloseButtonStyle si applica solo alla vista contenente e non alla vista di immagini e alla vista testo.

Fortunatamente, gli ingegneri di Android hanno utilizzato gli attributi accessibili pubblicamente per gli stili di visualizzazione dei bambini.

  • Utilizzare android:actionMenuTextColor per passare a textColor di TextView.
  • Usa android:actionModeCloseDrawable per cambiare il drawable della ImageView

Esempio:

<style name="MyTheme"> 
    <item name="android:actionMenuTextColor">#ff000000</item> 
    <item name="android:actionModeCloseDrawable">@drawable/my_close_drawable</item> 
</style> 

Qui di seguito è una copia del nel layout-large -cartella dove si può vedere come il layout è costruire.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/action_mode_close_button" 
     android:focusable="true" 
     android:clickable="true" 
     android:paddingStart="8dip" 
     style="?android:attr/actionModeCloseButtonStyle" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:layout_marginEnd="16dip"> 
    <ImageView android:layout_width="48dip" 
       android:layout_height="wrap_content" 
       android:layout_gravity="center" 
       android:scaleType="center" 
       android:src="?android:attr/actionModeCloseDrawable" /> 
    <TextView android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_gravity="center" 
       android:layout_marginStart="4dip" 
       android:layout_marginEnd="16dip" 
       android:textAppearance="?android:attr/textAppearanceSmall" 
       android:textColor="?android:attr/actionMenuTextColor" 
       android:textSize="12sp" 
       android:textAllCaps="true" 
       android:text="@string/action_mode_done" /> 
</LinearLayout> 
+0

Il problema con actionMenuTextColor è che cambierà anche il colore per gli elementi della barra delle azioni "normale". – sergio91pt

+0

Questo non funziona perché l'elemento giusto da modificare è 'abs__action_mode_close_item.xml' e non' abs__action_menu_item_layout.xml'. Il problema è che "abs__action_mode_close_item.xml' non fornisce un colore del testo :(potresti facilmente risolvere il problema con ABS ma funziona solo per Androids precedente alla 4.0. Mi spiace dirlo ... – Trinimon

0

Poiché il layout per il pulsante di modalità di azione vicino non fornisce un attributo di colore per la visualizzazione del testo, non c'è modo per impostare questo colore in un tema personalizzato. Invece l'unico ay che ho trovato è stato quello di sovrascrivere il colore del testo nel metodo del mio derivato ActionMode classe onPrepareActionMode():

@Override 
public boolean onPrepareActionMode(ActionMode mode, Menu menu) { 
    new AsyncTask<Void, Void, Void>() { 
     @Override 
     protected Void doInBackground(Void... none) { 
      try { 
       Thread.sleep(100); 
      } catch (InterruptedException e) { 
      } 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void none) { 
      if (activity != null) { 
       LinearLayout layout = (LinearLayout) activity 
          .findViewById(R.id.abs__action_mode_close_button); 

       if (layout == null) { 
        int id = Resources.getSystem().getIdentifier(
             "action_mode_close_button", "id", "android"); 
        layout = (LinearLayout) activity.findViewById(id); 
       } 

       if (layout != null && layout.getChildCount() > 1) { 
        TextView label = (TextView) layout.getChildAt(1); 
        if (label != null) label.setTextColor(Color.RED); 
       } 
      } 
     } 
    }.execute(); 

    return false; 
} 

lavorato con due dispositivi di pre e post Android 4.0.

+0

Attenzione, se una versione di Android non lo fa Se hai un TextView in posizione 1, il tuo codice esploderà su quel dispositivo. Farei un'istanzaDi controllo prima di lanciarlo. – MinceMan

Problemi correlati