获取最后获得焦点的子元素

4
我发现在我的应用中使用方向键或者轨迹球进行导航时,如果你向右移动并且列表视图失去焦点,当列表视图重新获得焦点时,一个不同的子项将被赋予焦点而不是上一个获得焦点的子项。我试图使用onFocusChange(...)来保存哪个子项拥有焦点,但看起来这个方法在失去焦点之后才被调用,所以我永远也无法获取上一个拥有焦点的子项。是否有一种方式可以获得谁拥有焦点,以便在列表视图再次获得焦点时调用requestFocus()方法呢?
不幸的是,我不能使用handler,因为这并不是一个经常使用的功能,我不想为了一个小功能而牺牲性能。
以下是我尝试过但未成功的代码(无论如何,focusedView始终为空):
mainListView.setOnFocusChangeListener(new OnFocusChangeListener() {

        public void onFocusChange(View v, boolean hasFocus) {
            if(focusedView == null ) { Log.i("focus", "focusedView == null"); }
            if(hasFocus && focusedView != null) {
                Log.i("focus", "Focus has been Recieved.............");
                focusedView.requestFocus();
            } else {
                // Focus has been lost so save the id of what the user had selected
                Log.i("focus", "Focus has been Lost.............");
                focusedView = mainListView.findFocus();
            }
        }
    });

谢谢!

1个回答

2

我认为你的答案非常正确,因为焦点监听器在失去焦点后被调用,没有子元素处于焦点状态,因此.findFocus()将返回null。

我建议您扩展ListView类,并重写onFocusChanged方法。基本上,您可以像之前那样操作,但是当gainFocus为true时在其中执行。

@Override
protected void onFocusChanged (boolean gainFocus, 
     int direction, Rect previouslyFocusedRect) {
     if(gainFocus)
         focusedView = mainListView.findFocus();

}

This one


那个方法运行得很好,除了findFocus()函数搞砸了一切。看起来findFocus会把焦点重新放回到listView并再次调用onFocusChanged(..),导致我无法移动焦点。你有什么关于这个问题的见解吗?非常感谢你迄今为止的帮助。 - FuegoFingers
2
你说它把它带回到列表视图,所以我猜想你在 gainFocus 为 false 的情况下调用了 findFocus()(文档说如果视图有焦点则为 true,否则为 false)。我建议尝试另一种方法,即如果视图已经获得了焦点 gainFocus==true,则记录最后一个子项。然后在你的 setOnFocusChangeListener 监听器中,当焦点被获取时,将焦点设置为最后一个已知的子项。我可能误解了你的意思,你已经这样做了,但是焦点从子项移动到列表中了。是这种情况吗? - JustDanyul
@FuegoFingers,如果您已经解决了问题,能否发布解决方案?我遇到了相同的情况!我正在尝试实现JustDanyul的解决方案。 - r4jiv007
抱歉,这个问题很久以前就出现了,而且我已经换了工作,没有代码了。我真的不记得当时是怎么解决的了。 - FuegoFingers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接