2012-06-06 33 views
13

Tôi đang cố gắng tạo chủ đề cho ứng dụng Android đầu tiên của mình và nó đang thúc đẩy tôi xoay vòng. Cuối cùng tôi đã tìm ra cách tạo kiểu cho các mục trong danh sách thả xuống, nhưng bây giờ tôi không thể thay đổi màu sắc của dải phân cách giữa các mục danh sách. Tôi đã tìm kiếm các câu hỏi tương tự trên stackoverflow và đã thử hàng tá kết hợp, nhưng không có gì có vẻ hiệu quả.Android: Không thể tạo kiểu phân cách spinner

Đây là tập tin styles.xml của tôi (viết tắt cho rõ ràng):

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

Không có vấn đề gì tôi làm, tôi chỉ nhận được một chia xám nhạt 1dp giữa các mục (mà chỉ có thể được nhìn thấy với ánh sáng của tôi màu nền danh sách mặt hàng) - không phải chiều cao cũng như màu sắc của dải phân cách bị ảnh hưởng (tôi cũng đã thử đặt nó thành hình vẽ có thể vẽ được, cũng không có hiệu lực). Tôi đang làm gì sai?

Trả lời

25

Tôi có một Hoạt động rất đơn giản với Spinner và nó hoạt động như sau. Sự khác biệt duy nhất tôi thấy là bạn có <item name="android:height">3dp</item> và tôi hoàn toàn không có.

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

và Hoạt động của tôi, tôi có:

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

và sau đó cho bố trí chính tôi có XML sau:

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

Dưới đây là ảnh chụp màn hình

sample activity screnshot

Nếu bạn không thể làm cho nó hoạt động ở đó, tôi có thể đẩy toàn bộ thứ đó lên một repo github cho bạn.

+0

Cảm ơn bạn đã trả lời - dự án đó đã được chuyển sang ngay bây giờ và tôi không có thời gian để kiểm tra ví dụ của bạn, nhưng tôi vẫn sẵn sàng trả lời câu trả lời của bạn. – Russ

+1

FYI: Câu hỏi có @ trước khi android theo kiểu thả xuống của trình quay tròn, câu trả lời không có. – csga5000

1

Bạn có thể thêm một đường ngang vào bố cục thả xuống mà bạn sử dụng để tạo dải phân cách hiệu quả.

EDIT

Một số thêm: tìm kiếm này thấy điều này:

SO Answer

Mà về cơ bản nói những gì bạn thấy bạn đang cố gắng làm ở trên nên làm việc ... mặc dù nó đề cập đến thiết lập phong cách mà trong chủ đề hoạt động của bạn và bạn không đề cập đến việc đó.

+0

Cảm ơn bạn đã trả lời. Chủ đề tôi đã đăng ở trên là chủ đề hoạt động và các yếu tố khác trong tác phẩm chủ đề đều hoạt động. Tôi đã nghĩ đến việc sử dụng một hình ảnh với một đường thẳng làm nền của vật phẩm, nhưng tôi muốn học cách 'thích hợp' để làm những việc thay vì giả mạo nó. – Russ

+0

Tôi có thể hiểu được tình cảm đó. :) Thật không may, tôi không có một câu trả lời/ý tưởng tốt hơn vào lúc này. – Barak

0

Phương thức kiểu trong câu trả lời được chấp nhận hoạt động tốt cho đến khi bạn cần hai người quay với các màu chia khác nhau.

Dưới đây là những gì tôi tìm thấy tác phẩm như một sự thay thế:

a) Thiết lập các thuộc tính popupBackgroundColor trên spinner với màu sắc mà bạn muốn cho chia. Thao tác này sẽ tô màu nền của toàn bộ mục danh sách (bao gồm cả không gian mà chúng tôi nghĩ là dải phân cách).

b) Đặt bộ điều hợp spinners dropDownViewResource thành CheckedTextView với thuộc tính nền được đặt thành một số màu khác (hoặc bộ chọn nếu bạn muốn các mục đã chọn có màu khác). Thao tác này sẽ ghi đè màu mà chúng tôi đặt ở bước a cho mọi thứ trừ dải phân cách. cho chúng ta kết quả mong muốn một cách hiệu quả.

Vì vậy, bạn sẽ có:

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

bố trí/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" /> 

nét spinner của bạn:

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

Và cuối cùng định nghĩa bộ chuyển đổi mảng của bạn:

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

Xin lưu ý rằng thiết lập popupBackgroundColor không có tác dụng nếu spinner là trong dialog mode.

1

Bạn có thể làm điều đó trong Layout.xml bạn

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

STYLES XML ADD nó

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

Thêm vào Hoạt động Theme của bạn

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

Hãy cho tôi biết nếu nó hữu ích cho bạn! Chúc một ngày tốt lành!

Các vấn đề liên quan