5

我已经搜索了一段时间,但我认为大多数报告的错误(并且有很多)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% 屏幕)。如果您想知道这个新片段需要一些我在特定情况下需要的额外字段。这是处理 new 创建的代码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,就像我们之前的 Material Design 过渡一样。

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

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

4

1 回答 1

6

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

这显然是新的错误TextInputLayoutsavedInstanceStateFragmentTransaction. EditText以前做得很好。

我最终做的不是使用FragmentTransaction#replace()(因为我将问题追溯到片段的删除),而是使用FragmentTransaction#hide()and的组合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();

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

于 2015-07-23T14:48:51.023 回答