android - 切换按钮视图保持状态
问题描述
在我的应用程序片段之一中,布局使用定义为的切换按钮:
<ToggleButton
android:id="@+id/custom_toggle_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginStart="4dp"
android:minWidth="110dp"
android:minHeight="36dp"
android:background="@drawable/toggle_button_bg_bw"
android:textColor="@drawable/toggle_color_bw"
android:textOff="@string/text_off"
android:textOn="@string/text_on"
android:textSize="12sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/stm"
app:layout_constraintTop_toTopOf="parent" />
背景可绘制:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:drawable="@drawable/black_button_selected"
android:state_checked="true" />
<item
android:drawable="@drawable/white_button_unselected" />
</selector>
black_button_selected:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >
<stroke
android:width="2dp"
android:color="@color/colorGreen" />
<solid
android:color="@color/colorBlack" />
<corners android:radius="3dp" />
</shape>
white_button_unselected:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >
<stroke
android:width="2dp"
android:color="@color/colorGreen" />
<solid
android:color="@color/colorWhite" />
<corners android:radius="3dp" />
</shape>
TextColor 可绘制:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:state_checked="false"
android:color="@color/colorBlack" />
<item
android:state_checked="true"
android:color="@color/colorWhite" />
</selector>
在 createView 中调用以下代码。options_view 包含其他按钮和视图元素,它们附加到 editorView 和 editorView 是这个片段布局的一部分。
optionsViewBinding = DataBindingUtil.inflate(
inflater,
R.layout.options_view,
binding.editorView,
true
)
optionsViewBinding.run {
customToggleButton.isChecked = false
customToggleButton.setOnClickListener {
someFunction(customToggleButton.isChecked)
}
}
我面临的问题是,当我将开关切换到“打开”并移动到其他片段并使用此切换按钮返回片段时,而切换按钮的状态已重置为“假”/关闭状态,但显示的视图显示它处于“开启”状态。
我在这里想念什么?
解决方案
我无法解决这个问题,但是我已经能够找到一个替代方案,它可能不是最优雅的替代方案,但它确实有效。
创建自定义按钮类:
class CustomToggleButton @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : AppCompatButton(context, attrs, defStyleAttr) {
var isChecked = false
var onOffResID = Array<Int>(2) { 0 }
var onOffTextColorId = Array<Int>(2) { 0 }
fun initButton() {
// Should crash if resource ID invalid
background = AppCompatResources.getDrawable(context, onOffResID[0])
setTextColor(context.resources.getColor(onOffTextColorId[0]))
}
fun onClick() {
isChecked = !isChecked
val index = if (isChecked) 1 else 0
background = AppCompatResources.getDrawable(context, onOffResID[index])
setTextColor(context.resources.getColor(onOffTextColorId[index]))
}
}
在片段 onCreateView 或 onViewCreated 中:
customToggleButton.onOffResID = arrayOf(R.drawable.white_button_unselected, R.drawable.black_button_selected)
customToggleButton.onOffTextColorId = arrayOf(R.color.colorBlack, R.color.colorWhite)
customToggleButton.initButton()
customToggleButton.setOnClickListener {
customToggleButton.onClick()
someFunction(customToggleButton.isChecked)
}