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:
- Stimmt meine Zugänglichkeit Umsetzung? Kann es sein, dass Design falsch ist? Weil ich zu diesem Feature kein gutes Tutorial gefunden habe.
- Warum muss ich SDK-Versionsüberprüfungen in Support-Implementierungen in Code 1 verwenden? Warum unterstützt die Implementierung die Implementierung nicht richtig?
- Wird Feuern TYPE_VIEW_SELECTED und TYPE_VIEW_TEXT_CHANGED wirklich benötigt? Oder könnte ein anderer Code implementiert werden?
- 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.
- Weiß jemand, wo ich ein gutes Tutorial finden kann? (Ja, ich habe Proben gesehen).
- Hat jemand irgendwelche benutzerdefinierten Erkenntnisse zu sehen? Nun
AKTUALISIERT. Hier einige Antworten:
- 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.
- 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 ...
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