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