Android Jetpack Navigation Component проблема с редактированием текстовых масок и сообщений об ошибках - PullRequest
0 голосов
/ 09 июля 2019

Я пытаюсь использовать android-input-mask by RedMadRobot в моем проекте Android Kotlin.Но в настоящее время я имею дело с очень странным поведением.Библиотека работает только тогда, когда я отключаю компонент навигации 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()
}

Но это не работает, как вы можете видеть на следующем рисунке:

Mask is not applyed

Однако, когда я жестко кодирую фрагмент регистрации в файле activity_main.xml, все отлично работает:

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

mask is applyed

Мой вопрос: Есть ли какое-нибудь правдоподобное объяснение этой "ошибке"?Я что-то путаю?Как я могу это решить?

Спасибо за помощь.

РЕДАКТИРОВАТЬ:

То же поведение для сообщений об ошибках.Если я введу эту строку кода:

test.error = "Error message"

с помощью компонента навигации Android, сообщение об ошибке не отображается.Однако, если я жестко закодирую фрагмент в макете основной активности, появится сообщение об ошибке.

1 Ответ

0 голосов
/ 10 июля 2019

Хорошо, после большого количества времени, потраченного на поиск ответов, я обнаружил, что моя проблема связана с библиотекой привязки данных Android. В частности, мне нужно установить прослушиватели и сообщение об ошибке в объекте привязки, созданном в onCreateView моего SignUpFragment, следующим образом:

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())
            }
        }
    )

}

и тогда все работает нормально.

...