Câu trả lời:
Android M
Mới trong Android 6.0, Spinner hiện có android:popupTheme
tham 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 ThemedSpinnerAdapter
giao 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 Helper
lớ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();
}
}
đố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
Chỉ để tham khảo nếu bạn sử dụng việc CursorAdapter
triể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);
}
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);