onRestoreInstanceState никогда не вызывается для пользовательских представлений, создаваемых динамически

Я очень новичок в 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>

Внутри файла Kotlin, который наследуется от LinearLayout, я реализовал:

    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, а затем вручную создавая их снова в onCreate... в этом случае какой смысл в onRestoreInstanceState().

0 ответов

Другие вопросы по тегам