繁体   English   中英

Android Jetpack导航组件出现问题,带有编辑文本掩码和错误消息

[英]Android Jetpack Navigation Component issue with edit text masks and error messages

我试图在我的Android Kotlin项目中使用RedMadRobot的 android-input-mask 但是目前,我正在处理非常奇怪的行为。 仅当我禁用Android导航组件时,该库才起作用。

我的activity_main.xml布局具有以下片段:

<fragment
    android:id="@+id/nav_host"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:name="androidx.navigation.fragment.NavHostFragment"
    app:navGraph="@navigation/navigation"
    app:defaultNavHost="true"/>

然后,在导航组件中定义的开始目标中,我有:

<EditText
    android:id="@+id/test"
    android:inputType="number"
    android:digits="1234567890+-() "
    { omitted for sake of simplicity } />

最后,在SignUpFragment.kt文件中,我具有以下SignUpFragment.kt行代码:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    val listener = MaskedTextChangedListener.installOn(
        test,
        "+7 ([000]) [000]-[00]-[00]",
        object : MaskedTextChangedListener.ValueListener {
            override fun onTextChanged(maskFilled: Boolean, extractedValue: String, formattedValue: String) {
                Log.d("TAG", extractedValue)
                Log.d("TAG", maskFilled.toString())
            }
        }
    )
    test.hint = listener.placeholder()
}

但是它不起作用,如下图所示:

面罩不适用

但是,当我对activity_main.xml文件中的注册片段进行硬编码时,所有工作正常:

<fragment
    android:id="@+id/fragment"
    android:name="my.app.SignUpFragment"
    { omitted for sake of simplicity } />

口罩适用

我的问题是:对此“错误”是否有任何合理的解释? 我有什么困惑吗? 我该如何解决?

谢谢您的帮助。

编辑:

错误消息的行为相同。 如果我输入以下代码:

test.error = "Error message"

使用Android导航组件不会显示错误消息。 但是,如果我在主要活动布局中对片段进行硬编码,则会显示错误消息。

好的,经过大量时间寻找答案之后,我发现我的问题与Android数据绑定库有关。 更具体地说,我需要在SignUpFragmentonCreateView中创建的绑定对象中设置侦听器和错误消息,如下所示:

private lateinit var binding: FragmentSignUpBinding

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    val view = inflater.inflate(R.layout.fragment_sign_up, container, false)

    // saving the instance of FragmentSignUpBinding
    binding = DataBindingUtil.setContentView(activity!!, R.layout.fragment_sign_up)

    binding.signupViewModel = signUpViewModel

    binding.lifecycleOwner = this

    setObservers()

    return view
}

然后,在onViewCreated

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {

    super.onViewCreated(view, savedInstanceState)
    MaskedTextChangedListener.installOn(
        binding.editCpf, // insted of simply edit_cpf
        "[000].[000].[000]-[00]",
        object : MaskedTextChangedListener.ValueListener {
            override fun onTextChanged(maskFilled: Boolean, extractedValue: String, formattedValue: String) {
                Log.d("TAG", extractedValue)
                Log.d("TAG", maskFilled.toString())
            }
        }
    )

}

然后工作正常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM