如何以编程方式设置按钮样式资源?

时间:2019-08-12 09:16:36

标签: android android-layout android-xml

我想以编程方式设置按钮样式。原因是我的CustomView包含Button。我使用<declare-styleable>中的自定义参数将样式ID发送到我的CustomView。现在,我只需要为Button而非我的CustomView中的整个视图设置按钮样式。

CustomView:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <ProgressBar
        android:id="@+id/progressBar"
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:indeterminate="true"
        android:layout_gravity="center"
        android:indeterminateTint="@color/colorText"/>

    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</FrameLayout>

我的代码中的CustomView:

<myproject.CustomView
                    android:id="@+id/btn"
                    app:progressColor="@color/colorText"
                    app:l_buttonText="@string/text"
                    app:l_buttonStyle="@style/dialog_outlined"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="48dp" />

我要实现的是仅设置Button的样式(从app:l_buttonStyle获得的值),但是我必须以编程方式进行此操作,因为如果我以XML设置样式,它将应用于FrameLayout作为根视图。这是初始化CustomView部分的功能

 private fun init(context: Context) {
        //Init default values
        View.inflate(context, R.layout.loading_button, this)
        button = findViewById(R.id.button)
        progressBar = findViewById(R.id.progressBar)
        progressBar?.setGone()

        //Now I need to set style for my inflated Button from XML layout
    }

1 个答案:

答案 0 :(得分:0)

必须以编程方式创建自定义视图中的视图,并且在初始化视图时必须应用自定义样式。视图初始化后,就无法设置样式。

val button = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        Button(this, null, 0, R.style.BtnStyle)
    } else {
        var themeWrapper = ContextThemeWrapper(this, R.style.BtnStyle)
        Button(themeWrapper, null, 0)
    }