Android中的辅助function实现问题

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

现在我应该实现无障碍function – 书应该通过电话(audio)阅读。

我已经在这里阅读了可访问性部分https://developer.android.com/guide/topics/ui/accessibility/index.html,但是还不够清楚。

我使用SupportLibrary进行无障碍pipe理,现在我在ViewGroup(pipe理书籍页面)中有这个代码。 代码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()); } 

因为页面文本数据加载asynchronous第一次可访问性没有任何文本,而执行onInitializeAccessibilityEvent代码。 然后当数据被加载时,我会触发AccessibilityEvent.TYPE_VIEW_SELECTED和AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED事件。 然后onInitializeAccessibilityEvent再次执行并手机“读取”书本文本。

所以我的问题:

  1. 我的辅助function是否正确? 可能是devise错了? 因为我没有find关于这个function的好教程。
  2. 为什么我需要在代码1的支持实现中使用SDK版本检查? 为什么支持实现不能正确处理?
  3. 是射击TYPE_VIEW_SELECTED和TYPE_VIEW_TEXT_CHANGED真的需要? 或者可能是一些其他的代码应该执行?
  4. 主要问题。 在代码2中有注释代码行。 此代码语句子string文本小于MAX_TEXT_LENGTH(它是3800),因为如果文本更大没有播放。 没有。 它是无障碍的限制? 其他任何小于这个值的文本都可以正常播放。
  5. 有谁知道我在哪里可以find任何好的教程? (是的,我看到样品)。
  6. 有没有人有任何自定义实现通过?

更新

好。 这里有一些答案:

  1. 正如我所看到的TYPE_VIEW_SELECTED和TYPE_VIEW_TEXT_CHANGED事件是不需要的,如果你不希望这个文本被读取,只要你得到它。
  2. 在Nexus 7上,所有大文本的播放效果都很好(文本最多可以达到8000个符号),所以这个问题不会在这个问题上重现,但是Android 4.3的Tab 10.1中的三星Galaxy Tab 10.1(Android 4.0.4)和Genymotion模拟器确实如此。 这很奇怪

Solutions Collecting From Web of "Android中的辅助function实现问题"

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

例:

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

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

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

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

你说得对,MAX_TEXT_LENGTH是3800。

关于你的疑问,

这个代码:

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

你正试图从MAX_TEXT_LENGTH到trimText.length()子string“trimText”! 假设trimText =“STACK”,trimText.length()= 5,那么trimText.substring(3800,5)会是?

起初,这没有意义,正确使用会是这样的:tr​​imText.substring(0,2)=“ST”;