返回片段事务时,Android TextInputLayouts丢失文本/内容

时间:2015-07-16 00:09:29

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

我现在已经搜索了一段时间,但我认为android.support.design.widget.TextInputLayout中报告的大多数错误(并且有很多错误)与此错误略有不同。至少,我已经解决了大多数其他错误,但是很难解决这个问题。 我目前在我的活动中有一个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();

但问题是,当返回(按下按钮,工具栏/操作栏主页按钮等等)到第一个片段时。我的所有TextInputLayouts都丢失了插入其中的文字。这真是令人讨厌,并且在与EditText专门合作时并没有发生过,就像我们之前的材料设计过渡一样。

此外,如果不是使用FragmentTransaction替换片段,而是开始新的Activity,则不会发生这种情况。不幸的是,这不是我们真正想要的。我们不应该做这种解决方法。

有什么想法吗?这发生在任何人身上吗?

1 个答案:

答案 0 :(得分:4)

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

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

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

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

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

希望它可以帮助你们中的一些人!