2013-07-25 7 views
5

Mam włączony dostęp, a moje urządzenie mówi podczas nawigacji.Wdrażanie dostępu w widoku niestandardowym nie daje żadnych ustnych informacji zwrotnych.

Mam zwyczaj seekbar oraz wypełniły folllowing:

onTouchEvent fragment:

... 
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 metoda:

@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; 
      } 
    } 

widzę onPopulateAccessibilityEvent miano w LogCat pomyślnie, ale urządzenie nie udziela żadnych informacji zwrotnych. Oczekuję, że obecny wynik zostanie odczytany, ale nic.

Czy ktoś ma wgląd?

+0

Jaką wersją systemu Android kierujesz? Istnieją różne sposoby osiągnięcia tego w przypadku Gingerbread versus ICS lub JellyBean. – alanv

+0

Wersja Androida ICS + – HGPB

Odpowiedz

17

Jeśli rozszerzasz ProgressBar, możesz ustawić tekst dla zdarzeń wychodzących TYPE_VIEW_SELECTED. Są one wysyłane automatycznie, gdy użytkownik dostosowuje pasek wyszukiwania.

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

Wygląda jednak na to, że użytkownik mógł przedłużyć termin View. W takim przypadku będziesz musiał zastosować niewielkie obejście i wyzwolić ogłoszenie, wysyłając zdarzenie VIEW_FOCUSED na ICS lub użyć interfejsu API announceForAccessibility na JellyBean i wyżej. Który wymagałby biblioteki support-v4 i wyglądałby następująco:

/** 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

Dziękuję, jesteś legendą! – HGPB

+3

Wow, to jest świetne! Naprawdę trudno jest znaleźć dobrą dokumentację dotyczącą dostępności. –

+0

Bohater. Śmieszne jednak, że Accessibility działa, gdy używa się Toast, ale nie z Snackbar – tim

Powiązane problemy