自定义单个View的主题
Customize theme of a single View
我需要在 Spinner
中将 Spinner
选定的项目颜色设置为白色,它位于 Toolbar
上。应用中所有其他 Spinner
的颜色应保持不变。
我试过关注
styles.xml
<style name="SpinnerOnPrimaryStyle" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:spinnerItemStyle">@style/mySpinnerItemStyle</item>
</style>
<style name="mySpinnerItemStyle" parent="android:Widget.TextView.SpinnerItem">
<item name="android:textColor">@color/text_on_primary</item>
</style>
工具栏
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar_actionbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/tab_background"
android:gravity="center_vertical"
app:theme="@style/ToolBarStyle">
<Spinner
android:id="@+id/categorySpinner"
app:theme="@style/SpinnerOnPrimaryStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp" />
</android.support.v7.widget.Toolbar>
但是,Spinner
的颜色没有改变。
如果我将基本主题的 android:spinnerItemStyle
设置为 mySpinnerItemStyle
,Spinner
颜色会发生变化。但这改变了应用程序中所有 Spinner
的颜色,我不想发生这种情况。
(以下应用主题改变了微调器的颜色,但它改变了所有微调器的颜色)
<!-- Application theme. -->
<style name="BaseTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- All customizations that are NOT specific to a particular API-level can go here. -->
<item name="android:spinnerItemStyle">@style/mySpinnerItemStyle</item>
</style>
如何只更改 Toolbar
中 Spinner
的颜色?如果我可以单独在主题中执行此操作,而无需以编程方式执行,那就更好了。
在我看来,作为 Spinner
项目的布局,您正在使用框架提供的其中一个项目,即 android.R.layout.simple_spinner_item
.
如果您看一下 source code,您会注意到它应用 style="?android:attr/spinnerItemStyle"
到它的内容视图。这意味着,当您在 activity/fragment 中初始化您的适配器时,spinnerItemStyle
将是已应用于您的 activity 主题的适配器,而不是您在 xml
:
ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, list);
你有两个选择。
第一个选项
复制布局内容,应用您想要的样式:
my_spinner_item.xml
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
style="@style/MySpinnerItemStyle"
android:singleLine="true"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="marquee"
android:textAlignment="inherit"/>
初始化适配器时:
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.my_spinner_item, list);
第二个选项
传递 ContextThemeWrapper
并将适当的主题应用于 ArrayAdapter
的构造函数。
styles.xml
<style name="MySpinnerTheme" parent="AppTheme">
<item name="android:spinnerItemStyle">@style/MySpinnerItemStyle</item>
</style>
初始化适配器时:
Context wrappedContext = new ContextThemeWrapper(this, R.style.MySpinnerTheme);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(wrappedContext, android.R.layout.simple_spinner_item, list);
我需要在 Spinner
中将 Spinner
选定的项目颜色设置为白色,它位于 Toolbar
上。应用中所有其他 Spinner
的颜色应保持不变。
我试过关注
styles.xml
<style name="SpinnerOnPrimaryStyle" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:spinnerItemStyle">@style/mySpinnerItemStyle</item>
</style>
<style name="mySpinnerItemStyle" parent="android:Widget.TextView.SpinnerItem">
<item name="android:textColor">@color/text_on_primary</item>
</style>
工具栏
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar_actionbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/tab_background"
android:gravity="center_vertical"
app:theme="@style/ToolBarStyle">
<Spinner
android:id="@+id/categorySpinner"
app:theme="@style/SpinnerOnPrimaryStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp" />
</android.support.v7.widget.Toolbar>
但是,Spinner
的颜色没有改变。
如果我将基本主题的 android:spinnerItemStyle
设置为 mySpinnerItemStyle
,Spinner
颜色会发生变化。但这改变了应用程序中所有 Spinner
的颜色,我不想发生这种情况。
(以下应用主题改变了微调器的颜色,但它改变了所有微调器的颜色)
<!-- Application theme. -->
<style name="BaseTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- All customizations that are NOT specific to a particular API-level can go here. -->
<item name="android:spinnerItemStyle">@style/mySpinnerItemStyle</item>
</style>
如何只更改 Toolbar
中 Spinner
的颜色?如果我可以单独在主题中执行此操作,而无需以编程方式执行,那就更好了。
在我看来,作为 Spinner
项目的布局,您正在使用框架提供的其中一个项目,即 android.R.layout.simple_spinner_item
.
如果您看一下 source code,您会注意到它应用 style="?android:attr/spinnerItemStyle"
到它的内容视图。这意味着,当您在 activity/fragment 中初始化您的适配器时,spinnerItemStyle
将是已应用于您的 activity 主题的适配器,而不是您在 xml
:
ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, list);
你有两个选择。
第一个选项
复制布局内容,应用您想要的样式:
my_spinner_item.xml
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
style="@style/MySpinnerItemStyle"
android:singleLine="true"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="marquee"
android:textAlignment="inherit"/>
初始化适配器时:
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.my_spinner_item, list);
第二个选项
传递 ContextThemeWrapper
并将适当的主题应用于 ArrayAdapter
的构造函数。
styles.xml
<style name="MySpinnerTheme" parent="AppTheme">
<item name="android:spinnerItemStyle">@style/MySpinnerItemStyle</item>
</style>
初始化适配器时:
Context wrappedContext = new ContextThemeWrapper(this, R.style.MySpinnerTheme);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(wrappedContext, android.R.layout.simple_spinner_item, list);