Android Jetpack 导航组件问题与编辑文本掩码和错误消息
Android Jetpack Navigation Component issue with edit text masks and error messages
我正在尝试在我的 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 } />
我的问题是:这个"bug"有什么合理的解释吗?我在制造一些混乱吗?我该如何解决?
感谢您的帮助。
编辑:
错误消息的行为相同。如果我把这行代码:
test.error = "Error message"
使用 Android 导航组件未显示任何错误消息。但是,如果我在主 activity 布局中对片段进行硬编码,则会显示错误消息。
好的,经过大量时间寻找答案后,我发现我的问题与 Android 数据绑定库有关。更具体地说,我需要在我的 SignUpFragment
的 onCreateView
中创建的绑定对象中设置监听器和错误消息,如下所示:
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())
}
}
)
}
然后它工作正常。
我正在尝试在我的 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 } />
我的问题是:这个"bug"有什么合理的解释吗?我在制造一些混乱吗?我该如何解决?
感谢您的帮助。
编辑:
错误消息的行为相同。如果我把这行代码:
test.error = "Error message"
使用 Android 导航组件未显示任何错误消息。但是,如果我在主 activity 布局中对片段进行硬编码,则会显示错误消息。
好的,经过大量时间寻找答案后,我发现我的问题与 Android 数据绑定库有关。更具体地说,我需要在我的 SignUpFragment
的 onCreateView
中创建的绑定对象中设置监听器和错误消息,如下所示:
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())
}
}
)
}
然后它工作正常。