输入第一个数字后,EditText 失去焦点

时间:2021-05-01 07:44:18

标签: android android-viewpager lost-focus

我正在处理一个奇怪的问题,即我的 EditText 字段在输入第一个数字后失去焦点。

下面的示例显示了我的 Tablayout,顶部有三个选项卡/图标、3 个 EditText 视图以及在左侧第一个字段中输入第一个数字后的情况。焦点已自动从带有“1”的 EditField 转移到缩放选项卡图标。

Screenshot showing situation right after the issue occurred

重现步骤:

  1. 输入标签(哪个无关紧要)
  2. 选择 EditText 视图(哪个无关紧要)
  3. 软键盘弹出,光标闪烁
  4. 输入第一个字符
  5. 焦点移到选项卡级对象
  6. 再次选择相同的 EditText
  7. 编辑现在按预期工作,我可以清除字段,在字段之间跳转。
  8. 更改标签 -> 返回 #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 触发,这导致了我的问题:

  1. 选择不同的选项卡(=ViewPager2 的滚动事件,mAdapterState == 2)
  2. 在 EditText 中添加/删除数字
  3. ViewPager2 ScrollEventAdapter.onScrolled 使用 mAdapterState == 0 触发
  4. ViewPager2 ScrollEventAdapter.onScrolled 调用 PageSelected 这意味着 Edittext 失去焦点。

在某些手机上,当仅启用 2 个标签时似乎可以正常工作,而在其他手机上这无关紧要 所以我想真正的问题是为什么在我使用当前选项卡的 EditText 输入/删除一个值时 ViewPager2.onScrolled 会被触发?

0 个答案:

没有答案