【问题标题】:Android Jetpack Navigation Component issue with edit text masks and error messages带有编辑文本掩码和错误消息的 Android Jetpack 导航组件问题
【发布时间】:2019-07-09 15:03:15
【问题描述】:

我正在尝试在我的 Android Kotlin 项目中使用 android-input-mask by RedMadRobot。但目前,我正在处理非常奇怪的行为。该库仅在我禁用 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 文件中,我有这些代码行:

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 kotlin android-jetpack android-architecture-navigation input-mask


    【解决方案1】:

    好的,经过大量时间寻找答案,我发现我的问题与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())
                }
            }
        )
    
    }
    

    然后它就可以正常工作了。

    【讨论】:

      猜你喜欢
      • 2020-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-14
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多