【问题标题】:Accessibility function implementation problems in AndroidAndroid中的辅助功能实现问题
【发布时间】:2013-12-09 09:30:27
【问题描述】:

我正在开发查看书籍的应用程序。有一个屏幕(活动)显示一本书。它具有自定义视图,类似于 ViewSwitcher,每个页面都是由自定义视图呈现的位图。

现在我应该实现无障碍功能 - 书应该通过电话阅读(音频)。

我在这里阅读了无障碍部分https://developer.android.com/guide/topics/ui/accessibility/index.html,但还不够清楚。

我使用 SupportLibrary 进行可访问性管理,现在我在 ViewGroup(管理书页)中有此代码。 代码 1

private class EditionPagesViewSwitcherAccessibilityDelegate extends AccessibilityDelegateCompat {

    private int mPageCount;
    private double[] mPageRange;

    @Override
    public void onInitializeAccessibilityEvent(final View host, final AccessibilityEvent event) {
        super.onInitializeAccessibilityEvent(host, event);
        event.setClassName(EditionPagesViewSwitcher.class.getName());
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
            event.setScrollable(canScroll());
        }
        if (event.getEventType() == AccessibilityEventCompat.TYPE_VIEW_SCROLLED && updatePageValues()) {
            event.setItemCount(mPageCount);
            // we use +1 because of user friendly numbers (from 1 not 0)
            event.setFromIndex((int) (mPageRange[0] + 1));
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
                event.setToIndex((int) (mPageRange[1] + 1));
            }
        }
    }

    @Override
    public void onInitializeAccessibilityNodeInfo(final View host, final AccessibilityNodeInfoCompat info) {
        super.onInitializeAccessibilityNodeInfo(host, info);
        info.setClassName(EditionPagesViewSwitcher.class.getName());

        info.setScrollable(canScroll());
        info.setLongClickable(true);
        if (canScrollForward()) {
            info.addAction(AccessibilityNodeInfoCompat.ACTION_SCROLL_FORWARD);
        }
        if (canScrollBackward()) {
            info.addAction(AccessibilityNodeInfoCompat.ACTION_SCROLL_BACKWARD);
        }
    }

    @Override
    public boolean performAccessibilityAction(final View host, final int action, final Bundle args) {
        if (super.performAccessibilityAction(host, action, args)) {
            return true;
        }
        switch (action) {
            case AccessibilityNodeInfoCompat.ACTION_SCROLL_FORWARD: {
                if (canScrollForward()) {
                    showNext();
                    return true;
                }
            }
            return false;
            case AccessibilityNodeInfoCompat.ACTION_SCROLL_BACKWARD: {
                if (canScrollBackward()) {
                    showPrevious();
                    return true;
                }
            }
            return false;
        }
        return false;
    }

这是来自页面视图的代码代码 2

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

        event.setClassName(EditionPageView.class.getName());
        if (hasText()) {
            event.getText().add(getPageRangeText());
            final String trimText = mSurfaceUpdateData.getPageText().trim();
            if (trimText.length() > MAX_TEXT_LENGTH) {
                event.getText().add(trimText.substring(0, MAX_TEXT_LENGTH));
//              event.getText().add(trimText.substring(MAX_TEXT_LENGTH, trimText.length()));
            }
            else {
                event.getText().add(trimText);
            }
        }
    }

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

        info.setClassName(EditionPageView.class.getName());
    }

因为页面文本数据在执行 onInitializeAccessibilityEvent 代码时异步加载第一次可访问性没有任何文本。然后在加载数据后,我触发 AccessibilityEvent.TYPE_VIEW_SELECTED 和 AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED 事件。然后 onInitializeAccessibilityEvent 再次执行并电话“阅读”书籍文本。

所以我的问题:

  1. 我的辅助功能实施是否正确?可能是设计错误?因为我没有找到任何关于这个功能的好教程。
  2. 为什么我需要在代码 1 的支持实现中使用 SDK 版本检查?为什么支持实现不能正确处理它?
  3. 真的需要触发 TYPE_VIEW_SELECTED 和 TYPE_VIEW_TEXT_CHANGED 吗?或者可能应该实现一些其他代码?
  4. 主要问题。 在代码 2 中有注释代码行。此代码语句子字符串文本小于 MAX_TEXT_LENGTH(它是 3800),因为如果文本更大,则不会播放任何内容。没有。是可访问性限制吗?小于此值的任何其他文本都可以正常播放。
  5. 有谁知道我在哪里可以找到任何好的教程? (是的,我看到了样本)。
  6. 有没有人需要查看任何自定义实现?

更新

嗯。以下是一些答案:

  1. 如我所见,如果您不希望在收到此文本后立即阅读,则不需要 TYPE_VIEW_SELECTED 和 TYPE_VIEW_TEXT_CHANGED 事件。
  2. 在 Nexus 7 上,所有大文本都可以正常播放(文本最多 8000 个符号),因此此问题不会在其上重现,但在三星 Galaxy Tab 10.1 (Android 4.0.4) 和带有 Android 的 Tab 10.1 的 Genymotion 模拟器上4.3 可以。这很奇怪……

【问题讨论】:

  • 在美国国家盲人图书馆服务项目中,图书阅读器下载了音频格式的图书。每本书都由专业读者阅读。其他辅助功能确实有效,但支持因平台和 Android 版本而异。

标签: android accessibility android-a11y


【解决方案1】:

4..根据String.substring()的文档 您传递的第一个参数是原始字符串中的开始索引,第二个参数是原始字符串中的结束索引

例子:

String text = "Hello";
partOfText = text.substring(2,text.length() - 1);

partOfText 等于“llo”(第一个字符是索引 0)

因此,通过将常量 MAX_TEXT_LENGTH 作为第一个参数,它将从索引 3800 开始取出子字符串。

http://developer.android.com/reference/java/lang/String.html#substring(int)

【讨论】:

  • 您好,谢谢,但是如果您查看developer.android.com/reference/java/lang/…, int),您会发现 end simbol 是独占的,我的实现是正确的。此外,这不是我的问题。我的问题是为什么辅助功能对 Android Galaxy Tab 10.1 有这个限制?
  • 对不起,我误解了你的问题
【解决方案2】:

你是对的 MAX_TEXT_LENGTH 是 3800。

关于你的疑问,

这段代码:

 event.getText().add(trimText.substring(MAX_TEXT_LENGTH, trimText.length()));
        }

您正在尝试将“trimText”从 MAX_TEXT_LENGTH 子串到 trimText.length() ! 假设 trimText = "STACK", trimText.length() = 5, 那么 trimText.substring(3800,5) 会是 ?

起初,这没有意义,正确使用会是这样的: trimText.substring(0,2) = "ST";

【讨论】:

  • 是的,我知道如果文本小于 MAX_TEXT_LENGTH,这条线会落下。但就我而言,事实并非如此。所以我删除了这个对stackoverflow代码的检查。此外,在我的代码中,这一行被注释了。如果我取消注释这条线,那么什么都不会播放。这是一个问题——为什么? :) 这个问题很老了。我已经完成了这个项目。
猜你喜欢
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-30
  • 1970-01-01
相关资源
最近更新 更多