复合组件未还原视图状态

时间:2019-04-07 17:58:19

标签: android kotlin

我正在制作一个带有按钮的复合组件。

class CreateConfigNodeView : ConstraintLayout {

constructor(context: Context) : super(context) {
    loadLayout()
}

constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {
    loadLayout()
}

constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {
    loadLayout()
}

private fun loadLayout() {
    inflate(context, R.layout.compound_view_layout, this)
}

具有这样的基本布局:

<merge xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/inline_create_operator_controls"
tools:parentTag="androidx.constraintlayout.widget.ConstraintLayout">

<Button
    android:id="@+id/aid_for_button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

</merge>

我通过编程成功设置了按钮的文本(/ textview / whatever)。当我旋转屏幕时,按钮文本将重置为xml中的设置。

我实现了onSaveInstanceState / onRestore并手动存储了该组件的文本并再次进行了设置,它可以那样工作,但是感觉不对。

我的印象是这些组件可以处理自己的状态。我在构造函数/通胀方面做错了什么吗?

1 个答案:

答案 0 :(得分:1)

TextView(及其所有子类,所以Button)也不会自动保存文本,除非将freezesText设置为true
来自documentation

  

如果设置,则文本视图将在其冻结的冰柱内包括其当前完整文本,以及诸如当前光标位置之类的元数据。默认情况下,此功能处于禁用状态;当文本视图的内容未存储在诸如内容提供程序之类的持久位置时,此功能很有用。对于EditText,无论属性值如何,都始终启用它。

所以您基本上要做的是:

<Button 
     ... 
     android:freezesText="true" />