Android 用 TalkBack 迭代 RecycleView 的隐藏项

标签 android android-recyclerview accessibility talkback

我有一个回收 View ,里面有超过 10 个项目。因为它有超过 10 个项目,所以一次只显示 4 个项目。 TalkBack 出现问题,我想通过向左/向右拖动操作来迭代列表,但在 4. 项目焦点转到布局上的另一个 View 组件上后。如何使用 Talkback 迭代 recycleview 的所有项目?

编辑: 我像这样使用我自己的辅助功能委托(delegate):

mRecyclerView.setAccessibilityDelegate(mAccessibilityDelegate);


public class AccessibilityDelegate extends View.AccessibilityDelegate {

private Assistant mAssistant;

public AccessibilityDelegate(Assistant assistant)
{
    mAssistant = assistant;
}

@Override
public void sendAccessibilityEvent(View host, int eventType) {
    if(!mAssistant.isSpeaking() && mAssistant.isRecognizerAvailable())
    {
        super.sendAccessibilityEvent(host, eventType);
    }
}

@Override
public boolean performAccessibilityAction(View host, int action, Bundle args) {
    if(!mAssistant.isSpeaking() && mAssistant.isRecognizerAvailable())
    {
        return super.performAccessibilityAction(host, action, args);
    }

    return false;
}

@Override
public void sendAccessibilityEventUnchecked(View host, AccessibilityEvent event) {
    super.sendAccessibilityEventUnchecked(host, event);
}

@Override
public boolean dispatchPopulateAccessibilityEvent(View host, AccessibilityEvent event) {
    return super.dispatchPopulateAccessibilityEvent(host, event);
}

@Override
public void onPopulateAccessibilityEvent(View host, AccessibilityEvent event) {
    super.onPopulateAccessibilityEvent(host, event);
}

@Override
public void onInitializeAccessibilityEvent(View host, AccessibilityEvent event) {
    super.onInitializeAccessibilityEvent(host, event);
}

@Override
public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfo info) {
    super.onInitializeAccessibilityNodeInfo(host, info);
}

@Override
public boolean onRequestSendAccessibilityEvent(ViewGroup host, View child, AccessibilityEvent event) {
    return super.onRequestSendAccessibilityEvent(host, child, event);
}

@Override
public AccessibilityNodeProvider getAccessibilityNodeProvider(View host) {
    return super.getAccessibilityNodeProvider(host);
}

}

最佳答案

经过几次尝试,我发现了问题。

要覆盖 RecycleView 的辅助功能,请扩展 RecyclerViewAccessibilityDelegate。

    //mRecyclerView.setAccessibilityDelegate(mAccessibilityDelegate);
    RVAccessibilityDelegate rvAccessibilityDelegate = new RVAccessibilityDelegate(mRecyclerView, mAssistant);
    mRecyclerView.setAccessibilityDelegateCompat(rvAccessibilityDelegate);

此外,如果您想禁用“显示第 1 项(共 6 项)”之类的公告,只需注释掉 super.sendAccessibilityEventUnchecked(host, event)

public class RVAccessibilityDelegate extends RecyclerViewAccessibilityDelegate {

private Assistant mAssistant;

public RVAccessibilityDelegate(RecyclerView recyclerView, Assistant assistant) {
    super(recyclerView);
    mAssistant = assistant;
}

@Override
public boolean performAccessibilityAction(View host, int action, Bundle args) {
    if(!mAssistant.isSpeaking() && mAssistant.isRecognizerAvailable())
    {
        return super.performAccessibilityAction(host, action, args);
    }

    return false;
}

@Override
public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfoCompat info) {
    super.onInitializeAccessibilityNodeInfo(host, info);
}

@Override
public void onInitializeAccessibilityEvent(View host, AccessibilityEvent event) {
    super.onInitializeAccessibilityEvent(host, event);
}

@Override
public void sendAccessibilityEvent(View host, int eventType) {
    if(!mAssistant.isSpeaking() && mAssistant.isRecognizerAvailable())
    {
        super.sendAccessibilityEvent(host, eventType);
    }
}

@Override
public void sendAccessibilityEventUnchecked(View host, AccessibilityEvent event) {
    //super.sendAccessibilityEventUnchecked(host, event);
}

@Override
public boolean dispatchPopulateAccessibilityEvent(View host, AccessibilityEvent event) {
    return super.dispatchPopulateAccessibilityEvent(host, event);
}

@Override
public void onPopulateAccessibilityEvent(View host, AccessibilityEvent event) {
    super.onPopulateAccessibilityEvent(host, event);
}

@Override
public boolean onRequestSendAccessibilityEvent(ViewGroup host, View child, AccessibilityEvent event) {
    return super.onRequestSendAccessibilityEvent(host, child, event);
}

@Override
public AccessibilityNodeProviderCompat getAccessibilityNodeProvider(View host) {
    return super.getAccessibilityNodeProvider(host);
}

}

关于Android 用 TalkBack 迭代 RecycleView 的隐藏项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40882079/

相关文章:

java - 如何根据类别实现带有节标题的 RecyclerView?

java - ImageView 图像上方和下方的填充

android - 如何使用Accessibility Delegate调整语音?

html - 屏幕阅读器在到达 span 元素时停止

android - 单击 recyclerView 时打开文件(pdf,mp3,mp4,...)

html - 您如何正确标记用于填写句子的下拉菜单?

android - 在 Android 上启用安全网设备检查 API 的具体步骤是什么

android - 如何创建要在自定义布局上使用的自定义 LayoutParams?

java - Android Studio,更改后退按钮的行为以影响 RecyclerView 中的项目

java - 从 RecyclerView 中删除最后一项不起作用