Xamarin Android 更改辅助功能焦点
Xamarin Android change accessibility focus
在 Android Studio 中,使用 Java,要在特定视图上设置辅助功能焦点,例如,按下按钮,您必须执行 myview.sendAccessibilityEvent(AccessibilityEvent.WINDOWS_CHANGE_ACCESSIBILITY_FOCUSED)
。在 Xamaring 中,使用 C#,我发现最接近的东西是 myview.SendAccessibilityEvent(EventTypes.ViewAccessibilityFocused);
但它并没有那么好用,事实上,它只读出了 myview
可访问性名称,而没有真正将焦点放在上面,焦点停留在按下的按钮上。我也试过 myview.SendAccessibilityEvent(EventTypes.ViewFocused);
但它也不起作用。
我发现的另一件事是 myview.SendAccessibilityEventUnchecked(AccessibilityEvent.WindowsChangeAccessibilityFocused);
但我得到一个错误说 Argument 1: cannot convert from 'Android.Views.Accessibility.WindowsChange' to 'Android.Views.Accessibility.AccessibilityEvent'
即使据说 SendAccessibilityEventUnchecked
接受 AccessibilityEvent
作为参数。
知道如何解决吗?
或者关于如何在某些事件后将可访问性焦点设置到特定视图的任何想法?
(请注意,如果需要,我只是在 Android 本机上测试它,而不是我需要在使用依赖服务的 Forms 项目中使用它)
WINDOWS_CHANGE_ACCESSIBILITY_FOCUSED 是 TYPE_WINDOWS_CHANGED 的子类型,只能由系统调度。并且发送辅助功能事件不会改变辅助功能焦点。
实际上,发送辅助功能事件会触发辅助功能服务,您可以在服务的 onAccessibilityEvent 方法中更改辅助功能焦点:
public override void OnAccessibilityEvent(AccessibilityEvent e)
{
//you can use event type and source node to see if the event is sent by you
AccessibilityNodeInfo sourceNode = e.Source;
AccessibilityNodeInfo targetNode = sourceNode.FocusSearch(FocusSearchDirection.Down);
targetNode.PerformAction(Android.Views.Accessibility.Action.AccessibilityFocus);
}
查看有关辅助功能焦点和输入焦点的更多信息here。
问题已解决,实现该目标的正确方法应该是 myview.SendAccessibilityEvent(EventTypes.ViewHoverEnter)
具有与 Android 值 WINDOWS_CHANGE_ACCESSIBILITY_FOCUSED
.
相同的整数值
另一种方法是 myview.SendAccessibilityEvent((EventTypes) (int) WindowsChange.AccessibilityFocused)
,所以你必须在 WindowsChange.AccessibilityFocused
上进行双重转换,int
和 EventTypes
,因为 WindowsChange
是不同于 EventTypes
.
的枚举
我将打开的 github 问题留在我得到这些答案的地方 git issue。
在 Android Studio 中,使用 Java,要在特定视图上设置辅助功能焦点,例如,按下按钮,您必须执行 myview.sendAccessibilityEvent(AccessibilityEvent.WINDOWS_CHANGE_ACCESSIBILITY_FOCUSED)
。在 Xamaring 中,使用 C#,我发现最接近的东西是 myview.SendAccessibilityEvent(EventTypes.ViewAccessibilityFocused);
但它并没有那么好用,事实上,它只读出了 myview
可访问性名称,而没有真正将焦点放在上面,焦点停留在按下的按钮上。我也试过 myview.SendAccessibilityEvent(EventTypes.ViewFocused);
但它也不起作用。
我发现的另一件事是 myview.SendAccessibilityEventUnchecked(AccessibilityEvent.WindowsChangeAccessibilityFocused);
但我得到一个错误说 Argument 1: cannot convert from 'Android.Views.Accessibility.WindowsChange' to 'Android.Views.Accessibility.AccessibilityEvent'
即使据说 SendAccessibilityEventUnchecked
接受 AccessibilityEvent
作为参数。
知道如何解决吗? 或者关于如何在某些事件后将可访问性焦点设置到特定视图的任何想法? (请注意,如果需要,我只是在 Android 本机上测试它,而不是我需要在使用依赖服务的 Forms 项目中使用它)
WINDOWS_CHANGE_ACCESSIBILITY_FOCUSED 是 TYPE_WINDOWS_CHANGED 的子类型,只能由系统调度。并且发送辅助功能事件不会改变辅助功能焦点。
实际上,发送辅助功能事件会触发辅助功能服务,您可以在服务的 onAccessibilityEvent 方法中更改辅助功能焦点:
public override void OnAccessibilityEvent(AccessibilityEvent e)
{
//you can use event type and source node to see if the event is sent by you
AccessibilityNodeInfo sourceNode = e.Source;
AccessibilityNodeInfo targetNode = sourceNode.FocusSearch(FocusSearchDirection.Down);
targetNode.PerformAction(Android.Views.Accessibility.Action.AccessibilityFocus);
}
查看有关辅助功能焦点和输入焦点的更多信息here。
问题已解决,实现该目标的正确方法应该是 myview.SendAccessibilityEvent(EventTypes.ViewHoverEnter)
具有与 Android 值 WINDOWS_CHANGE_ACCESSIBILITY_FOCUSED
.
另一种方法是 myview.SendAccessibilityEvent((EventTypes) (int) WindowsChange.AccessibilityFocused)
,所以你必须在 WindowsChange.AccessibilityFocused
上进行双重转换,int
和 EventTypes
,因为 WindowsChange
是不同于 EventTypes
.
我将打开的 github 问题留在我得到这些答案的地方 git issue。