Problem

안드로이드에서 설정화면의 스위치를 구현하기 위해서 SwitchPreference1를 사용할 수 있는데 스위치(Switch)의 스타일을 수정하고자 할 경우 스타일이 적용되지 않는 문제가 있었고 이를 해결하고자 한다.

Solution

스위치 버튼의 스타일을 적용하기 위해서 SwitchPreference를 새로 구현하여 적용하였다. setChecked는 외부에서 기본 스위치의 선택 상태를 변경하고자 할 경우 사용하게 되므로 별도 구현이 필요했다.

SwitchPreferenceExtend.kt

class SwitchPreferenceExtend : SwitchPreference {
    constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr)
    constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs)
    constructor(context: Context?) : super(context)

    var listener: Listener? = null
    private var defaultChecked: Boolean = false
    private var switchCompat: SwitchCompat? = null

    interface Listener {
        fun onChecked(checked: Boolean)
    }

    init {
        widgetLayoutResource = R.layout.mixin_switch
    }

    override fun setChecked(checked: Boolean) {
        super.setChecked(checked)
        defaultChecked = checked
    }

    override fun onBindView(view: View?) {
        super.onBindView(view)
        switchCompat = view?.findViewById(R.id.switchCompat)
        switchCompat?.apply {
            this.isChecked = defaultChecked
            this.setOnCheckedChangeListener { p0, checked -> listener?.onChecked(checked) }
        }
    }
}

mixin_switch.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.SwitchCompat xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="wrap_content"
  android:checked="false"
  android:id="@+id/switchCompat"
  android:layout_height="wrap_content" />

References