2015-08-18 18 views

Trả lời

190

Android M

mới trong Android 6.0, Spinner hiện có thông số android:popupTheme cho phép bạn thiết lập các chủ đề sử dụng cho các cửa sổ bật lên (thả xuống).

Bạn có thể sử dụng nó như vậy:

<Spinner 
    android:layout_height="wrap_content" 
    android:layout_width="match_parent" 
    android:popupTheme="@android:style/ThemeOverlay.Material.Light" /> 

Điều đó sẽ làm việc trên các thiết bị chạy mức API 23+, nhưng không phải trên các thiết bị chạy một phiên bản thấp hơn của Android.

AppCompat

Đây là nơi AppCompat do thỏa thuận. Thực hiện Spinner của nó cũng hỗ trợ popupTheme, nhưng đó là tham gia nhiều hơn một chút để có được quyền.

<Spinner 
    android:layout_height="wrap_content" 
    android:layout_width="match_parent" 
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light" /> 

Sau đó, bạn cần cập nhật Bộ điều hợp để có thể làm việc với AppCompat. Bạn làm điều đó bằng cách làm cho nó triển khai giao diện ThemedSpinnerAdapter mới.

public class MyAdapter extends BaseAdapter implements ThemedSpinnerAdapter { 

    Theme getDropDownViewTheme() { ... } 

    void setDropDownViewTheme(Theme theme) { ... } 

} 

Các phương pháp này được Spinner sử dụng để có thể nói Adapter sử dụng chủ đề nào để làm tăng bất kỳ chế độ xem thả xuống nào. Để làm điều này dễ dàng nhất có thể, chúng tôi đã cấp cho bạn một lớp học Helper mà bạn có thể cắm vào bộ điều hợp của mình.

Điều này có nghĩa rằng bộ chuyển đổi của bạn trở nên một cái gì đó như:

public class MyAdapter extends BaseAdapter implements ThemedSpinnerAdapter { 
    private final ThemedSpinnerAdapter.Helper mDropDownHelper; 

    public MyAdapter(Context context) { 
    mDropDownHelper = new ThemedSpinnerAdapter.Helper(context); 
    } 

    @Override 
    public View getDropDownView(int position, View convertView, ViewGroup parent) { 
    View view; 

    if (convertView == null) { 
     // Inflate the drop down using the helper's LayoutInflater 
     LayoutInflater inflater = mDropDownHelper.getDropDownViewInflater(); 
     view = inflater.inflate(R.layout.my_dropdown, parent, false); 
    } 

    // ... 

    return view; 
    } 

    @Override 
    public void setDropDownViewTheme(Theme theme) { 
    mDropDownHelper.setDropDownViewTheme(theme); 
    } 

    @Override 
    public Theme getDropDownViewTheme() { 
    return mDropDownHelper.getDropDownViewTheme(); 
    } 
} 
+1

Tuyệt vời! Cảm ơn bạn chris –

+0

Xin chào, tôi không thể tìm thấy ThemedSpinnerAdapter bên trong appcompat-v7. Tôi đang sử dụng phiên bản 22.2.1. Tôi có phải làm bất cứ điều gì khác để nhập khẩu không? –

+3

@DouglasAlves sử dụng mới nhất 23.0.0 – khusrav

-5

bạn có thể thử này: trong thư mục bố trí của bạn làm cho một spinner_item.xml:

<TextView 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:gravity="right" 
android:padding="10dp" 
android:background = "#ffffff" 
android:textColor="@color/primary_text" 
android:textSize="@dimen/text_size_normal" /> 

sau đó sử dụng mã này:

spinnerAdapter = new ArrayAdapter<String>(R.layout.spinner_item,items); 
+1

Vì vậy, nếu bạn đặt -1 vào lý do này, bạn không bận tâm giải thích tại sao? – Bostone

+5

Tôi đoán bởi vì nó khá rõ ràng nó không trả lời câu hỏi. Câu hỏi đặt ra là đặt chủ đề, tôi không thấy tham chiếu đến chủ đề trong câu trả lời này. Vì vậy, chúng tôi đã rõ ràng, tôi đã không downvote này, những người khác đã đi vào nó đủ rồi. – 2Dee

0

Chỉ để tham khảo nếu bạn sử dụng CursorAdapter imp của bạn lementation có thể được dễ dàng hơn nhiều, chỉ cần ghi đè newView(), không cần phải ghi đè getDropDownView() có:

@Override 
public View newView(Context context, Cursor cursor, ViewGroup parent) { 
    return mDropDownHelper.getDropDownViewInflater().inflate(R.layout.list_item, parent, false); 
} 
Các vấn đề liên quan