2013-07-25 3 views
5

Ich habe Zugriff auf aktiviert, und mein Gerät spricht, während ich navigieren.Die Implementierung von Zugriff auf die benutzerdefinierte Ansicht gibt keine verbale Rückmeldung.

Ich habe eine benutzerdefinierte seekbar und haben die folllowing umgesetzt:

onTouchEvent Auszug:

... 
case MotionEvent.ACTION_MOVE: 

    getParent().requestDisallowInterceptTouchEvent(true); 

    setTouchAngle(pointToAngle(touchX, touchY)); 
    score = getScoreFromAngle(angleStart,touchAngle); 
    if (onScoreSetListener != null) { 
     onScoreSetListener.onScorePoll(this, score); 
     sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED); 
    } 
    break; 
... 

onPopulateAccessibilityEvent Methode:

@Override 
    public void onPopulateAccessibilityEvent(AccessibilityEvent event) { 
     super.onPopulateAccessibilityEvent(event); 

     LogUtils.i(TAG,"onPopulateAccessibilityEvent()",null); 

     switch (event.getEventType()) { 
      case AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED: 

       LogUtils.d(TAG,"dispatchPopulateAccessibilityEvent() TYPE_VIEW_TEXT_CHANGED",null); 

       event.getText().add(String.valueOf(getScore())); 
       break; 
      } 
    } 

Ich kann onPopulateAccessibilityEvent wird in LogCat erfolgreich aufgerufen, aber Das Gerät gibt keine Rückmeldung. Ich erwarte, dass die aktuelle Punktzahl zurückgelesen wird, aber nichts.

Hat jemand einen Einblick?

+0

Auf welche Android-Version zielen Sie? Es gibt verschiedene Möglichkeiten, dies für Lebkuchen gegen ICS oder JellyBean zu erreichen. – alanv

+0

Android Version ICS + – HGPB

Antwort

17

Wenn Sie ProgressBar erweitern, können Sie den Text für ausgehende Ereignisse TYPE_VIEW_SELECTED festlegen. Diese werden automatisch gesendet, wenn der Benutzer die Suchleiste einstellt.

@Override 
public void onInitializeAccessibilityEvent(AccessibilityEvent event) { 
    super.onInitializeAccessibilityEvent(event); 
    event.getText().add(...); 
} 

aber es sieht aus wie Sie View erweitert haben. In diesem Fall müssen Sie eine kleine Problemumgehung verwenden und eine Ankündigung auslösen, indem Sie ein Ereignis VIEW_FOCUSED auf ICS senden oder die API announceForAccessibility auf JellyBean und höher verwenden. Welches würde die Unterstützung-v4-Bibliothek erfordern und würde so aussehen:

/** The parent context. Used to obtain string resources. */ 
private final Context mContext; 

/** 
* The accessibility manager for this context. This is used to check the 
* accessibility enabled state, as well as to send raw accessibility events. 
*/ 
private final AccessibilityManager mA11yManager; 

/** 
* Generates and dispatches an SDK-specific spoken announcement. 
* <p> 
* For backwards compatibility, we're constructing an event from scratch 
* using the appropriate event type. If your application only targets SDK 
* 16+, you can just call View.announceForAccessibility(CharSequence). 
* </p> 
* 
* @param text The text to announce. 
*/ 
private void announceForAccessibilityCompat(CharSequence text) { 
    if (!mA11yManager.isEnabled()) { 
     return; 
    } 

    // Prior to SDK 16, announcements could only be made through FOCUSED 
    // events. Jelly Bean (SDK 16) added support for speaking text verbatim 
    // using the ANNOUNCEMENT event type. 
    final int eventType; 
    if (Build.VERSION.SDK_INT < 16) { 
     eventType = AccessibilityEvent.TYPE_VIEW_FOCUSED; 
    } else { 
     eventType = AccessibilityEventCompat.TYPE_ANNOUNCEMENT; 
    } 

    // Construct an accessibility event with the minimum recommended 
    // attributes. An event without a class name or package may be dropped. 
    final AccessibilityEvent event = AccessibilityEvent.obtain(eventType); 
    event.getText().add(text); 
    event.setEnabled(isEnabled()); 
    event.setClassName(getClass().getName()); 
    event.setPackageName(mContext.getPackageName()); 

    // JellyBean MR1 requires a source view to set the window ID. 
    final AccessibilityRecordCompat record = new AccessibilityRecordCompat(event); 
    record.setSource(this); 

    // Sends the event directly through the accessibility manager. If your 
    // application only targets SDK 14+, you should just call 
    // getParent().requestSendAccessibilityEvent(this, event); 
    mA11yManager.sendAccessibilityEvent(event); 
} 
+1

Vielen Dank, du bist eine Legende! – HGPB

+3

Wow, das ist großartig! Es ist wirklich schwierig, gute Zugänglichkeitsdokumente zu finden. –

+0

Held. Lächerlich, aber Accessibility funktioniert, wenn Sie einen Toast verwenden, aber nicht mit einer Snackbar – tim

Verwandte Themen