Android 在片段事务中返回时 TextInputLayouts 丢失 text/content

Android TextInputLayouts losing text/content when coming back in fragment transaction

我已经搜索了一段时间,但我认为 android.support.design.widget.TextInputLayout 中报告的大多数错误(并且有很多)与这个错误略有不同。至少,我已经解决了大多数其他错误,但与这个错误有关。 我目前在我的 activity 中有一个 Fragment 和几个像这样的 TextInputLayout

<android.support.design.widget.TextInputLayout
    android:id="@+id/input1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/hint1"
        android:inputType="numberSigned" />
</android.support.design.widget.TextInputLayout>

<android.support.design.widget.TextInputLayout
    android:id="@+id/input2
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/hint2"
        android:inputType="numberSigned"/>
</android.support.design.widget.TextInputLayout>

<android.support.design.widget.TextInputLayout
    android:id="@+id/input3"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/hint3"
        android:inputType="numberSigned">
</android.support.design.widget.TextInputLayout>

并且,在满足一些外部条件(不重要)后,我打开并显示隐藏上述片段的另一个片段(100% 屏幕)。如果您想知道这个新片段要求我在特定情况下需要的一些额外字段。 这是处理新 Fragment:

创建的代码
Fragment2 fragment2 = new Fragment2();
FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction()
                                .replace(((ViewGroup) getView().getParent()).getId(), fragment2);
transaction.addToBackStack(Fragment1.class.getSimpleName());
transaction.commit();

但问题是,当返回(按下后退按钮,toolbar/action 条形主页按钮等)到第一个片段时。我所有的 TextInputLayouts 都丢失了插入的文本。这真的很烦人,并且在专门使用 EditText 时并没有发生,就像我们之前的 Material 设计转换一样。

此外,如果我不使用 FragmentTransaction 替换片段,就不会发生这种情况,而是开始一个新的 Activity。不幸的是,这不是我们真正想要的。而且我们不需要做这种变通方法。

有什么想法吗?有人遇到过这种情况吗?

发布我的 "answer",这确实是一种解决方法,可能不会对所有人有用或令人满意,但至少它对我有用。

这显然是新 TextInputLayout 的错误,它在 FragmentTransaction 中进行替换或删除时不能很好地处理 savedInstanceStateEditText 之前做的很好

我最终没有使用FragmentTransaction#replace()(因为我将问题追溯到片段的删除),而是使用了FragmentTransaction#hide()FragmentTransaction#add()的组合。这提供了完全相同的视觉效果和行为,并且没有提到的错误问题。它只有一个固有的缺点,很明显,不能删除片段:片段资源不能 released/use 用于其他目的。如果内存不足或您的片段是一个怪物,这可能会造成麻烦。但至少在我的情况下它没有造成任何麻烦。

综上所述,这是我最终用作碎片交易的:

Fragment2 fragment2 = new Fragment2();
FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();
transaction.add(((ViewGroup) getView().getParent()).getId(), fragment2);
transaction.hide(Fragment1.this);
transaction.addToBackStack(Fragment1.class.getSimpleName());
transaction.commit();

希望对大家有所帮助!