2013-12-09 7 views
27

Ich entwickle Anwendung, die Bücher ansieht. Es gibt einen Bildschirm (Aktivität), der ein Buch zeigt. Es hat eine benutzerdefinierte Ansicht, ähnlich wie ViewSwitcher und jede Seite ist eine Bitmap, die von einer benutzerdefinierten Ansicht gerendert wird.Accessibility Funktion Implementierung Probleme in Android

Jetzt sollte ich Barrierefreiheitsfunktion implementieren - Buch sollte vom Telefon (Audio) gelesen werden.

Ich habe Accessibility Abschnitt hier https://developer.android.com/guide/topics/ui/accessibility/index.html gelesen, aber es ist nicht klar genug.

Ich benutze SupportLibrary für Barrierefreiheit Management und jetzt habe ich diesen Code in ViewGroup (die Buchseiten verwaltet). Code 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; 
    } 

Hier ist Code aus Seitenansicht Code 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()); 
    } 

Da Seite Textdaten laden asynchron erstes Mal Zugänglichkeit hat keinen Text während ausführen onInitializeAccessibilityEvent Code. Und dann, wenn Daten geladen wurden, feuere ich AccessibilityEvent.TYPE_VIEW_SELECTED und AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED Ereignisse. Dann wird onInitializeAccessibilityEvent erneut ausgeführt und ruft Buchtext "lesen" an.

Also meine Fragen:

  1. Stimmt meine Zugänglichkeit Umsetzung? Kann es sein, dass Design falsch ist? Weil ich zu diesem Feature kein gutes Tutorial gefunden habe.
  2. Warum muss ich SDK-Versionsüberprüfungen in Support-Implementierungen in Code 1 verwenden? Warum unterstützt die Implementierung die Implementierung nicht richtig?
  3. Wird Feuern TYPE_VIEW_SELECTED und TYPE_VIEW_TEXT_CHANGED wirklich benötigt? Oder könnte ein anderer Code implementiert werden?
  4. Die Hauptfrage. In Code 2 gibt es eine kommentierte Codezeile. Dieser Code-Statement-Teilstring-Text muss kleiner als MAX_TEXT_LENGTH sein (es ist 3800), denn wenn Text größer ist, wird nichts abgespielt. Nichts. Ist es Zugänglichkeitsbeschränkung? Jeder andere Text, der kleiner als dieser Wert ist, wird gut wiedergegeben.
  5. Weiß jemand, wo ich ein gutes Tutorial finden kann? (Ja, ich habe Proben gesehen).
  6. Hat jemand irgendwelche benutzerdefinierten Erkenntnisse zu sehen? Nun

AKTUALISIERT. Hier einige Antworten:

  1. Wie kann ich sehen TYPE_VIEW_SELECTED und TYPE_VIEW_TEXT_CHANGED Ereignisse, die nicht erforderlich sind, wenn Sie diesen Text nicht wollen gelesen werden, sobald Sie es.
  2. Auf Nexus 7 wird alle großen Text gut wiedergegeben (Text bis zu 8000 Symbole), so dass dieses Problem nicht auf, sondern auf Samsung Galaxy Tab 10.1 (Android 4.0.4) und Genymotion Emulator von Tab 10.1 mit Android reproduzieren 4,3 tut. Und das ist seltsam ...
+0

Im Projekt für die Nationalbibliothek der USA für blinde Menschen, der Buchleser heruntergeladen Bücher im Audioformat. Jedes Buch wurde von professionellen Lesern gelesen. Andere Eingabehilfen funktionierten, aber die Unterstützung variierte je nach Plattform und Android-Version. – maxweber

Antwort

1

4 ..Gemäß der Dokumentation von String.substring() Das erste Argument, das Sie übergeben, ist der Startindex in der ursprünglichen Zeichenfolge, das zweite Argument ist der Endindex in der ursprünglichen Zeichenfolge.

Beispiel:

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

partOfText gleich zu "llo" (das erste Zeichen ist Index 0)

So durch Ihre ständigen MAX_TEXT_LENGTH als erstes Argument setzen, wäre es am Index 3800 beginnen zu nehmen die Teilzeichenfolge aus.

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

+0

Hallo, danke, aber wenn du durch https://developer.android.com/reference/java/lang/String.html#substring (int, int) schaust, wirst du sehen, dass end-simbol exklusiv ist und meine Implementierung stimmt. Außerdem ist das nicht meine Frage. Meine Frage ist, warum Accessibility diese Beschränkung auf Android Galaxy Tab 10.1 hat? – mig35

+0

Und Ihr Beispiel returens "ll" von "Hallo" String ... – mig35

+0

Entschuldigung in diesem Fall habe ich Ihre Frage missverstanden – Tweet

0

Sie rechts MAX_TEXT_LENGTH sind, ist 3800.

Über Ihre Zweifel,

dieser Code:

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

Sie versuchen, "trimText" String von MAX_TEXT_LENGTH zu trimText .Länge()! Angenommen, trimText = "STACK", trimText.length() = 5, dann wird trimTextstring (3800,5) sein?

Zuerst hat dies keinen Sinn, die korrekte Verwendung wäre wie folgt: trimTextstring (0,2) = "ST";

+0

Ja, ich weiß, dass diese Zeile fällt, wenn der Text weniger als MAX_TEXT_LENGTH ist. Aber in meinem Fall ist es nicht. Also entferne ich diese Überprüfung für Stackoverflow-Code. Außerdem ist diese Zeile in meinem Code kommentiert. Und wenn ich diese Zeile auskommentiere, wird nichts spielen. Und das ist die Frage - warum? :) Diese Frage ist ziemlich alt .. Ich habe dieses Projekt bereits beendet. – mig35