12

sto usando ActionBarSherlock e sto cercando di personalizzare il activatedBackgroundIndicator attributo per lo sfondo fila.sfondo personalizzato per activatedBackgroundIndicator su ActionBarSherlock non funziona

Se io uso l'ultimo SDK di Android, senza la ActionBarSherlock, sono in grado di personalizzare lo sfondo creando il seguente stile su res/valori/style.xml e definendo su AndroidManifest.xml come android: theme = "@ stile/Theme.Custom":

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <style name="Theme.Custom" parent="android:Theme.Holo.Light.DarkActionBar"> 
    <item name="android:activatedBackgroundIndicator">@drawable/activated_background</item> 
    </style> 
</resources> 

Poi, i miei res/drawable/activated_background.xml contiene il codice seguente:

<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_activated="true" android:drawable="@color/row_activated" /> 
    <item android:drawable="@android:color/transparent" /> 
</selector> 

Infine, il codice utilizzato per definire ciascuna riga in ListView è:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:orientation="vertical" 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" 
       android:background="?android:attr/activatedBackgroundIndicator"> 
    <TextView 
      android:id="@+id/test_row" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:text="@string/sample_string" 
      android:textAppearance="?android:attr/textAppearanceMedium" 
      android:padding="15dp"/> 
</LinearLayout> 

Il risultato è mostrato sul screenshoot. È una semplice applicazione con un solo ListView con ListView.CHOICE_MODE_SINGLE e getListView(). SetItemChecked (posizione, vero) quando si fa clic sulla voce di elenco.

Il colore blu della riga selezionata standard ora è giallo e funziona perfettamente.

List without ABS

Il problema appare quando voglio applicare la stessa personalizzazione utilizzando l'ActionBarSherlock. Ora il file di stile è il successivo e lo sfondo appare blu invece del giallo personalizzato.

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <style name="Theme.Custom" parent="Theme.Sherlock.Light.DarkActionBar"> 
     <item name="activatedBackgroundIndicator">@drawable/activated_background</item> 
     <item name="android:activatedBackgroundIndicator">@drawable/activated_background</item> 
    </style> 

    <style name="activatedBackgroundIndicator"> 
     <item name="android:background">?android:attr/activatedBackgroundIndicator</item> 
    </style> 
</resources> 

List with ABS

non so se ActionBarSherlock sostiene il Android: activatedBackgroundIndicator funzione o se ho dimenticato di implementare qualcosa di necessario per essere in grado di cambiare il colore predefinito.

Qualche idea?

+1

ActionBarSherlock supporta l'attributo activatedBackgroundIndicator. Inoltre, perché hai uno stile chiamato "activatedBackgroundIndicator" definito nel tuo XML? –

+0

Ho cercato progetti che implementano questa funzionalità e ho trovato [Put.io] (https://github.com/DSteve595/Put.io/blob/master/res/values/styles.xml) lo sta usando. – mlabraca

+0

Ho aggiunto lo stile cercando di farlo funzionare, ma se non è necessario lo cancellerò. Quindi @ Alex-Fu, l'implementazione utilizzando ActionBarSherlock deve essere la stessa di default? – mlabraca

risposta

10

Infine ho trovato la soluzione al problema.
Era il contesto utilizzato nell'adattatore di riga. Il costruttore utilizzato è l'mostrato nel seguente frammento di codice:

public RowAdapter(Activity activity, ArrayList<String> list) { 
    this.mContext = activity.getApplicationContext(); 
    this.elements = list; 
    this.theActivity = activity; 

    this.inflater = (LayoutInflater) this.mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
} 

Basta cambiare il contesto da:
this.mContext = activity.getApplicationContext() (Application-Context)
a
this.mContext = activity.getBaseContext() (Attività-Context)
risolto il problema e ora lo sfondo è quello personalizzato.

Se ha bisogno di manipolare Visualizzazioni poi andare per Activity-Context, altrimenti Application-Context sarebbe sufficiente.

Questo answer aiutato a capire perché utilizzare getBaseContext() al posto digetApplicationContext() nel mio caso.

custom row background

Problemi correlati