欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

希望对你有帮助