我对 Android 很陌生(来自 iOS 背景)。我创建了一个自定义/复合视图,它只是合并标语中的五个按钮:
<merge xmlns:android="http://schemas.android.com/apk/res/android">
<!--Definition for my custom segmented controller class-->
<Button
android:id="@+id/button_NA"
android:layout_width="35dp"
android:layout_height="35dp"
android:textSize="12sp"
android:text="@string/button_NA_text"
android:background="@drawable/button_border"/>
<Button
android:id="@+id/button_1"
android:layout_width="35dp"
android:layout_height="35dp"
android:textSize="12sp"
android:text="@string/button_1_text"
android:layout_alignStart="@id/button_NA"
android:background="@drawable/button_border"/>
<Button
android:id="@+id/button_2"
android:layout_width="35dp"
android:layout_height="35dp"
android:textSize="12sp"
android:text="@string/button_2_text"
android:layout_toRightOf="@id/button_1"
android:background="@drawable/button_border"/>
<Button
android:id="@+id/button_3"
android:layout_width="35dp"
android:layout_height="35dp"
android:textSize="12sp"
android:text="@string/button_3_text"
android:background="@drawable/button_border"/>
<Button
android:id="@+id/button_4"
android:layout_width="35dp"
android:layout_height="35dp"
android:textSize="12sp"
android:text="@string/button_4_text"
android:background="@drawable/button_border"/>
<Button
android:id="@+id/button_5"
android:layout_width="35dp"
android:layout_height="35dp"
android:textSize="12sp"
android:text="@string/button_5_text"
android:background="@drawable/button_border"/>
</merge>
在继承自 LinearLayout 的 Kotlin 文件中,我实现了:
override fun onSaveInstanceState(): Parcelable? {
val bundle = Bundle()
bundle.putParcelable(STATE_SUPER_CLASS, super.onSaveInstanceState())
println("Saving segment $mSelectedSegment")
bundle.putInt(STATE_SELECTED_SEGMENT, mSelectedSegment)
return bundle
}
override fun onRestoreInstanceState(state: Parcelable) {
if (state is Bundle) {
val bundle = state
super.onRestoreInstanceState(bundle.getParcelable(STATE_SUPER_CLASS))
val segInt = bundle.getInt(STATE_SELECTED_SEGMENT)
selectSegment(segInt)
this.id = bundle.getInt(VIEW_ID)
} else
super.onRestoreInstanceState(state)
}
override fun dispatchSaveInstanceState(container: SparseArray<Parcelable>) {
// Makes sure that the state of the child views in the side
// spinner are not saved since we handle the state in the
// onSaveInstanceState.
super.dispatchFreezeSelfOnly(container)
}
override fun dispatchRestoreInstanceState(container: SparseArray<Parcelable>) {
// Makes sure that the state of the child views in the side
// spinner are not restored since we handle the state in the
// onSaveInstanceState.
super.dispatchThawSelfOnly(container)
}
麻烦的是,如果我动态地创建和插入它,那么 onRestoreInstanceState() 永远不会被调用,所以当屏幕方向改变时我无法恢复该值。如果我手动将此自定义视图插入到 XML 文件中的我的活动中,则调用该函数并且它按应有的方式工作。
一旦我使用 View.generateViewId() 创建它们,我就会为每个视图分配一个 ID,因此它们都有唯一的 ID。我真的很茫然,没有运气找到关于保存状态的例子,除了这个之外,动态添加的视图,但它说为了完成这项工作,我需要手动重新分配视图的 ID他们以前举行过。
我不确定如何在不保存每个动态创建的视图、其状态和 ID,然后在 onCreate 中再次手动构建它们的情况下实现这一点……在这种情况下,onRestoreInstanceState() 的意义何在。