当我在EditText
中切换页面时,我需要专注于第一个ViewPager
。我做了onPageChangeListener
,它将为特定页面调用requestFocus函数。对于此屏幕,它应该为第一个EditText
请求焦点。
我发现的结果:在instantiateItem()
之后调用在PagerAdapter
内部onPageSelected
中调用的函数。从逻辑上讲这是正确的,当调用我的自定义“ onCreate”函数(将布局添加到requestFocus()
时)时,我应该调用ViewGroup
。
但是,ViewPager
内有一页以上时,这会导致严重的问题。
如果您选择特定页面(例如tabLayout.getTabAt(1)?.select()
),它将不仅为选定页面调用此自定义onCreate
,有时还会调用下一页。这意味着我将在2页上调用两个requestFocus函数(即使第二页不可见并且不应实例化)。
我提出了这个解决方案(当您选择页面时,我称为requestFocus)。但这会引起问题。例如,如果在开始时切换到最后一页,它将在布局传递到ViewGroup
的{{1}}之前调用此请求函数。
这使得函数调用无用,因为PagerAdapter
尚未初始化。 (空)
有什么解决办法吗?
PagerAdapter:
firstEt
屏幕3: 内部onCreate:
override fun instantiateItem(container: ViewGroup, position: Int): View {
val layout = pageList[position].onCreate(container)
container.addView(layout)
return layout
}
Screen3对象内部的功能:
firstEt?.setOnFocusChangeListener { v, hasFocus ->
log("KeyboardVisible: onFocusChange $hasFocus")
}
活动中:
fun requestInitFocus(){
log("KeyboardVisible: requestingFocus")
firstEt?.requestFocus()
app.showKeyboard()
}
答案 0 :(得分:0)
也许您应该添加逻辑以捕获片段中的焦点而不是适配器
fragment_3_layout.xml
...
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/passwordEditText"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<requestFocus/>
</com.google.android.material.textfield.TextInputEditText>
Screen3.kt
...
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
requireActivity().showKeyboard(passwordEditText)
}
ActivityExtensions.kt
fun Activity.showKeyboard(view: View): Boolean? =
inputMethodManager?.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT)