Android 修改 Spinner 颜色
程序员文章站
2022-07-13 16:35:38
...
本文仅对Dropdown型进行了测试
首先如果为安卓9以上,请github安装FreeReflection去除反射限制
废话不多说,直接上代码
这是设置已选择的那个文本,就是比如你点开下拉菜单选了一个值,那个选定值显示的地方
private void setViewResources(SpinnerAdapter spinnerAdapter, int resources)
{
try {
ArrayAdapter<String> arrayAdapter = (ArrayAdapter<String>) spinnerAdapter;
Field mResource = arrayAdapter.getClass().getDeclaredField("mResource");
mResource.setAccessible(true);
mResource.set(spinnerAdapter, resources);
} catch (Exception e) {
e.printStackTrace();
}
}
然后在onCreateView
里
spinner = thisView.findViewById(R.id.your_spinner);
setViewResources(spinner.getAdapter(), R.layout.spinner_selected_textview);
这是针对你在设计器里已经把数据写在arrays.xml
里的,你也可以
ArrayAdapter<String> arrayAdapter = new ArrayAdapter<>(getActivity(), R.layout.support_simple_spinner_dropdown_item, new String[]{ "data1", "data2"});
setViewResources(arrayAdapter, R.layout.spinner_selected_textview);
spinner.setAdapter(arrayAdapter);
然后在layout
里创建spinner_selected_textview.xml
,随你起什么名字
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
style="?attr/spinnerDropDownItemStyle"
android:layout_width="match_parent"
android:layout_height="?attr/dropdownListPreferredItemHeight"
android:ellipsize="marquee"
android:singleLine="true"
android:text="Test"
android:textAlignment="center"
android:textColor="#ECECEC" />
这样就会造成Adapter
在创造Dropdown Item
的时候使用的是默认的R.layout.support_simple_spinner_dropdown_item
,而创造显示选定项的时候用的是R.layout.spinner_selected_textview
。具体请看源码:
private ArrayAdapter(@NonNull Context context, @LayoutRes int resource,
@IdRes int textViewResourceId, @NonNull List<T> objects, boolean objsFromResources) {
mContext = context;
mInflater = LayoutInflater.from(context);
mResource = mDropDownResource = resource;
mObjects = objects;
mObjectsFromResources = objsFromResources;
mFieldId = textViewResourceId;
}
可见mResource = mDropDownResource = resource;
,利用反射修改mResource
,而mDropDownResource
可以直接用API修改。
public void setDropDownViewResource(@LayoutRes int resource) {
this.mDropDownResource = resource;
}
希望对你有帮助