按下按键时,return false和return super.onkeydown()有什么区别?

5
我在一个LinearLayout中放置了一个ListView,并且我想要重写ListView中的onKeyDown()方法,但是我不控制焦点,只是在onKeyDown()方法中改变一些变量。我希望系统像我没有重写onKeyDown()方法一样运行。我应该怎么做?返回false还是返回super.onKeyDown()?如果有任何帮助,将非常感谢。提前致谢。
有三个ListView,a、b和c是它们的三个项目。当焦点在c上时,当我按下键盘上的左箭头时,a会自动获得焦点。我想让ListView2中的第一个项目获得焦点,我该怎么做?
2个回答

5

ntc并不完全正确。操作系统并不使用反射来获取您的基类处理程序。

如果您返回false,则明确告诉操作系统您不想处理此事件;然后操作系统调用View的父处理程序(正如您的测试所示)。这会一直持续,直到事件被处理或达到顶层视图。

如果您调用super.OnKeyDown(),则允许您的基类处理事件。请注意,它是同一个视图提供的基类处理程序,而不是父视图,请勿混淆。

因此,使用其中之一取决于您想要的视图行为。

我认为在您的情况下,您需要return super.onKeyDown();


1
是的,你说得对,我明白了。在我的情况下,我应该返回super.onkeydown()。但我发现焦点总是会改变,不像我想要的那样。 - zyunchen
如果用户界面不允许您这样做,您可能需要再三考虑是否真的需要这样做。用户不应该因意外的用户界面行为而感到困惑。 - port443
系统默认的焦点变化可能会让用户感到困惑,我只想将其调整为正常。我会发布一张图片以使其更清晰。 - zyunchen
很抱歉,我的账户声望比10低5分,所以我无法在问题中添加图片... - zyunchen
这可能现在应该是另一个问题了 :) 请注意,Android有两种模式:可聚焦和无聚焦。这两种模式会根据用户输入进行切换:如果用户按下键盘上的某个键 - 它会变成可聚焦模式;如果用户触摸屏幕 - 它会变成无聚焦模式。在无聚焦模式下,没有列表项被聚焦。 - port443
嗯,这是我的错,我没有表达清楚,它总是由键盘控制而不是触摸屏。 - zyunchen

1

super.onkeyDown()- 这将把处理 onKeyDown 事件的责任放在超类上,由你自己决定如何处理它。当你返回 false 时,Android 假定你没有处理 onKeyDown 事件,并默认调用 super.onKeyDown()(而无需你调用它)。


当返回false时,父视图而不是父类将处理onKeyDown。 - zyunchen
我刚刚创建了一个继承自ListView的FileListView类,并将其放置在LinearLayout中。如果onKeyDown返回false,那么LinearLayout会处理它;如果返回super.onKeyDown,则ListView会处理它。这是我的理解,但我不确定是否正确。 - zyunchen

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