首页 > 解决方案 > 如何使自定义视图在Android中继承其父样式

问题描述

使用 Switch 我可以做到这一点:

< Switch
                android:id="@+id/normal"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_gravity="end"
                android:gravity="end|center_vertical"
                android:switchPadding="16dp"
                android:thumbTextPadding="16dp"
                android:text="Hello World" />

注意这一行:

android:switchPadding="16dp"
                    android:thumbTextPadding="16dp"

现在,我制作了一个扩展此 Switch 的自定义视图。我没有做任何特别的改变:

import android.content.Context
import android.util.AttributeSet
import androidx.appcompat.widget.SwitchCompat


class BetterSwitchCompat : SwitchCompat {
    private var listener: OnCheckedChangeListener? = null

    constructor(context: Context) : super(context)
    constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
    constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int)
            : super(context, attrs, defStyleAttr)

    override fun setOnCheckedChangeListener(listener: OnCheckedChangeListener?) {
        if (listener != null) {
            this.listener = listener
        }
        super.setOnCheckedChangeListener(listener)
    }

    fun setCheckedSilent(checked: Boolean) {
        toggleListener(false)
        isChecked = checked
        toggleListener(true)
    }

    private fun toggleListener(value: Boolean) {
        if (value) setOnCheckedChangeListener(listener)
        else setOnCheckedChangeListener(null)
    }
}

如您所见, check方法只不过是一个业务逻辑。

为什么我不能使用我之前提到的新类的属性?

关于这个只有几篇文章,但没有一个能澄清我在问什么。

  1. Android 自定义视图从父级继承所有样式和属性

  2. 如何使自定义视图继承其父样式

标签: androidandroid-custom-viewandroid-switch

解决方案


Switch不是SwitchCompatSwitchCompat来自 AndroidX,因此它使用应用程序定义的属性。

尝试在有问题的属性前面加上 ,app:而不是android:,例如app:switchPadding.


推荐阅读