gpt4 book ai didi

android - 自定义 ViewGroup 焦点处理

转载 作者:IT老高 更新时间:2023-10-28 23:25:23 24 4
gpt4 key购买 nike

假设我有一个可聚焦的自定义 ViewGroup,并且具有一些可聚焦的 subview (Android 机顶盒的自定义垂直菜单,它应该对 Remote 使用react)。

每当自定义 ViewGroup 获得焦点时,我都需要将焦点传递给某些 subview 。

我将 descendantFocusability 设置为 beforeDescendants 并将 OnFocusChangeListener 设置为自定义 ViewGroup 但 OnFocusChangeListener.onFocusChanged() 是从来没有打电话。 beforeDescendants 看起来不像我预期的那样工作。实际上设置 beforeDescendants 的工作方式与设置 afterDescendants 相同 - 焦点由最近的 subview 获取,自定义 ViewGroup 没有机会决定应该使用哪个 subview 把焦点放在。

如何实现所需的行为? ViewGroups 中处理焦点的最佳实践是什么?

最佳答案

在挖掘 Android 源代码后,我了解了如何将焦点分配给 ViewGroup 的子级。例如,我有自定义 ViewGroup 里面有几个 EditText 字段。当用户单击 ViewGroup(在每个 EditText 之外)时,我想将焦点分配给其中一个字段。

为此,我们需要将 descendantFocusability 设置为 FOCUS_AFTER_DESCENDANTS。这意味着我们可以我们的自定义 View 尝试聚焦自身之前处理聚焦事件:

setDescendantFocusability(FOCUS_AFTER_DESCENDANTS);


下一步是重写 onRequestFocusInDescendants 方法,如果设置了标志 FOCUS_AFTER_DESCENDANTS,它将在 自定义 View 的 requestFocus 之前调用。在这种方法中,我们可以请求子焦点:

@Override
protected boolean onRequestFocusInDescendants(final int dir, final Rect rect) {
return getChildAt(this.target).requestFocus();
}

这个方法的一个重要的事情是:如果我们在这里返回 true,我们的自定义 View 将不会被请求聚焦(只有 FOCUS_AFTER_DESCENDANTS)。

通过这种方式,我们可以更改 target 字段以更改单击 ViewGroup 时将聚焦哪个子项。


为了更好地理解,您可以在 Android 源代码中的 ViewGroup 中找到 requestFocus 方法。

关于android - 自定义 ViewGroup 焦点处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29538526/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com