我正在使用自定义主题,其父主题是Light.DarkActionBar

<style name="MyTheme" parent="Theme.AppCompat.Light.DarkActionBar">


如预期和预期的那样,这会在白色背景上产生深色的CheckBox(文本和复选框可绘制)。

我可以将深色主题用于反色:

<style name="MyTheme" parent="Theme.AppCompat">


再次,这按预期方式工作(轻巧的CheckBox文本和图形)。

该应用程序将前者用于浅色背景上的深色复选框,但是一个特定的UI(片段)在深色背景上具有CheckBoxes,所以我想仅将这些特定CheckBox的颜色翻转(变浅)。

我可以使用textColor为标签着色,但是CheckBox轮廓仍然显示为深色。

我可以在API 21+(L)中使用使用着色,但是我需要支持低至16(使用AppCompat)的API。

我也尝试过setColorFilter,但是它还没有工作(没有任何日志就会崩溃-我正在继续调查),但是我对这种方法不抱希望,因为我希望图形表现为“自然”,例如,在检查的过渡期间切换强调色。

我不想使用自定义图形,因为我希望图形由系统提供并为用户所熟悉,并与同一系统上的其他应用程序匹配。

我尝试直接在CheckBox上设置各种样式,但根本没有任何视觉更改:

<?xml version="1.0" encoding="utf-8"?>
<CheckBox xmlns:android="http://schemas.android.com/apk/res/android"
  style="@style/ThemeOverlay.AppCompat.Dark"
  ...


风格的价值似乎没有任何可见的影响。

因此,当应用程序中的其他CheckBoxes仍然是暗色时,如何获得这些特定CheckBoxs的浅色,系统提供的CheckBox图形?

TYIA

最佳答案

View以膨胀的Context为主题。

在深色背景上实现深色复选框的一种方法是,将视图层次结构的整个深色部分填充到使用深色主题创建的ContextThemeWrapper中。

ContextThemeWrapper darkContext = new ContextThemeWrapper(
    context, R.style.MyThemeDark);
LayoutInflater darkInflater = LayoutInflater.from(darkContext);
View myDarkLayout = darkInflater.inflate(
    R.layout.some_layout, parentView, true);


在API 21+上,可以使用android:theme属性实现此效果。

some_layout.xml:

<LinearLayout
    android:id="@+id/my_dark_layout"
    android:theme="@style/MyDarkTheme"
    ...>
    <CheckBox ... />
</LinearLayout>

10-07 19:34