【问题标题】:Customize theme of a single View自定义单个视图的主题
【发布时间】:2017-05-13 03:17:10
【问题描述】:

我需要将Spinner 中的Spinner 所选项目颜色设置为白色,该Toolbar 位于Toolbar 上。应用中所有其他 Spinners 的颜色应保持不变。

我试过了。

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 设置为mySpinnerItemStyleSpinner 颜色就会改变。但这会改变应用程序中所有Spinners 的颜色,这是我不希望发生的。

(以下应用主题更改微调器颜色,但会更改所有微调器的颜色)

<!-- 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>

如何仅更改ToolbarSpinner 的颜色?如果我可以单独在主题中执行此操作,而不以编程方式执行此操作,那就更好了。

【问题讨论】:

  • 代替app:themeandroid:theme
  • @azizbekian 尝试过(也尝试过style)但没有运气

标签: android android-view android-spinner android-theme android-styles


【解决方案1】:

在我看来,作为您使用其中之一的 Spinner 项目的布局,该框架提供,即 android.R.layout.simple_spinner_item

如果您查看source code,您会注意到它会将style="?android:attr/spinnerItemStyle" 应用于其内容视图。这意味着,当您在活动/片段中初始化适配器时,spinnerItemStyle 将是已应用于您的活动主题的适配器,而不是您在 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);

【讨论】:

  • 这里解释得很好,先生!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多