首页 > 解决方案 > 从另一个片段导航回来时自定义视图的奇怪行为

问题描述

在将自定义视图与导航组件和后退按钮一起使用时,我遇到了一种奇怪的行为。

对于用户文本输入,我使用 Material Design 文本字段(它是 TextInputLayout 和 TextInputEditText 的组合)。为了避免代码重复,我创建了一个自定义视图 - CustomTextField (遵循指南),将这两个视图组合成一个视图。

我还使用导航组件在单个 Activity 中的片段之间导航。

问题 - 在我的LoginFragment中,我使用该自定义视图的 2 个实例来显示用户输入字段。当我在这些文本字段中输入 2 个不同的值,导航到另一个片段(使用注册按钮 - 现在它只是一个空白片段)然后使用后退按钮(或手势)返回到LoginFragment时,会发生奇怪的行为。第一个文本字段的值(文本)成为第二个文本字段的副本

例如:(作为链接上传的屏幕截图,因为这是我在 StackOverflow 上的第一个问题,我不允许将它们直接插入到问题中)

用户提供的具有 2 个不同值的 LoginFragment

导航到另一个片段并使用按钮/手势返回后的 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 之类的某些属性按预期工作,并且不会重复。

对于解决该问题的任何帮助,我将不胜感激。先感谢您!

标签: androidkotlin

解决方案


这与系统恢复视图状态的方式有关。默认情况下,该 ID 用于唯一标识状态恢复的视图,因此为您的重复 IDTextInputEditText将解释镜像状态。


推荐阅读