С помощью переключателя я могу сделать это:
< 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 для проверки метода.
Почему я не могу использовать атрибуты, о которых я говорил ранее, для нового класса?
Об этом есть всего несколько сообщений, но ни один из них не поясняет, о чем я спрашиваю.
Android пользовательское представление наследует все стили и атрибуты от родителя
Как заставить пользовательское представление наследовать стиль своего родителя