Android 修改 Spinner 颜色

本文仅对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;
}

希望对你有帮助

原创文章 12 获赞 13 访问量 2万+

猜你喜欢

转载自blog.csdn.net/schwarzer_w/article/details/100782145