The answers above don't really work in all cases, e.g. the Talkback mode.
I added an additional view on top of the EditText
and assigned a click listener to it.
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
...
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/textInputLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/textInputEditText"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</com.google.android.material.textfield.TextInputLayout>
<View
android:id="@+id/btnTextInputLayout"
android:layout_width="0dp"
android:layout_height="0dp"
android:background="?selectableItemBackground"
app:layout_constraintBottom_toBottomOf="@+id/textInputLayout"
app:layout_constraintEnd_toEndOf="@+id/textInputLayout"
app:layout_constraintStart_toStartOf="@+id/textInputLayout"
app:layout_constraintTop_toTopOf="@+id/textInputLayout" />
...
</androidx.constraintlayout.widget.ConstraintLayout>
Helper functions:
private fun makeOverlayEditTextEditable(
editText: EditText,
clickOverlayView: View,
inputType: Int
) {
enableEditTextInput(editText, inputType)
clickOverlayView.isVisible = false
}
private fun makeOverlayEditTextClickable(
editText: EditText,
clickOverlayView: View,
clickListener: () -> Unit
) {
disableEditTextInput(editText)
clickOverlayView.setOnClickListener {
clickListener()
}
clickOverlayView.isVisible = true
}
@SuppressLint("ClickableViewAccessibility")
private fun disableEditTextInput(editText: EditText) {
editText.inputType = InputType.TYPE_NULL
editText.isFocusable = false
editText.isFocusableInTouchMode = false
editText.isClickable = false
editText.setOnTouchListener { _, _ -> true }
}
@SuppressLint("ClickableViewAccessibility")
private fun enableEditTextInput(editText: EditText, inputType: Int) {
editText.inputType = inputType
editText.isFocusable = true
editText.isFocusableInTouchMode = true
editText.isClickable = true
editText.setOnTouchListener(null)
}
Usage:
// Make EditText editable
makeOverlayEditTextEditable(
editText = binding.textInputLayout,
clickOverlayView = binding.btnTextInputLayout,
inputType = InputType.TYPE_CLASS_TEXT
)
// Make EditText clickable
makeOverlayEditTextClickable(
editText = binding.textInputLayout,
clickOverlayView = binding.btnTextInputLayout,
) {
// Handle click
}
If this pattern is used all across the application, it makes sense to abstract this logic in the custom view.