AppCompat上的TextView色调

时间:2015-06-05 16:52:38

标签: android android-appcompat

我制作了一些带有textview的复选框和单选按钮,但它们在棒棒糖前没有着色。

我的观看文字范围AppCompatCheckedTextView,样式为:

<style name="CheckBoxStyle" parent="android:Widget.TextView">
    <item name="android:textAppearance">?android:attr/textAppearance</item>
    <item name="android:drawableRight">?android:attr/listChoiceIndicatorMultiple</item>
    <item name="android:drawableEnd">?android:attr/listChoiceIndicatorMultiple</item>
    <item name="android:clickable">true</item>
    <item name="android:background">?attr/selectableItemBackground</item>
    <item name="android:gravity">center_vertical</item>
    <item name="android:paddingTop">8dp</item>
    <item name="android:paddingBottom">8dp</item>
</style>

我的口音中定义了我的口音:

<style name="AppTheme.Platform.NoActionBar" parent="Theme.AppCompat.NoActionBar">
    <item name="android:selectableItemBackground">@drawable/press_overlay_dark</item>
    <item name="android:borderlessButtonStyle">@style/BorderlessButton</item>

    <item name="android:colorAccent">@color/color_accent</item>
    <item name="colorAccent">@color/color_accent</item>
</style>

我是针对v21构建的,至少使用v16并使用AppCompat v7-22.1.1。我的活动扩展了AppCompatActivity

Genymotion 4.1.1 Nexus 5 5.1.1

10 个答案:

答案 0 :(得分:17)

<强> JAVA

Api等级23&gt; = android:drawableTint="@color/colorPrimary"

Api等级&lt; Api等级23

private void setTextViewDrawableColor(TextView textView, int color) {
        for (Drawable drawable : textView.getCompoundDrawables()) {
            if (drawable != null) {
                drawable.setColorFilter(new PorterDuffColorFilter(getColor(color), PorterDuff.Mode.SRC_IN));
            }
        }
    }

<强>科特林

   private fun setTextViewDrawableColor(textView: TextView, color: Int) {
    for (drawable: Drawable in textView.compoundDrawables) {
            drawable.colorFilter = PorterDuffColorFilter(getColor(color), PorterDuff.Mode.SRC_IN)
    }
}

答案 1 :(得分:8)

查看AppCompatCheckedTextView的来源,我终于明白了。 仅显示checkMark 。由于它来自CheckedTextView,它来自TextViewdrawableRight只会在棒棒糖上着色。查看AppCompatTextView的来源,它仅提供向后兼容的textAllCaps所以AFAIK,没有内置的方法来为{棒棒色前{/ 1}}提供色彩。如果你想要一个更可定制的解决方案,你可能需要将你的drawable放在一个布局中。

更新后的风格:

drawableRight

答案 2 :(得分:4)

这是一个向后兼容的TextView。

用法:

<com.github.mrezanasirloo.TextViewCompatTint
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:drawableStart="@drawable/ic_comment_black_14dp"
    app:drawableTint="@color/colorPrimary"
    tools:text="28"
    />

gist

答案 3 :(得分:3)

不是解决方案的直接答案。但是,如果您正在使用数据绑定并且想要添加可绘制的色调。请查看以下示例:经过最新版本测试,但也可以在Api <= 21

上运行
  @JvmStatic
    @BindingAdapter(value = ["app:drawableStart", "app:drawableStartTint"], requireAll = true)
    fun setDrawableStartTint(textView: TextView, @DrawableRes drawable: Drawable, @ColorInt color: Int) {
        val mutatedDrawable = drawable.mutate()
        mutatedDrawable.setColorFilter(color, PorterDuff.Mode.MULTIPLY)
        textView.setCompoundDrawablesWithIntrinsicBounds(mutatedDrawable, null, null, null)
    }

用法:

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Hello World"
    app:drawableStart="@{@drawable/ic_demo}"
    app:drawableStartTint="@{@color/color_demo_tint}"
 />

答案 4 :(得分:3)

对于API 23及更高版本,只需在您的布局中进行设置即可:android:drawableTint="@color/custom_color"

如果需要向后兼容,则需要以编程方式进行设置。在Kotlin中,您可以创建扩展功能,例如:

fun TextView.setDrawableColor(@ColorRes color: Int) {
    compoundDrawables.filterNotNull().forEach {
        it.colorFilter = PorterDuffColorFilter(getColor(context, color), PorterDuff.Mode.SRC_IN)
    }
}

