2014-04-16 8 views
11

Questa domanda è stata posta molto su SO e ho fatto riferimento a tutte le risposte. Sono ancora lasciato con lo sfondo blu Holo predefinito per gli elementi selezionati nel mio cassetto di navigazione. Sono nuovo di Java e sono confuso circa la parte "contesto" di .setAdapter().
Il mio progetto è una singola attività con più frammenti scambiati utilizzando il cassetto di navigazione.Colore di sfondo personalizzato per l'elemento selezionato con "activeBackgroundIndicator" Cassetto di navigazione

Ecco il mio adattatore:

mDrawerListView.setAdapter(new ArrayAdapter<String>(
      // First parameter - Context 
      getActionBar().getThemedContext(), 
      // Second parameter - Layout for the row 
      R.layout.fragment_navigation_drawer_list_item, 
      // Third parameter - ID of the TextView to which the data is written 
      android.R.id.text1, 
      // Forth - the Array of data 
      new String[]{ 
        getString(R.string.title_section1), 
        getString(R.string.title_section2), 
        getString(R.string.title_section3), 
        getString(R.string.title_section4), 
      })); 
    mDrawerListView.setItemChecked(mCurrentSelectedPosition, true); 

Il contesto ecco che arriva dal cassetto di navigazione "precotti" in Android Studio. Ho pensato che questa sarebbe stata la risposta Navigation Drawer item background colour for selected item. Così ho cambiato il mio contesto in getActivity().getBaseContext(),, ma questo non ha cambiato nulla.

Il mio tema (styles.xml):

<resources> 
    <style name="AppBaseTheme" parent="@style/Theme.AppCompat.Light.DarkActionBar"> 
     <!-- API 14 theme customizations can go here. --> 
     <item name="android:actionBarStyle">@style/ActionBar</item> 
    </style> 

    <!-- Navigation Drawer styling --> 
    <style name="NavDrawerItemSelected" parent="AppBaseTheme"> 
     <item name="android:activatedBackgroundIndicator">@drawable/activated_background</item> 
    </style> 
</resources> 

activated_background a dir 'drawable':

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

non so che di quegli stati di cui sopra dovrebbe essere utilizzato, così ho aggiunto tutti quelli che ho potuto trovare.
Infine, quando viene selezionato un articolo, viene chiamato mDrawerListView.setItemChecked(position, true);.
Tutto funziona, tranne lo stile tema personalizzato. (min API = 11, testing su API 17 AVD)

risposta

24

Ho incontrato questo problema esatto. Il problema è che lo sfondo di R.layout.fragment_navigation_drawer_list_item è ciò che deve essere cambiato in Drawable. Basta aggiungere android:background="@drawable/activated_background" al layout.

+0

Grazie! Non posso credere di non averlo incontrato in altre risposte. Precedentemente avevo 'android: background =? Android: activatedBackgroundIndicator'. – Flash

+0

INFINE! grazie amico .. –

+1

questa è la risposta più semplice e chiara a questo Q on SO. – u2tall

9

non ero in grado di trovare una risposta chiara completa a questa domanda, ecco che è:

Fase 1. Specificare l'elemento della lista layout di scheda utilizzerà, in questo esempio stiamo specificando: R.layout.fragment_navigation_drawer_list_item

come così:

mDrawerListView.setAdapter(new ArrayAdapter<String>(
     // First parameter - Context 
     getActionBar().getThemedContext(), 
     // Second parameter - Layout for the row 
     R.layout.fragment_navigation_drawer_list_item, 
     // Third parameter - ID of the TextView to which the data is written 
     android.R.id.text1, 
     // Forth - the Array of data 
     new String[]{ 
       getString(R.string.title_section1), 
       getString(R.string.title_section2), 
       getString(R.string.title_section3), 
       getString(R.string.title_section4), 
     }))` 

Passo 2. Creare e personalizzare fragment_navigation_drawer_list_item.xml per specificare un drawable che avrà un selettore in questo modo: android:background="@drawable/activated_background" esempio completo:

<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@android:id/text1" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:textAppearance="?android:attr/textAppearanceListItemSmall" 
    android:gravity="center_vertical" 
    android:paddingStart="?android:attr/listPreferredItemPaddingStart" 
    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd" 
    android:minHeight="?android:attr/listPreferredItemHeightSmall" 
    android:background="@drawable/activated_background" /> 

Fase 3. Crea e personalizza il selettore nel file activated_background.xml proprio come nella questione, che sarà simile a questa:

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