我有一个带有长按动作处理程序的视图。我使用内容描述来设置视图获得焦点时“对讲”所要传达的信息。
[当前,它表示我的内容描述是在获得焦点之后,稍停片刻后说:
双击以激活,双击并按住以长按
我想将此消息更改为类似内容
双击至“动作1”,双击并按住“动作2”
有办法吗?
我调查了onPopulateAccessibilityEvent()
,它得到了TYPE_VIEW_ACCESSIBILITY_FOCUSED
事件,但是我无法更改所需的消息。
我想念一些简单的东西吗?
自[[alanv发布他的答案以来,AccessibilityAction
似乎已经略有变化。这是使用ViewCompat
的有效解决方案:
ViewCompat.setAccessibilityDelegate(view, new AccessibilityDelegateCompat() {
@Override
public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfoCompat info) {
super.onInitializeAccessibilityNodeInfo(host, info);
// A custom action description. For example, you could use "pause"
// to have TalkBack speak "double-tap to pause."
CharSequence description = host.getResources().getText(R.string.my_click_desc);
AccessibilityActionCompat customClick = new AccessibilityActionCompat(
AccessibilityNodeInfoCompat.ACTION_CLICK, description);
info.addAction(customClick);
}
});
AccessibilityNodeInfo
上设置自定义操作来自定义操作名称。有两种方法:1)设置AccessibilityDelegate
并覆盖onInitializeAccessibilityNodeInfo
委托方法,或2)扩展视图的类并覆盖onInitializeAccessibilityNodeInfo
。无论哪种方式,您都将构造一个新的AccessibilityAction并使用AccessibilityNodeInfo.addAction在节点上进行设置。
如果选择使用委托,则将为点击操作设置自定义描述,如下所示:
view.setAccessibilityDelegate(new AccessibilityDelegate() {
@Override
public void onInitializeAccessibilityNodeInfo(
View v, AccessibilityNodeInfo info) {
super.onInitializeAccessibilityNodeInfo(v, info);
// A custom action description. For example, you could use "pause"
// to have TalkBack speak "double-tap to pause."
CharSequence description = getResources().getText(R.string.my_click_desc);
AccessibilityAction customClick = new AccessibilityAction(
AccessibilityAction.ACTION_CLICK, description);
info.addAction(customClick);
}
});
如果应用程序的目标API <21,请替换相应的*Compat
支持库方法。该功能未向后移植,因此您不会在API <21上获得自定义描述,但是您将能够避免在应用程序代码中进行明确的版本检查。
mSubTitleText = (TextView) view.findViewById(R.id.txt_subtitle);
ViewCompat.setAccessibilityDelegate(mSubTitleText, new AccessibilityDelegateCompat() {
@Override
public void onPopulateAccessibilityEvent(View host, AccessibilityEvent event) {
host.setClickable(false);
host.setLongClickable(false);
}
});
ViewCompat.setAccessibilityDelegate(view, new AccessibilityDelegateCompat() {
@Override
public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfoCompat info) {
super.onInitializeAccessibilityNodeInfo(host, info);
info.addAction(AccessibilityNodeInfoCompat.ACTION_FOCUS);
}
});
这基本上是在调用下面的代码,requestFocus
没有与之关联的任何默认对讲通知。
case AccessibilityNodeInfo.ACTION_FOCUS: { if (!hasFocus()) { // Get out of touch mode since accessibility // wants to move focus around. getViewRootImpl().ensureTouchMode(false); return requestFocus(); } }