Problem
안드로이드에서 설정화면의 스위치를 구현하기 위해서 SwitchPreference
1를 사용할 수 있는데 스위치(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" />