Android TextInputLayout 在 fragment 事务中返回时丢失文本/内容

标签 android android-fragments material-design fragmenttransaction android-textinputlayout

我已经搜索了一段时间,但我认为 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>

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

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

但问题是,当返回(按下后退按钮、工具栏/操作栏主页按钮等)到第一个 fragment 时。我所有的 TextInputLayouts 都丢失了插入其中的文本。这真的很烦人,并且在专门使用 EditText 时不会发生,就像我们之前的 Material Design 转换一样。

此外,如果我不使用 FragmentTransaction 替换 fragment ,而是启动一个新的 Activity,则不会发生这种情况。不幸的是,这不是我们真正想要的。我们不需要做这种变通办法。

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

最佳答案

发布我的“答案”,这确实是一种解决方法,可能不会对每个人都有用或令人满意,但至少它对我很有帮助。

这显然是新的 TextInputLayout 的一个错误,在 FragmentTransaction 中进行替换或删除时,它不能很好地处理 savedInstanceState >。 EditText 之前做得非常好。

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

总而言之,这就是我最终用作 fragment 交易的内容:

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();

希望对大家有所帮助!

关于Android TextInputLayout 在 fragment 事务中返回时丢失文本/内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31443325/

相关文章:

java - onCreate 中的监听器是否工作不止一次?

android - fragment 有时会在返回堆栈时保存变量

android - 使用 fragment 的动态方式

android - 编写 : How to have ime padding and Scaffold padding with edge-to-edge and windowSoftInputMode is adjustResize

android - 无法将整个 arrayList 添加到 ChipGroup

android - 是否可以将 Material ChipGroup 方向设置为 VERTICAL?

android - Google map API - 签名无效

android - 简单的安卓视频播放器

java - 如何将字符串转换为 JSON?

android - 带有 PreferenceFragment 的 PerferenceActivity 在有 proguard 的设备上失败,没有 proguard