Disable focus on fragment

后端 未结 3 1237
小蘑菇
小蘑菇 2021-01-02 19:43

I\'m working on application for TV platform and use RCU for navigation.

I have use case where I have two fragments one above each other and visible on the screen at

3条回答
  •  清歌不尽
    2021-01-02 20:00

    I had the same problem and the accepted answer worked for me.

    Here is my version of the implementation so far (it can be improved):

    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 = 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)
                }
            }
        }
    
    }
    

提交回复
热议问题