如何解决输入第一个数字后,EditText 失去焦点
我正在处理一个奇怪的问题,即我的 EditText 字段在输入第一个数字后失去焦点。
下面的示例显示了我的 Tablayout,顶部有三个选项卡/图标、3 个 EditText 视图以及在左侧第一个字段中输入第一个数字后的情况。焦点已自动从带有“1”的 EditField 转移到缩放选项卡图标。
Screenshot showing situation right after the issue occurred
重现步骤:
- 输入标签(哪个无关紧要)
- 选择 EditText 视图(哪个无关紧要)
- 软键盘弹出,光标闪烁
- 输入第一个字符
- 焦点移到选项卡级对象
- 再次选择相同的 EditText
- 编辑现在按预期工作,我可以清除字段,在字段之间跳转。
- 更改标签 -> 返回 #2
我在下面添加了调试功能以进行故障排除,并且每当发生这种情况时都会收到正确的“焦点丢失”消息,但除此之外,LogCat 中没有任何真正引人注目的内容。
binding.etSys.setonFocuschangelistener { _,hasFocus ->
if (!hasFocus) Log.d("Log","focus lost")
else Log.d("Log","focused")
}
我可以删除初始数字并再次输入相同的数字,移动到另一个字段并返回等,而不会再次出现此问题。所以在我看来,这与在显示选项卡时第一次输入 EditField 有某种关系。
似乎伴随着失去焦点的唯一其他 log cat 消息是下面的 getText 消息,但是当我以编程方式更改焦点时,我也会收到这些消息,以防有足够的数据进入。所以很可能与我的问题无关。
2021-05-01 09:05:12.666 17734-17734/com.zell_mbc.medilog D/Log: focus lost
2021-05-01 09:05:12.686 17734-17734/com.zell_mbc.medilog W/IInputConnectionWrapper: getTextBeforeCursor on inactive InputConnection
2021-05-01 09:05:12.691 17734-17734/com.zell_mbc.medilog W/IInputConnectionWrapper: getSelectedText on inactive InputConnection
2021-05-01 09:05:12.692 17734-17734/com.zell_mbc.medilog W/IInputConnectionWrapper: getTextAfterCursor on inactive InputConnection
这是第一个 EditText 的样子,其他的使用相同的参数。我不认为它们有什么特别之处:
<EditText
android:id="@+id/etSys"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:ellipsize="end"
android:ems="4"
android:hint="@string/systolic"
android:importantForAutofill="no"
android:inputType="number"
android:maxLength="3"
android:nextFocusDown="@+id/etDia"
android:order="1"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
这种行为在我所有的模拟器图像 (API 27-30) 和我的实体手机上都显示出来,但出于某种奇怪的原因,我的所有用户都没有看到。
在对此进行了一段时间的调查后,我对接下来要尝试的内容没有任何想法,因此感谢任何帮助或想法。
编辑:设法深入挖掘并确定(我认为)ScrollEventAdapter.java 中下面的 ViewPager2 代码是我失去焦点的原因:
176 public void onScrolled(@NonNull RecyclerView recyclerView,int dx,int dy)
…
192 } else if (mAdapterState == STATE_IDLE) {
193 // onScrolled while IDLE means RV has just been populated after an adapter has been set.
194 // Contract requires us to fire onPageSelected as well.
在通过选项卡正常切换期间,使用 mAdapterState == 2 调用 ScrollEventAdapter.onScrolled,一切正常。 但是,当我在其中一个 Fragments ScrollEventAdapter.onScrolled 中选择 EditText 时,再次使用 mAdapterState==0 触发,这导致了我的问题:
- 选择不同的选项卡(=ViewPager2 的滚动事件,mAdapterState == 2)
- 在 EditText 中添加/删除数字
- ViewPager2 ScrollEventAdapter.onScrolled 使用 mAdapterState == 0 触发
- ViewPager2 ScrollEventAdapter.onScrolled 调用 PageSelected 这意味着 Edittext 失去焦点。
在某些手机上,当仅启用 2 个标签时似乎可以正常工作,而在其他手机上这无关紧要 所以我想真正的问题是为什么在我使用当前选项卡的 EditText 输入/删除一个值时 ViewPager2.onScrolled 会被触发?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。