并使用它,例如:textView.setDrawableColor(R.color.custom_color)

请注意,filterNotNull()在这里非常重要,因为可绘制对象列表可能会具有一些空值(对于所有尚未设置的TextView可绘制对象)。

答案 5 :(得分:1)

AppCompat中的小部件着色通过截取任何布局膨胀并在其位置插入特定的色调感知版本的小部件来工作。如果您有自己的小部件自定义版本,在您的情况下是checkedtextview,则着色不会工作

来自widget Tinting下的开发人员博客

http://android-developers.blogspot.com/2014/10/appcompat-v21-material-design-for-pre.html

在使用Android 5.0的设备上运行时,所有小部件都使用我们刚才谈到的颜色主题属性进行着色。 Lollipop有两个主要功能:drawable着色,并在drawable中引用主题属性(形式为?attr / foo)。

AppCompat在早期版本的Android上为UI小部件的子集提供了类似的行为:

AppCompat工具栏(动作模式等)提供的所有内容

的EditText

微调

复选框

单选按钮

切换(使用新的android.support.v7.widget.SwitchCompat)

CheckedTextView

您不需要做任何特别的事情来使这些工作,只需像往常一样在布局中使用这些控件,AppCompat将完成其余的工作(有一些注意事项;请参阅下面的常见问题解答)。

答案 6 :(得分:1)

我有一个色调问题。在低于21的SDK上运行时,AppCompatTextView没有色调效果。我的解决方案是通过java设置色调颜色。 以下示例有效。

XML

    <android.support.v7.widget.AppCompatTextView
    android:layout_width="50dp"
    android:layout_height="20dp"
    android:id="@+id/tvInfor2"
    android:background="@drawable/btn_style_black_border"
    android:gravity="center"
    android:backgroundTint="@color/colorPrimary"/>

的java

    int currentapiVersion = android.os.Build.VERSION.SDK_INT;
    if (currentapiVersion <= 21){
        tvInfor2.setSupportBackgroundTintList(getResources().getColorStateList(R.color.colorPrimary));
    }

答案 7 :(得分:0)

kotlin

fun TextView.setDrawableTintColor(colorRes: Int) {
  for (drawable in this.compoundDrawablesRelative) {
    drawable?.colorFilter = PorterDuffColorFilter(getColor(context, colorRes), PorterDuff.Mode.SRC_IN)
  }
}

用法:

myTextView.setDrawableTintColor(R.color.colorPrimary)

答案 8 :(得分:0)

简化最简单的答案将是Kotlin的扩展(但我​​没有检查):

fun TextView.setDrawableColor(@ColorRes color: Int) {
    val colorFilter = PorterDuffColorFilter(getColor(context, color), PorterDuff.Mode.SRC_IN)
    compoundDrawables.filterNotNull().forEach {
        it.colorFilter = colorFilter
    }
}

答案 9 :(得分:-1)

在所有不适用于我的解决方案中,我创建了以下内容:

JAVA :兼容的Api <23

private void setTextViewDrawableColor(@RecentlyNonNull TextView textView,@ColorRes int color) {
        for (Drawable drawable : textView.getCompoundDrawablesRelative()) {
            if (drawable != null) {
                drawable.setColorFilter(new PorterDuffColorFilter(ContextCompat.getColor(textView.getContext(),color), PorterDuff.Mode.SRC_IN));
            }
        }
    }

使用

setTextViewDrawableColor(textView1,R.color.AccentColor)

科特琳

private fun setTextViewDrawableColor(@NonNull textView: TextView, @ColorRes color: Int) {
    for (drawable in textView.compoundDrawablesRelative) {
        if (drawable != null) {
            drawable.colorFilter = PorterDuffColorFilter(ContextCompat.getColor(textView.context, color), PorterDuff.Mode.SRC_IN)
        }
    }
}

使用

setTextViewDrawableColor(textView1,R.color.AccentColor)

KOTLIN扩展

fun TextView.setDrawableColor(@ColorRes color: Int) {
    compoundDrawablesRelative.filterNotNull().forEach {
        it.colorFilter = PorterDuffColorFilter(ContextCompat.getColor(this.context, color), PorterDuff.Mode.SRC_IN)
    }
}

使用

textView1.setDrawableColor(R.color.colorAccent)

仅XML API => 23

android:backgroundTintMode="src_in"
android:drawableTint="FF0000"