如何在ViewPager2内部处理EditText的焦点

时间:2020-07-05 08:56:58

标签: java android android-edittext android-viewpager

我有一个包含5个片段的viewpager2,最后一个片段具有Edittext 问题是,每次用户选择最后一个片段时,我都希望对我的edittext请求focus()。

我尝试过的事情:

  1. 使用registerOnPageChangeCallback(),但问题是,我无法要求将重点放在页面更改上,因为它将导致NPE。
  2. 使用onresume,onattach等,当用户在片段之间进行更改时,它们都不被调用
  3. 不推荐使用setuservisisiblehint

任何对此问题的想法将不胜感激 谢谢

编辑:

对不起,我忘了提及

我的Viewpager(父级)位于其他viewpager2(子级)的最后一个片段中。所以我有viewpager2(parent),最后一个片段包含了我的viewpager2(child)。 当我选择的“子”的最后一个片段,我可以将焦点设置到的EditText。但是问题是,当我更改“父”选项卡并返回到包含“子”的最后一个片段时。我不能告诉“孩子”再次关注。

是的,简历和onpause在“父母的”片段而不是在“孩子”的片段上工作

谢谢

2 个答案:

答案 0 :(得分:0)

您可以在活动的最后一个片段的requestFocus方法中使用onCreateView,也可以在活动中使用onActivityCreated方法,尽管我从未使用过最后一个片段。

请记住,为了在EditText中requestFocus,您需要先在触摸模式下启用可聚焦。

您可以使用以下方法通过XML进行操作: android:focusableInTouchMode="true" 或使用Java: editText.setFocusableInTouchMode(true);

答案 1 :(得分:0)

您可以使用最后一个片段的onResume方法中的requestFocus,使用Viewpager2,将所有屏幕外片段的上限设为onStarted,并在完全显示在屏幕上时恢复。

我不确定你为什么说:-

使用onresume,onattach等,当用户在片段之间进行更改时,它们都不被调用

除非您在这里不是在谈论Activity's onResume

这种行为没有得到很好的记录,但是您可以在发行说明中看到其功能 https://developer.android.com/jetpack/androidx/releases/viewpager2#1.0.0-alpha06

FragmentStateAdapter:非主要项目片段的上限为STARTED,其menuVisibility设置为false。

https://developer.android.com/jetpack/androidx/releases/viewpager2#1.0.0-beta05

修复了更改页面时片段暂停/恢复交易的顺序的问题(我们现在总是在恢复新项目之前暂停旧的主要项目)。 (b / 139489059)

您还说:-

Setuservisisiblehint已弃用

不是Viewpager2的一部分,但原始viewpager和原始viewpager也仅恢复当前片段。