Android 的某些 EditText 字段不响应长按(API 30+ with layout_width 0dp)
Posted
技术标签:
【中文标题】Android 的某些 EditText 字段不响应长按(API 30+ with layout_width 0dp)【英文标题】:Android some EditText fields don't respond to long-press (API 30+ with layout_width 0dp) 【发布时间】:2021-12-29 16:17:47 【问题描述】:我想知道是否有其他人遇到过这个奇怪的错误。我的布局很复杂,但本质上是带有 EditText 字段的视图持有者行。
在我将目标 SDK 更新到 API 30 之前,它一直运行良好。
定位 API 30 后,一些我的 EditText 字段不响应“焦点触摸事件”(光标句柄不显示,您不能长按,并且您不能选择任何文本)。您仍然可以在字段中输入内容并通过点击移动光标。同样,一些文本字段可以正常工作,而另一些则受到此错误的影响。
^ 图片不是我的应用程序,只是为了显示光标处理程序以供理解。
约束布局和线性布局都有相同的bug。
<!-- in constraint layout -->
<androidx.appcompat.widget.AppCompatEditText
android:id="@+id/myTextField"
android:layout_
android:layout_
app:layout_constraintHorizontal_weight="1"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"/>
<!-- in linear layout -->
<androidx.appcompat.widget.AppCompatEditText
android:id="@+id/myTextField"
android:layout_
android:layout_
android:layout_weight="1"/>
如果我将文本字段的宽度更改为 wrap_content
,它适用于所有文本字段,但这不符合我的设计。我需要文本字段来填充可用空间。
我什至尝试手动将宽度设置为随机 dp 值,但仍然无效。
我已经在
我也有用户在生产中报告了这个问题。
我错过了什么吗?为什么这不适用于 API 30+?
还有其他方法可以让 EditText 字段填充空间吗?
更新(仍未解决):
我已将我的 Android Studio 更新到最新版本 Arctic Fox 2020.3.1.
。我还将 gradle 更新为 7.0.3
,将 kotlin 更新为 1.5.31
,并将我的所有库更新为最新版本。我正在使用androidx.core:core-ktx:1.7.0
和androidx.constraintlayout:constraintlayout:2.1.2
。
我进行了进一步调查,发现了更多奇怪之处。以编程方式设置任何文本或任何提示都会导致错误。在 xml 中设置文本或提示,完全没有错误。文本值来自数据库,所以我需要能够以编程方式设置它们。
// setting hint or text programmatically in .kt file causes the bug
// any one of the lines below will cause the bug
myTextField.setHint("myTextField hint")
myTextField.hint = "myTextField hint"
myTextField.setText("myTextField text")
myTextField.text = "myTextField text"
// setting hint or text in .xml file does not cause the bug
<androidx.appcompat.widget.AppCompatEditText
android:id="@+id/myTextField"
...
android:hint="myTextField hint"
android:text="myTextField text"
... />
【问题讨论】:
检查您使用的 androidx 版本并尝试更新可能与此相关。另外,请更清楚线性布局和约束布局版本是否都有这个问题。最后,发布大部分布局可能会有所帮助。无关:toLeftOf 是老式的。使用 toStartOf 我正在使用androidx.core:core-ktx:1.7.0'
和androidx.constraintlayout:constraintlayout:2.1.2'
。我还更新了问题以更清楚地表明两种布局都有错误并将 leftOf 切换为 startOf。
【参考方案1】:
我已尝试复制您的问题。它适用于 targetSdk 30 并更新您的约束。请在下面找到屏幕截图。这些是我所做的更改。
-
我更新了您使用的约束属性,因为它们已过时。例如。我将“layout_constraintLeft_toRightOf”更改为“layout_constraintStart_toStartOf”。
您声明约束属性的方式将视图置于父级的可见空间之外。例如。 'app:layout_constraintLeft_toRightOf="parent"' 将视图的左侧放在父级的末尾,这使得大部分视图不可见。
我根据您发送的代码更新了您设置约束的方式 题。在下面找到更新的代码。您还可以查看下面的屏幕截图,看看它是否有效。
<?xml version="1.0" encoding="utf-8"?>
<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_
android:layout_
tools:context=".Activities.MainActivity">
<!-- THIS IS THE CONSTRAINT LAYOUT-->
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/the_constraintlayout"
android:layout_
android:layout_
app:layout_constraintHorizontal_weight="1"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toTopOf="@+id/the_lineartlayout">
<androidx.appcompat.widget.AppCompatEditText
android:id="@+id/myTextField"
android:layout_
android:layout_
android:text="ConstraintLayout Sample Text"
android:gravity="center"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"/>
<!--
<androidx.appcompat.widget.AppCompatEditText
android:id="@+id/myTextField"
android:layout_
android:layout_
android:text="This is a sample text"
android:gravity="center"
app:layout_constraintHorizontal_weight="1"
app:layout_constraintLeft_toRightOf="parent"
app:layout_constraintRight_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"/>
-->
</androidx.constraintlayout.widget.ConstraintLayout>
<!-- THIS IS THE LINEAR LAYOUT-->
<androidx.appcompat.widget.LinearLayoutCompat
android:id="@+id/the_lineartlayout"
android:layout_
android:layout_
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@+id/the_constraintlayout"
app:layout_constraintBottom_toBottomOf="parent">
<androidx.appcompat.widget.AppCompatEditText
android:id="@+id/myTextField2"
android:layout_
android:text="LinearLayoutCompat Sample Text"
android:layout_
android:layout_weight="1"/>
</androidx.appcompat.widget.LinearLayoutCompat>
</androidx.constraintlayout.widget.ConstraintLayout>
【讨论】:
如果您觉得这不能帮助您解决问题,请将整个 xml 代码发布在问题中,以便我更好地查看 为什么不使用平面 XML 结构?没有嵌套约束布局? 这是一个 RecyclerView,每个视图持有者都有自己的 EditText 视图。它每次只发生在几个视图持有者身上(它是随机的)。我将尝试您的更改,看看它们是否有任何作用。 我在发布的示例代码中犯了一个错误,我已经修复了它(所以你的第二点与我的实际代码无关)。我尝试了更改,但没有任何区别。我仍然看到同样的错误。以上是关于Android 的某些 EditText 字段不响应长按(API 30+ with layout_width 0dp)的主要内容,如果未能解决你的问题,请参考以下文章
Android - 不自动选择 EditText 字段[重复]
Android:如何更改 EditText 字段中的文本大小?