使用内部 <include> 标签时出现编辑文本问题
Issue with edittexts when using inside <include> tag
在片段中使用 ViewBinding 时遇到一个奇怪的问题。
fragment_one_layout
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<include
android:id="@+id/name"
layout="@layout/form_element_layout" />
<include
android:id="@+id/unit"
layout="@layout/form_element_layout" />
<include
android:id="@+id/quantity"
layout="@layout/form_element_layout" />
</LinearLayout>
form_element_layout
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/title"
style="@style/TextViewRegularHeading"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/title"
android:textSize="@dimen/title_text_size" />
<EditText
android:id="@+id/input"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/edit_text_forms_bg"
android:hint="@string/form_hint"
android:inputType="text" />
</LinearLayout>
在 name.input
、 unit.input
和 quantity.input
字段中输入值后,我导航到 fragment_two
.
从fragment_two
返回到fragment_one
时,每个字段的值都更改为quantity.input
的值
例如:名字是“John”,单位是“Kg”,数量是“80”。导航到fragment_two并返回后,名称、单位和数量值都更改为“80”,有解决方案吗?
保存布局值时,Android 存储 EditText 的值,以其 id 为键。由于您为每个 EditTexts 使用相同的 ID,因此每次保存都会覆盖之前的保存,而最后一次会覆盖所有这些。如果您想对此进行快速测试,请移动“单元”包含,使其成为最后一个。执行此操作后,您应该会看到所有值的“Kg”。对于 TextViews,您不会看到此问题,因为它们被认为是静态的,每次都只是重新创建。
除了修改您的布局之外,解决此问题的一种方法是您自己明确保存和恢复 EditText 值。
让我们采用以下具有顶部 EditText 和下方的简单布局。在此布局中要注意的关键是 EditTexts 具有相同的 ID。
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<EditText
android:id="@+id/view"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="I'm the top view!"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<EditText
android:id="@id/view"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="50dp"
android:text="I'm the bottom view!"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
首次显示时,我们看到以下内容:
旋转后强制重新布局,我们看到:
如您所见,底部EditText的内容被用来填充顶部EditText。这就是您所看到的。
在片段中使用 ViewBinding 时遇到一个奇怪的问题。
fragment_one_layout
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<include
android:id="@+id/name"
layout="@layout/form_element_layout" />
<include
android:id="@+id/unit"
layout="@layout/form_element_layout" />
<include
android:id="@+id/quantity"
layout="@layout/form_element_layout" />
</LinearLayout>
form_element_layout
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/title"
style="@style/TextViewRegularHeading"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/title"
android:textSize="@dimen/title_text_size" />
<EditText
android:id="@+id/input"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/edit_text_forms_bg"
android:hint="@string/form_hint"
android:inputType="text" />
</LinearLayout>
在 name.input
、 unit.input
和 quantity.input
字段中输入值后,我导航到 fragment_two
.
从fragment_two
返回到fragment_one
时,每个字段的值都更改为quantity.input
例如:名字是“John”,单位是“Kg”,数量是“80”。导航到fragment_two并返回后,名称、单位和数量值都更改为“80”,有解决方案吗?
保存布局值时,Android 存储 EditText 的值,以其 id 为键。由于您为每个 EditTexts 使用相同的 ID,因此每次保存都会覆盖之前的保存,而最后一次会覆盖所有这些。如果您想对此进行快速测试,请移动“单元”包含,使其成为最后一个。执行此操作后,您应该会看到所有值的“Kg”。对于 TextViews,您不会看到此问题,因为它们被认为是静态的,每次都只是重新创建。
除了修改您的布局之外,解决此问题的一种方法是您自己明确保存和恢复 EditText 值。
让我们采用以下具有顶部 EditText 和下方的简单布局。在此布局中要注意的关键是 EditTexts 具有相同的 ID。
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<EditText
android:id="@+id/view"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="I'm the top view!"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<EditText
android:id="@id/view"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="50dp"
android:text="I'm the bottom view!"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
首次显示时,我们看到以下内容:
旋转后强制重新布局,我们看到:
如您所见,底部EditText的内容被用来填充顶部EditText。这就是您所看到的。