android 将焦点保持在上一个片段的视图上

utugiqy6  于 2023-01-19  发布在  Android
关注(0)|答案(3)|浏览(144)

假设片段A中有5个视图(1、2、3、4、5),并且每个视图都是可聚焦的,那么,如果片段A中的当前焦点在视图3上,并且单击该视图加载了一个新片段,假设片段B。
现在,当我按下返回按钮时,是否有办法使焦点自动保留在片段A的视图3上?
注意:我已经在backstack中添加了这些片段。但是我的片段包含回收器视图。单击回收器视图的一个项目将加载另一个片段,并且在back按下时,Main Activity将获得默认焦点。我可以通过实现片段的onBackPressListener()方法来实现将焦点集中在回收器视图的第一个项目上。但是我不知道如何像以前一样将焦点保持在片段上。

ljsrvy3e

ljsrvy3e1#

您可以随时将这些片段添加到片段管理器的backstack中。

9nvpjoqh

9nvpjoqh2#

如果您使用“添加到反向堆栈”将片段添加到片段A的顶部,则当您按下“返回”按钮时,它将在最后聚焦的项目中恢复

63lcw9qa

63lcw9qa3#

对于那些仍在寻找解决方案的人,我测试了许多方法,但这一种对我来说是最好的(Kotlin):Image

片段A

1-在片段A的onStop()中,阻止片段的后代可聚焦性,以避免BACK上的活动将焦点给予随机按钮

override fun onStop() {
    println("**onStop")
    (view as ViewGroup?)?.descendantFocusability = ViewGroup.FOCUS_BLOCK_DESCENDANTS
    super.onStop()
}

2-在简历上做一些事情

private var doOnResume: (() -> Unit?)? = null

3-设置片段转场

// add a lambda here too
private fun gotoFragment(onResume: () -> Unit) {

    //initialize doOnResume here
    doOnResume = onResume

    (requireActivity() as MainActivity).apply {
        supportFragmentManager.commit {
            replace(R.id.app_container, DetailsFragment())
            addToBackStack(null)
        }

    }

}

4-我正在使用leanback RowSupportFragment,当您请求焦点到它的verticalGridView时,它会自动将焦点设置到最后一项

listFragment.setOnContentClickedListener {
        gotoFragment {
            listFragment.verticalGridView.requestFocus()
        }
    }

注意您可以将焦点放在任何所需的视图上

private fun onPlayButtonClicked() {
    binding.playBTN.setOnClickListener {button->
        gotoFragment {
            button.requestFocus()
        }

    }

}

5-在onResume中调用lambda

override fun onResume() {
   //unblock descendantFocusability again
    (view as ViewGroup?)?.descendantFocusability = ViewGroup.FOCUS_AFTER_DESCENDANTS

    //avoid crashing app when gridview is not initialized yet or any other reason
    try {

        doOnResume?.invoke()
    } catch (_:Exception) {
    }
    super.onResume()
}

相关问题