Как заставить пользовательское представление наследовать стиль его родителя в Android - PullRequest
1 голос
/ 21 марта 2020

С помощью переключателя я могу сделать это:

< 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"

Теперь я создал пользовательское представление, расширяющее этот переключатель. Я не внес никаких особых изменений:

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)
    }
}

Как видите, нет ничего, кроме бизнес-логики c для проверки метода.

Почему я не могу использовать атрибуты, о которых я говорил ранее, для нового класса?

Об этом есть всего несколько сообщений, но ни один из них не поясняет, о чем я спрашиваю.

  1. Android пользовательское представление наследует все стили и атрибуты от родителя

  2. Как заставить пользовательское представление наследовать стиль своего родителя

1 Ответ

1 голос
/ 21 марта 2020

Switch не SwitchCompat. SwitchCompat взято из AndroidX, поэтому в нем используются определенные приложением атрибуты.

Попробуйте добавить префикс рассматриваемых атрибутов к app: вместо android:, например app:switchPadding.

...