在初始化布局之前会触发ViewPager onPageSelected函数

时间:2019-08-15 09:20:49

标签: android android-layout android-edittext android-viewpager android-softkeyboard

当我在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()
}

1 个答案:

答案 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)