替换片段时如何保存变量?

时间:2019-01-14 21:32:14

标签: android android-studio android-fragments

在我的第一个片段中,我有一个带有值的EditText。问题是当我转到FragmentTwo并返回到FragmentOne时,EditText(在FragmentOne中)丢失了我先前插入的文本。我试图将其保存在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

这是我来自FragmentOne(我要还原的片段)的xml文件

<?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 :(得分:0)

您可以这样做:

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
}

答案 1 :(得分:-1)

我认为您使用了错误的还原状态回调。尝试从片段的onCreate / onCreateView方法中探索Bundle对象