android - 从另一个片段导航回来时自定义视图的奇怪行为
问题描述
在将自定义视图与导航组件和后退按钮一起使用时,我遇到了一种奇怪的行为。
对于用户文本输入,我使用 Material Design 文本字段(它是 TextInputLayout 和 TextInputEditText 的组合)。为了避免代码重复,我创建了一个自定义视图 - CustomTextField (遵循本指南),将这两个视图组合成一个视图。
我还使用导航组件在单个 Activity 中的片段之间导航。
问题 - 在我的LoginFragment中,我使用该自定义视图的 2 个实例来显示用户输入字段。当我在这些文本字段中输入 2 个不同的值,导航到另一个片段(使用注册按钮 - 现在它只是一个空白片段)然后使用后退按钮(或手势)返回到LoginFragment时,会发生奇怪的行为。第一个文本字段的值(文本)成为第二个文本字段的副本。
例如:(作为链接上传的屏幕截图,因为这是我在 StackOverflow 上的第一个问题,我不允许将它们直接插入到问题中)
导航到另一个片段并使用按钮/手势返回后的 LoginFragment - 第一个字段现在是“通过”的副本
为了解决问题,我已将代码减少到最少,但问题仍然存在。这是我正在使用的代码:
自定义文本字段 xml (custom_text_field.xml):
<?xml version="1.0" encoding="utf-8"?>
<merge
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/customTextLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/customEditText"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</com.google.android.material.textfield.TextInputLayout>
</merge>
自定义文本字段类:
class CustomTextField(context: Context, attrs: AttributeSet): LinearLayout(context, attrs) {
init {
inflate(context, R.layout.custom_text_field, this)
}
}
LoginFragment xml 中 CustomTextField 的用法:
<com.example.app.views.CustomTextField
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<com.example.app.views.CustomTextField
android:layout_width="match_parent"
android:layout_height="wrap_content" />
使用以下命令导航到另一个片段:
binding = FragmentLoginBinding.inflate(layoutInflater)
binding.buttonRegister.setOnClickListener {
findNavController().navigate(R.id.action_loginFragment_to_registerFragment)
}
我还注意到,不仅文本是“重复的”,而且还有一些其他属性,例如提示。inputType 之类的某些属性按预期工作,并且不会重复。
对于解决该问题的任何帮助,我将不胜感激。先感谢您!
解决方案
这与系统恢复视图状态的方式有关。默认情况下,该 ID 用于唯一标识状态恢复的视图,因此为您的重复 IDTextInputEditText
将解释镜像状态。
推荐阅读
- xml - Creating a generic XSLT document to transform any non-root Element with child elements
- wordpress - Gridsome + Wordpress 源插件 - 如何按月和年添加存档路线
- javascript - 如何防止用户提交远程api中已经存在的文本?
- multithreading - c++11线程睡眠/唤醒没有锁?
- python - Python使用xarray从NETCDF文件中提取多个纬度/经度
- vue.js - 模块解析失败:意外字符 '' (1:2) 您可能需要适当的加载程序来处理此文件类型
- python - 我正在尝试将 bibles.print("Gen", 1, 1) 输出保存到文本文件中。我该怎么做呢?
- width - 如何绘制线宽大于 1 像素的形状(椭圆、矩形、圆形等)
- python - 如何用乌龟创建一排星星
- python-3.x - 根据条件替换python numpy矩阵值,而不使用for循环