为什么片段中的 EditText 在导航到另一个片段并使用 Kotlin 中的后退按钮返回后显示相同的值?
Why does EditText in fragment show the same value after navigating to another fragment and back using back button in Kotlin?
我是 Android 开发和 Kotlin 的新手。我遇到了这个让我困惑的问题。
我在片段 A 中有 2 个 EditText 元素,每个元素都有不同的文本。当我导航到 Fragment B 并使用后退按钮再次返回到 A 时,两个 EditText 控件显示相同的值?!我不明白为什么。
截屏:
Step 1 - Fragment A with DIFFERENT values
Step 2 - Fragment B
Step 3 - Fragment A now with SAME values after back navigation from Fragment B
解决方案有一个 activity 和 2 个片段(片段 A 和片段 B)。 Github 提供解决方案:https://github.com/MIT-bits/singleactivity
我使用 NavGraph 在 Fragment A 和 B 之间导航。
片段 A 将 XML 布局文件 (custom_view.xml) 与 EditText 重用。每个 editText 值都在 Fragment A 的 onViewCreated 方法中设置(见下文)
AFragment.kt
val data = arrayOf("Text A", "Text B", "Text C")
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
view1.editText.setText(data[0])
view2.editText.setText(data[1])
}
fragment_a.xml
<?xml version="1.0" encoding="utf-8"?>
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".AFragment">
<LinearLayout
android:id="@+id/createWhatAboutLinearLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<include android:id="@+id/view1" layout="@layout/custom_view"></include>
<include android:id="@+id/view2" layout="@layout/custom_view"></include>
</LinearLayout>
</ScrollView>
custom_view.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
>
<EditText
android:id="@+id/editText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textPersonName"
android:background="#999"
android:textSize="18sp"
android:textColor="#111"
android:typeface="normal"
android:layout_margin="20dp"
android:padding="10dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="Text" />
</androidx.constraintlayout.widget.ConstraintLayout>
有人能看出我做错了什么或遗漏了什么吗?
任何意见都是有价值的...
在 EditText
中添加属性 android:saveEnabled="false"
<EditText
android:id="@+id/editText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textPersonName"
android:background="#999"
android:textSize="18sp"
android:textColor="#111"
android:typeface="normal"
android:layout_margin="20dp"
android:padding="10dp"
android:saveEnabled="false"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="Text" />
原因:
因为EditText的两个include有相同的id,所以片段缓存相同的值
解决方法:
让EditText获得不同的id
val parent = view1.editText.parent as ConstraintLayout
view1.editText.id = parent.id + view1.editText.id
我是 Android 开发和 Kotlin 的新手。我遇到了这个让我困惑的问题。
我在片段 A 中有 2 个 EditText 元素,每个元素都有不同的文本。当我导航到 Fragment B 并使用后退按钮再次返回到 A 时,两个 EditText 控件显示相同的值?!我不明白为什么。
截屏:
Step 1 - Fragment A with DIFFERENT values
Step 2 - Fragment B
Step 3 - Fragment A now with SAME values after back navigation from Fragment B
解决方案有一个 activity 和 2 个片段(片段 A 和片段 B)。 Github 提供解决方案:https://github.com/MIT-bits/singleactivity
我使用 NavGraph 在 Fragment A 和 B 之间导航。
片段 A 将 XML 布局文件 (custom_view.xml) 与 EditText 重用。每个 editText 值都在 Fragment A 的 onViewCreated 方法中设置(见下文)
AFragment.kt
val data = arrayOf("Text A", "Text B", "Text C")
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
view1.editText.setText(data[0])
view2.editText.setText(data[1])
}
fragment_a.xml
<?xml version="1.0" encoding="utf-8"?>
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".AFragment">
<LinearLayout
android:id="@+id/createWhatAboutLinearLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<include android:id="@+id/view1" layout="@layout/custom_view"></include>
<include android:id="@+id/view2" layout="@layout/custom_view"></include>
</LinearLayout>
</ScrollView>
custom_view.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
>
<EditText
android:id="@+id/editText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textPersonName"
android:background="#999"
android:textSize="18sp"
android:textColor="#111"
android:typeface="normal"
android:layout_margin="20dp"
android:padding="10dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="Text" />
</androidx.constraintlayout.widget.ConstraintLayout>
有人能看出我做错了什么或遗漏了什么吗?
任何意见都是有价值的...
在 EditText
中添加属性android:saveEnabled="false"
<EditText
android:id="@+id/editText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textPersonName"
android:background="#999"
android:textSize="18sp"
android:textColor="#111"
android:typeface="normal"
android:layout_margin="20dp"
android:padding="10dp"
android:saveEnabled="false"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="Text" />
原因:
因为EditText的两个include有相同的id,所以片段缓存相同的值
解决方法: 让EditText获得不同的id
val parent = view1.editText.parent as ConstraintLayout
view1.editText.id = parent.id + view1.editText.id