在同一个应用程序中同时使用明暗复选框

时间:2015-01-20 16:07:09

标签: android

我正在使用其父级为Light.DarkActionBar

的自定义主题
<style name="MyTheme" parent="Theme.AppCompat.Light.DarkActionBar">

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

我可以使用暗主题进行反转:

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

同样,这可以按预期工作(轻型CheckBox文本和图形)。

应用程序使用前者,对于浅色背景上的暗色复选框,但是一个特定的UI(片段)在深色背景上有CheckBoxes,所以我想为这些特定的CheckBox转换颜色(点亮)。 / p>

我可以使用textColor为标签着色,但CheckBox轮廓仍然显得很暗。

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

我也试过了setColorFilter,但它还没有奏效(没有任何记录就崩溃了 - 我还在继续调查),但我对这种方法并不抱希望,因为我喜欢图形表现为“自然”,例如,在检查过渡期间切换强调色。

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

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

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

风格的价值似乎没有任何明显的影响。

那么如何为这些特定的CheckBox提供系统提供的轻量级CheckBox图形,而应用程序中的其他CheckBox仍然是黑暗的?

TYIA

1 个答案:

答案 0 :(得分:1)

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>