2013-07-25 15 views
5

Tôi đã bật khả năng truy cập và thiết bị của tôi nói khi tôi điều hướng xung quanh.Khả năng truy cập trên chế độ xem tùy chỉnh không có phản hồi bằng lời nói

Tôi có một tùy chỉnh seekbar và đã triển khai folllowing:

onTouchEvent trích đoạn:

... 
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 phương pháp:

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

tôi có thể thấy onPopulateAccessibilityEvent được gọi trong LogCat thành công, nhưng thiết bị không đưa ra bất kỳ phản hồi nào. Tôi mong đợi số điểm hiện tại được đọc lại, nhưng không có gì.

Có ai có thông tin chi tiết nào không?

+0

Bạn đang nhắm mục tiêu phiên bản Android nào? Có nhiều cách khác nhau để hoàn thành việc này cho Gingerbread so với ICS hoặc JellyBean. – alanv

+0

Phiên bản Android ICS + – HGPB

Trả lời

17

Nếu bạn đang mở rộng ProgressBar, bạn có thể đặt văn bản cho các sự kiện đi TYPE_VIEW_SELECTED. Chúng được gửi tự động khi người dùng điều chỉnh thanh tìm kiếm.

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

Tuy nhiên, có vẻ như bạn có thể đã mở rộng View. Trong trường hợp này, bạn sẽ cần sử dụng giải pháp thay thế nhẹ và kích hoạt thông báo bằng cách gửi sự kiện VIEW_FOCUSED trên ICS hoặc sử dụng API announceForAccessibility trên Jellybean và cao hơn. Yêu cầu thư viện hỗ trợ-v4 và trông giống như sau:

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

Cảm ơn bạn, bạn là một huyền thoại! – HGPB

+3

Ồ, điều này thật tuyệt! Thật khó tìm tài liệu trợ năng tốt. –

+0

Anh hùng. Tuy nhiên, vô lý rằng khả năng truy cập hoạt động khi sử dụng một bánh mì nướng nhưng không phải với một Snackbar – tim

Các vấn đề liên quan