Android 当碎片位于另一个碎片的顶部时,焦点丢失

Android 当碎片位于另一个碎片的顶部时,焦点丢失,android,android-fragments,Android,Android Fragments,大家好。我有一个片段a。从那里我用.add()添加片段B,因为我想把片段a作为背景。到目前为止一切都还好。问题是,我可以将注意力集中在片段B recyclerview项的上,并在片段A中导航,这是我想要避免的。有解决办法吗?如果是,怎么做?有没有办法禁用片段a的聚焦性 我试过这样的东西(伪代码) 活动“X”: 还有其他想法吗 另外,这实际上是在Android电视上使用的Leanback库。可能有一种解决方案,可以使用leanback内置程序来改变路线,禁用对片段a的关注,但我很确定还有其他最先进

大家好。我有一个片段a。从那里我用
.add()
添加片段B,因为我想把片段a作为背景。到目前为止一切都还好。问题是,我可以
将注意力集中在片段B recyclerview项的
上,并在片段A中导航,这是我想要避免的。有解决办法吗?如果是,怎么做?有没有办法禁用片段a的聚焦性

我试过这样的东西(伪代码)

活动“X”:

还有其他想法吗

另外,这实际上是在Android电视上使用的Leanback库。可能有一种解决方案,可以使用leanback内置程序来改变路线,禁用对片段a的关注,但我很确定还有其他最先进的方法可以做到这一点


关于卡片视图-

我遇到了完全相同的问题,我发现了这个副本:

被接受的解决方案对我有效

以下是我目前的实施版本(可以改进):

抽象类BaseFragment:Fragment(){
private val screenFocusHelper=screenFocusHelper()
趣味使能焦点(){
如果(视图!=null){
//启用焦点
screenFocusHelper.setEnableView(作为视图组查看,true)
//清晰的可聚焦元素
screenFocusHelper.focusableViews.clear()
}
childFragmentManager.fragments.forEach{
if(它是BaseFragment){
it.enableFocus()
}
}
}
有趣的双关语(){
如果(视图!=null){
//存储最后一个焦点元素
screenFocusHelper.previousFocus=view?.findFocus()
//明确当前重点
查看!!.clearFocus()
//禁用焦点
screenFocusHelper.setEnableView(作为视图组查看,错误)
}
childFragmentManager.fragments.forEach{
if(它是BaseFragment){
it.disableFocus()
}
}
}
}
类屏幕聚焦帮助器{
var previousFocus:视图?=null
val focusableview:MutableList=mutableListOf()
fun setEnableView(视图组:视图组,isEnabled:Boolean){
findFocusableViews(视图组)
对于(在FocusableView中查看){
view.isEnabled=isEnabled
view.isFocusable=isEnabled
}
}
私人娱乐findFocusableViews(查看组:查看组){
val childCount=viewGroup.childCount
for(在0中输入i,直到childCount){
val view=viewGroup.getChildAt(i)
if(view.isFocusable){
如果(!focusableViews.contains(视图)){
focusableViews+=视图
}
}
如果(视图是视图组){
findFocusableViews(视图)
}
}
}
}

您好,您找到解决方案了吗?
onBackStackChange 
    if fragment B is on top {
        fragment A.getView.setFocusability = false;
    }
abstract class BaseFragment<....> : Fragment() {

    private val screenFocusHelper = ScreenFocusHelper()

    fun enableFocus() {
        if (view != null) {
            // Enable focus
            screenFocusHelper.setEnableView(view as ViewGroup, true)

            // Clear focusable elements
            screenFocusHelper.focusableViews.clear()
        }

        childFragmentManager.fragments.forEach {
            if (it is BaseFragment<*, *>) {
                it.enableFocus()
            }
        }
    }

    fun disableFocus() {
        if (view != null) {
            // Store last focused element
            screenFocusHelper.previousFocus = view?.findFocus()

            // Clear current focus
            view!!.clearFocus()

            // Disable focus
            screenFocusHelper.setEnableView(view as ViewGroup, false)
        }

        childFragmentManager.fragments.forEach {
            if (it is BaseFragment<*, *>) {
                it.disableFocus()
            }
        }
    }

}

class ScreenFocusHelper {

    var previousFocus: View? = null

    val focusableViews: MutableList<View> = mutableListOf()

    fun setEnableView(viewGroup: ViewGroup, isEnabled: Boolean) {
        findFocusableViews(viewGroup)

        for (view in focusableViews) {
            view.isEnabled = isEnabled
            view.isFocusable = isEnabled
        }
    }

    private fun findFocusableViews(viewGroup: ViewGroup) {
        val childCount = viewGroup.childCount
        for (i in 0 until childCount) {
            val view = viewGroup.getChildAt(i)
            if (view.isFocusable) {
                if (!focusableViews.contains(view)) {
                    focusableViews += view
                }
            }
            if (view is ViewGroup) {
                findFocusableViews(view)
            }
        }
    }

}