Làm cách nào để đặt một chủ đề khác cho menu thả xuống của Spinner?


102

Một ví dụ sử dụng:

nhập mô tả hình ảnh ở đây

Spinner có chủ đề tối, nhưng tôi muốn danh sách thả xuống có chủ đề sáng.

Câu trả lời:


195

Android M

Mới trong Android 6.0, Spinner hiện có android:popupThemetham số cho phép bạn đặt chủ đề được sử dụng cho 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ẽ hoạt động trên các thiết bị chạy API cấp 23+, nhưng không hoạt động trên các thiết bị chạy phiên bản Android thấp hơn.

AppCompat

Đây là lúc AppCompat xuất hiện. Việc triển khai Spinner của nó cũng hỗ trợ popupTheme, nhưng cần nhiều hơn một chút để làm đúng.

<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ủa mình để có thể hoạt động với AppCompat. Bạn làm điều đó bằng cách làm cho nó triển khai ThemedSpinnerAdaptergiao diện 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ể cho Bộ điều hợp biết chủ đề nào sẽ sử dụng để thổi phồ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 đã cung cấp cho bạn một Helperlớp 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 là bộ điều hợp của bạn trở thành một cái gì đó giống 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();
  }
}

Xin chào, tôi không 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 gì khác để nhập nó không?
Douglas Alves

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

Có vẻ như Android Studio không biết về ứng dụng: popupTheme Spinner thuộc tính: "Tiền tố không gian tên không mong muốn" ứng dụng "được tìm thấy cho thẻ Spinner". Lint cũng không thành công với cùng một lỗi.
makovkastar

1
@Chris Banes: Nó cung cấp danh sách thả xuống với nền tối, bất kể chủ đề bạn sử dụng là gì.
Ashwin

2
nó có nên sử dụng "android.support.v7.widget.AppCompatSpinner" thay vì "spinner" trong xml không?
Angel Koh

2

đối với mũi tên của spinner mà tôi đã sử dụng, android:backgroundTint="@color/white"nó sẽ hoạt động từ API 21

cho chế độ xem spinner và chế độ xem thả xuống:

ArrayAdapter<Area> areasAdapter = new ArrayAdapter<Area>(getContext(),R.layout.spinner_item, areas);

areasAdapter.setDropDownViewResource(R.layout.dropdwon_item);
areasSpinner.setAdapter(areasAdapter);

đối với getView () , bộ điều hợp sẽ sử dụng spinner_item.xml

đối với getDropDownView () , bộ điều hợp sẽ sử dụng dropdwon_item.xml

thì bạn có thể sử dụng bố cục tùy chỉnh của mình theo ý muốn

hy vọng nó giúp


0

Chỉ để tham khảo nếu bạn sử dụng việc CursorAdaptertriển khai của bạn có thể dễ dàng hơn nhiều, chỉ cần ghi đè newView(), không cần ghi đè getDropDownView()ở đó:

@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
    return mDropDownHelper.getDropDownViewInflater().inflate(R.layout.list_item, parent, false);
}

-6

bạn có thể thử điều này: trong thư mục bố cục của bạn, hãy tạo 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);

6
Tôi đoán vì nó khá rõ ràng là nó không trả lời câu hỏi. Câu hỏi là về cách đặt chủ đề, tôi không thấy đề cập đến chủ đề trong câu trả lời này. Chỉ để chúng ta rõ ràng, tôi đã không tán thành điều này, những người khác đã làm đủ rồi.
2Dee
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.