您可以使用data binding 和 BindingAdapter 来实现。我将展示一个使用 Kotlin 的示例。
- 要启用数据绑定,请添加到您的 Gradle:
apply plugin: 'kotlin-kapt' // only need when You use Kotlin
...
android {
...
buildFeatures {
dataBinding = true
}
...
}
- Crete BindingAdapter(我将其添加到 MainActivity.kt 以简化代码):
import android.graphics.drawable.GradientDrawable
import android.os.Bundle
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat
import androidx.databinding.BindingAdapter
import androidx.databinding.DataBindingUtil
import com.myniprojects.teststackjava.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity()
{
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?)
{
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(
this, R.layout.activity_main)
}
}
// Here is binding adapter. It takes 2 colors, background and stroke. If You want more customization add more parameters
@BindingAdapter(value = ["colorStoke", "colorBack"], requireAll = true)
fun setBackground(textView: TextView, @ColorRes colorStoke: Int, @ColorRes colorBack: Int)
{
val stroke = ContextCompat.getColor(textView.context, colorStoke)
val back = ContextCompat.getColor(textView.context, colorBack)
val gd = GradientDrawable()
// setting background
gd.colors = intArrayOf(
back,
back
)
// here change parameters as You want
gd.gradientType = GradientDrawable.LINEAR_GRADIENT
gd.shape = GradientDrawable.RECTANGLE
gd.cornerRadius = 15f;
// setting stroke width and color
gd.setStroke(5, stroke)
textView.background = gd
}
自定义GradeintDrawable勾选this docs
- 在您的 MainActivity.xml 中执行以下操作:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<import type="com.myniprojects.teststackjava.R" />
</data>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/txtVTest"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="20dp"
android:gravity="center"
android:text="TextView Text"
android:textSize="40sp"
app:colorBack="@{R.color.color_back}"
app:colorStoke="@{R.color.color_stroke}"/>
</FrameLayout>
</layout>
我正在导入R 以便能够传递资源。 (也许有另一种没有导入的方法,但我不能像@{@color/name} 这样传递颜色,所以我只是导入它)。在您的TextView 中,您必须调用app:colorBack 和app:colorStoke,并使用您想要设置为笔划和返回的颜色。
- 当然是 res/values/colors:
<color name="color_stroke">#B71C1C</color>
<color name="color_back">#33691E</color>
- 最终效果表明一切正常:
要生成ActivityMainBinding,您首先必须创建一个数据绑定布局。如果您正确添加了您的依赖项以快速将您的布局转换为数据绑定布局,请使用:Alt + Enter ➡ Convert to data binding layout*
所以你的布局应该是这样的:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
</data>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
</FrameLayout>
</layout>
现在重建你的项目后你应该得到ActivityMainBinding类。