Androd material.textfield.TextInputEditText как убрать курсор во время скролинга длинного текста?
Есть material.textfield.TextInputEditText в него попадает длинный текст, на 30-40 строк. Во время прокрутки текста появляется фокус и курсор, которые мешают скролить. Нашёл решение, которое полностью отключает фокус и курсор, для этого необходимо передать textEdit.setFocusableInTouchMode(false); курсор отключается полностью во время скролинга, но как включить его обратно непонятно. Получается я проскролил, курсор пропал и больше его нет, невозможно вводить текст.
textEdit.setOnTouchListener { view, event ->
view.parent.requestDisallowInterceptTouchEvent(true)
//Выключаю курсор
textEdit.setFocusableInTouchMode(false);
textEdit.clearFocus();
if ((event.action and MotionEvent.ACTION_MASK) == MotionEvent.ACTION_SCROLL) {
view.parent.requestDisallowInterceptTouchEvent(false)
} else {
//performClick()
}
return@setOnTouchListener false
}
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/filledTextField"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
app:counterEnabled="true"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textInputLayout">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/edit_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:enabled="true"
android:focusable="true"
android:foregroundGravity="top"
android:importantForAutofill="no"
android:inputType="textMultiLine|textNoSuggestions"
android:isScrollContainer="true"
android:lineSpacingExtra="2dp"
android:maxLength="2048"
android:minLines="11"
android:maxLines="11"
android:selectAllOnFocus="false"
android:overScrollMode="always"
android:scrollbarStyle="insideInset"
android:scrollbars="vertical"
android:scrollHorizontally="false"
android:text=""
android:textSize="20sp" />
</com.google.android.material.textfield.TextInputLayout>
Ответы (1 шт):
Ответ с опозданием, но есть такое решение (возможно костыль). В главном активити переопределяем метод:
override fun dispatchTouchEvent(ev: MotionEvent?): Boolean {
currentFocus?.let { currFocus ->
val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
KeyboardUtil.hideKeyboard(this)
imm.hideSoftInputFromWindow(currFocus.windowToken, 0)
if (currentFocus != null) {
currentFocus!!.clearFocus()
}
}
return super.dispatchTouchEvent(ev)
}
Как только вы кликнете куда угодно кроме поля с текстом, у следующего фокус уберется и он перестанет быть активным до следующего вашего клика по нему
Параметры TextInputLayout:
<com.google.android.material.textfield.TextInputLayout
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:enabled="true"
android:gravity="top|start"
android:imeOptions="actionDone"">
<com.google.android.material.textfield.TextInputEditText
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="top|start"
android:inputType="textMultiLine"
android:singleLine="false"
app:textInputLayoutFocusedRectEnabled="false" />
</com.google.android.material.textfield.TextInputLayout>