Как сохранить переменные при замене фрагмента? - PullRequest
0 голосов
/ 15 января 2019

В моем первом фрагменте у меня есть EditText со значением. Проблема в том, что когда я перехожу к FragmentTwo и возвращаюсь к FragmentOne, EditTextFragmentOne) теряет текст, который я вставил ранее. Я пытался сохранить его в onSaveInstanceState() и извлечь в onViewStateRestored(), но, похоже, он не хранит информацию, потому что onSaveInstanceState() никогда не вызывается, а savedInstanceState всегда равно нулю.

Это мой метод замены фрагмента

fragmentManager
                ?.beginTransaction()
                ?.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_left, R.anim.slide_out_right, R.anim.slide_in_right)
                ?.replace(frame, MyFragment.newInstance(), tag)
                ?.addToBackStack(tag)
                ?.commit()

Это мой onSaveInstanceState() в FragmentOne:

 override fun onSaveInstanceState(outState: Bundle) {
        outState.putDouble(Constants.currentAmount, currentAmount)
        super.onSaveInstanceState(outState)
    }

Это мой onView Восстановлен в FragmentOne:

override fun onViewStateRestored(savedInstanceState: Bundle?) {
        super.onViewStateRestored(savedInstanceState)
        if(savedInstanceState!= null) {
            currentAmountSaved = savedInstanceState.getDouble(Constants.currentAmount)
        }
    }

Это моя спина в FragmentTwo:

 fragmentManager?.popBackStack()

Итак, моя цель - сохранить EditText, перейти к FragmentTwo, и когда я вернусь к FragmentOne, то же самое EditText будет со значением, которое я установлю при изменении Fragments.

Это мой xml-файл из FragmentOne (фрагмент, который я хочу восстановить)

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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/contentView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:clickable="true"
    android:focusableInTouchMode="true"
    android:orientation="vertical">


    <View
        android:id="@+id/fManageFundsHeaderLayout"
        android:layout_width="match_parent"
        android:layout_height="250dp"
        android:background="@color/colorBackgroundToolbar"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="parent" />

    <include
        android:id="@+id/addFundsComponent"
        layout="@layout/component_manage_funds"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="24dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="@+id/fManageFundsHeaderLayout" />


</androidx.constraintlayout.widget.ConstraintLayout>

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Вы можете сделать это:

private var contentView: View? = null

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    if (contentView == null) {
        contentView = inflater.inflate(xxxxx)
    }
    (contentView?.parent as? ViewGroup)?.removeView(contentView)
    return contentView
}
0 голосов
/ 15 января 2019

Я думаю, что вы используете неправильный обратный вызов состояния восстановления. Попробуйте исследовать объект Bundle из методов onCreate / onCreateView для фрагмента

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...