我正在制作一个带有按钮的复合组件。
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并手动存储了该组件的文本并再次进行了设置,它可以那样工作,但是感觉不对。
我的印象是这些组件可以处理自己的状态。我在构造函数/通胀方面做错了什么吗?
答案 0 :(得分:1)
TextView
(及其所有子类,所以Button
)也不会自动保存文本,除非将freezesText
设置为true
。
来自documentation:
如果设置,则文本视图将在其冻结的冰柱内包括其当前完整文本,以及诸如当前光标位置之类的元数据。默认情况下,此功能处于禁用状态;当文本视图的内容未存储在诸如内容提供程序之类的持久位置时,此功能很有用。对于EditText,无论属性值如何,都始终启用它。
所以您基本上要做的是:
<Button
...
android:freezesText="true" />