2013-12-09 28 views
27

我正在開發查看書籍的應用程序。有一個畫面(活動),顯示一本書。它具有自定義視圖,類似於ViewSwitcher,每個頁面都是由自定義View呈現的位圖。Android中的輔助功能實現問題

現在我應該實現無障礙功能 - 書應該通過電話(音頻)閱讀。

我讀過這裏的輔助功能部分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個符號),所以此問題不會在其上重現,但在Samsung Galaxy Tab 10.1(Android 4.0.4)和Android版的Genymotion模擬器中,使用Android 4.3呢。這是奇怪的...
+0

在美國國家盲人圖書館服務項目中,圖書閱讀器以音頻格式下載圖書。每本書都由專業讀者閱讀。其他輔助功能確實有效,但支持因平臺和Android版本而異。 – maxweber

回答

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)

+0

嗨,謝謝,但如果你通過https://developer.android.com/reference/java/lang/String.html#substring(int,int)看看,你會看到結束simbol是獨佔的,我的實現是正確的。而且這不是我的問題。我的問題是爲什麼輔助功能對Android Galaxy Tab 10.1有這個限制? – mig35

+0

而你的例子returens從「你好」字符串「ll」... – mig35

+0

對不起,在這種情況下,我誤解了你的問題 – Tweet

0

你說得對MAX_TEXT_LENGTH個字符是3800

關於您的疑問,

驗證碼:

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

你正試圖從MAX_TEXT_LENGTH個字符串 「trimText」 到trimText 。長度() ! 假設trimText =「STACK」,trimText.length()= 5,那麼trimText.substring(3800,5)會是?

起初,這沒有意義,正確使用會是這樣的: trimText.substring(0,2)=「ST」;

+0

是的,我知道如果文本小於MAX_TEXT_LENGTH,這條線會下降。但在我看來並非如此。所以我刪除了這個檢查stackoverflow代碼。此外,在我的代碼中這條線被評論。如果我取消註釋這條線,那麼什麼都不會發揮。這是個問題 - 爲什麼? :)這個問題很老了..我已經完成了這個項目。 – mig35