2012-06-06 33 views
13

Estoy tratando de crear un tema para mi primera aplicación para Android, y me está llevando a la vuelta de la esquina. Finalmente me las arreglé para descubrir cómo diseñar elementos en una lista desplegable, pero ahora no puedo cambiar el color del divisor entre los elementos de la lista. He buscado preguntas similares en stackoverflow y he probado docenas de combinaciones, pero parece que nada funciona.Android: No se puede diseñar el divisor giratorio

Aquí está mi archivo styles.xml (abreviado para mayor claridad):

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <style name="MyTheme" parent="android:Theme.Light"> 
    <item name="android:spinnerStyle">@style/spinnerStyle</item> 
    <item name="android:spinnerDropDownItemStyle">@style/spinnerDropDownItemStyle</item>  
    <item name="android:dropDownListViewStyle">@style/spinnerListViewStyle</item> 
    </style> 

    <style name="spinnerStyle" parent="@android:style/Widget.Spinner"> 
     <item name="android:background">@drawable/my_theme_spinner</item> 
    </style> 

    <style name="spinnerDropDownItemStyle" parent="@android:style/Widget.DropDownItem.Spinner"> 
     <item name="android:background">@drawable/my_theme_spinner_item</item> 
     <item name="android:paddingLeft">5dp</item> 
     <item name="android:gravity">center_vertical</item> 
    </style> 

    <style name="spinnerListViewStyle" parent="@android:style/Widget.ListView.DropDown"> 
     <item name="android:height">3dp</item> 
     <item name="android:dividerHeight">3dp</item> 
     <item name="android:divider">@color/divider</item> 
    </style> 
</resources> 

No importa lo que hago, acabo de recibir un divisor de color gris claro 1DP entre los elementos (que apenas se puede ver con mi luz coloreada enumerar el fondo del elemento): ni la altura ni el color del divisor se ven afectados (también intenté configurarlo como un dibujable, también sin ningún efecto). ¿Qué estoy haciendo mal?

Respuesta

25

Tengo una actividad muy simple con el Spinner y funciona para lo siguiente. La única diferencia que veo es que tienes un <item name="android:height">3dp</item> y no tengo eso en absoluto.

<style name="TestSpinnerStyle" parent="android:style/Widget.ListView.DropDown"> 
    <item name="android:divider">#ff0000</item> 
    <item name="android:dividerHeight">5dp</item> 
</style> 


<style name="SampleTheme" parent="@android:style/Theme.Holo.Light"> 
    <item name="android:dropDownListViewStyle">@style/TestSpinnerStyle</item> 
</style> 

y en mi actividad que tengo:

Spinner spinner = (Spinner) findViewById(R.id.spinner); 
    List<String> list = new ArrayList<String>(); 
    list.add("list 1"); 
    list.add("list 2"); 
    list.add("list 3"); 
    ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this, 
      android.R.layout.simple_spinner_item, list); 
    dataAdapter.setDropDownViewResource(android.R.layout.simple_dropdown_item_1line); 
    spinner.setAdapter(dataAdapter); 

y luego para el diseño principal que tengo el siguiente código XML:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:orientation="vertical" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent" 
     > 
    <TextView 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:text="Hello World, StylingActivity" 
      /> 
    <Spinner android:id="@+id/spinner" 
      android:layout_width="250dp" 
      android:layout_height="40dp" 
      /> 
</LinearLayout> 

Aquí está la captura de pantalla

sample activity screnshot

Si no puede hacer que funcione desde allí, puedo subir todo a un repositorio de Github para usted.

+0

Gracias por su respuesta: ese proyecto ha avanzado ahora y no tengo tiempo ahora para poner a prueba su ejemplo, pero de todos modos he remarcado su respuesta, gracias. – Russ

+1

FYI: La pregunta tiene un @ before android en el estilo desplegable de spinner, la respuesta no. – csga5000

1

Puede agregar una línea horizontal al diseño desplegable que utiliza, lo que efectivamente crearía un divisor.

EDITAR

Algunos búsqueda adicional encontrado esto:

SO Answer

Lo que básicamente dice lo que muestran que estamos tratando de hacer más arriba debería funcionar ... aunque menciona el establecimiento de ese estilo en su actividad tema y usted no menciona hacer eso.

+0

Gracias por responder. El tema que publiqué arriba es el tema de la actividad, y otros elementos del tema funcionan bien en la actividad. Pensé en usar una imagen con una línea como fondo del elemento, pero prefiero aprender la manera "adecuada" de hacer las cosas en lugar de manipularlo. – Russ

+0

Puedo entender ese sentimiento. :) Desafortunadamente, no tengo una mejor respuesta/idea en este momento. – Barak

0

El método de estilo en la respuesta aceptada funciona bien hasta que necesite dos rotuladores con diferentes colores divisores.

Aquí es lo que he encontrado obras como alternativa:

a) Establecer el atributo popupBackgroundColor en el controlador para el color que desee para el divisor. Esto coloreará el fondo de todo el elemento de la lista (incluido el espacio que consideramos el divisor).

b) Configure los adaptadores giratorios dropDownViewResource para que sean CheckedTextView con su atributo de fondo establecido en algún otro color (o un selector si desea que los elementos seleccionados tengan un color diferente). Esto anulará el color que establecemos en el paso a para todo menos el divisor. efectivamente dándonos el resultado deseado.

por lo que tendrá:

estirable/spinner_dropdown_background_selector:

<?xml version="1.0" encoding="utf-8"?> 

<selector xmlns:android="http://schemas.android.com/apk/res/android"> 

    <item android:drawable="@color/your_unchecked_color" android:state_checked="false"/> 
    <item android:drawable="@color/your_checked_color" android:state_checked="true"/> 
    <item android:drawable="@color/your_unchecked_color"/> 

</selector> 

diseño/drop_down_item.xml:

<?xml version="1.0" encoding="utf-8"?> 
<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android" 
      android:id="@android:id/text1" 
      android:background="@drawable/spinner_dropdown_background_selector" 
      android:textColor="@android:color/white" 
      android:singleLine="true" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:ellipsize="marquee" /> 

Su spinner definición:

<Spinner 
     ... 
     android:popupBackground="@color/your_divider_color"    
     ... 
     /> 

Y por último la matriz de definición adaptador:

ArrayAdapter<String> dataAdapter = new ... 
dataAdapter.setDropDownViewResource(android.R.layout.drop_down_item); 
spinner.setAdapter(dataAdapter); 

Tenga en cuenta que la fijación de la popupBackgroundColor no tiene efecto si la ruleta está en dialog mode.

1

Puede hacerlo en su layout.xml

 <Spinner 
       android:id="@+id/sp_to_create" 
       android:layout_width="match_parent" 
       android:layout_height="32dp" 
       android:layout_marginBottom="10dp" 
       style="@style/spinner_style" 
       android:prompt="@string/to_type_prompt" /> 

ESTILOS XML añadirlo

<style name="spinner_style" parent="Widget.AppCompat.ListView.DropDown"> 
    <item name="android:divider">#d1d1d1</item> 
    <item name="android:dividerHeight">0.5dp</item> 
</style> 

Añadir a su tema Actividad

 <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> 
      <item name="android:dropDownListViewStyle">@style/spinner_style</item> 
</style> 

JAVA FIL E

your_spinnerList.setAdapter(new ArrayAdapter<>(getActivity(), android.R.layout.simple_dropdown_item_1line, timeOff_type_list)); 

Avísame si hubiera sido útil para usted! ¡Que tengas un buen día!

Cuestiones relacionadas