2012-06-06 7 views
13

Ich versuche, ein Thema für meine erste Android-App zu erstellen, und es treibt mich um die Ecke. Ich habe es schließlich geschafft, herauszufinden, wie man Artikel in einer Dropdown-Liste formatiert, aber jetzt kann ich die Farbe der Trennlinie zwischen Listenelementen nicht ändern. Ich habe ähnliche Fragen zu Stackoverflow gestellt und Dutzende von Kombinationen ausprobiert, aber nichts scheint zu funktionieren.Android: Kann Spinner Divider nicht stylen

Hier ist meine styles.xml-Datei (aus Gründen der Übersichtlichkeit abgekürzt):

<?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> 

Egal was ich tue, bekomme ich nur ein 1 dp hellgrau Teiler zwischen den einzelnen Posten (die mit meinem Licht kann kaum gesehen gefärbt list item background) - weder die Höhe noch die Farbe des Teilers wird jemals beeinflusst (ich habe auch versucht, es auf einen Drawable zu setzen, auch ohne Effekt). Was mache ich falsch?

Antwort

25

Ich habe eine sehr einfache Aktivität mit dem Spinner und es funktioniert für die folgenden. Der einzige Unterschied, den ich sehe, ist, dass Sie eine <item name="android:height">3dp</item> haben und ich das überhaupt nicht habe.

<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> 

und in meiner Tätigkeit habe ich:

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); 

und dann für das Hauptlayout ich folgende XML haben:

<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> 

Hier ist der Screenshot

sample activity screnshot

Wenn Sie es von dort nicht zur Arbeit bringen können, kann ich das Ganze zu einem github Repo für Sie hochschieben.

+0

Vielen Dank für Ihre Antwort - dieses Projekt ist jetzt weitergegangen und ich habe momentan keine Zeit, Ihr Beispiel zu testen, aber ich habe Ihre Antwort trotzdem hochgepfiffen, danke. – Russ

+1

FYI: Die Frage hat ein @ vor Android im Spinner Dropdown-Stil, die Antwort nicht. – csga5000

1

Sie können dem Dropdown-Layout, das Sie verwenden, eine horizontale Linie hinzufügen, wodurch effektiv ein Teiler erstellt wird.

SO Answer

die im Grunde sagt, was Sie versuchen, oben zu tun, Sie zeigen sollte ... arbeiten, obwohl es Einstellung erwähnt, dass Stil in:

EDIT

Einige weitere dieser gefunden entsprechend Ihre Aktivität Thema und Sie erwähnen das nicht tun.

+0

Vielen Dank für Ihre Antwort. Das Thema, das ich oben gepostet habe, ist das Aktivitätsthema und andere Elemente im Thema funktionieren in der Aktivität. Ich dachte daran, ein Bild mit einer Linie als Hintergrund für den Gegenstand zu verwenden, aber ich würde lieber die "richtige" Art und Weise lernen, Dinge zu tun, anstatt sie zu manipulieren. – Russ

+0

Ich kann dieses Gefühl verstehen. :) Leider habe ich im Moment keine bessere Antwort/Idee. – Barak

0

Die Stilmethode in der akzeptierten Antwort funktioniert gut, bis Sie zwei Spinner mit unterschiedlichen Teilerfarben benötigen.

Hier ist, was ich Werke als Alternative gefunden:

a) Stellen Sie die popupBackgroundColor Attribut auf dem Spinner auf die Farbe, die Sie für den Teiler wollen. Dadurch wird der Hintergrund des gesamten Listenelements eingefärbt (einschließlich des Bereichs, den wir als Teiler betrachten).

b) Legen Sie die Spinner-Adapter dropDownViewResource als CheckedTextView fest, wobei das Hintergrundattribut auf eine andere Farbe eingestellt ist (oder ein Selektor, wenn die ausgewählten Elemente eine andere Farbe haben sollen). Dies überschreibt die Farbe, die wir in Schritt a für alles außer dem Teiler festgelegt haben. das gibt uns effektiv das gewünschte Ergebnis.

So haben Sie:

ziehbar/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> 

Layout/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" /> 

Ihre Spinner Definition:

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

Und Ihre Array Adapter Definition schließlich:

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

Bitte beachten Sie, dass die popupBackgroundColor Einstellung hat keine Wirkung, wenn die Spinner in dialog mode ist.

1

Sie können es in Ihrem 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" /> 

XML STYLES ADD es

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

in Ihre Aktivität Theme

 <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)); 

Lassen Sie mich wissen, ob es für Sie nützlich gewesen war! Einen schönen Tag noch!