我现在已经搜索了一段时间,但我认为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
,则不会发生这种情况。不幸的是,这不是我们真正想要的。我们不应该做这种解决方法。
有什么想法吗?这发生在任何人身上吗?
答案 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();
希望它可以帮助你们中的一些人!