2015-06-18 99 views
1

我試圖在我的應用中實現輔助功能。我很困惑它如何實際工作。我從哪裏發送事件在不同包裝簡單的ImageView:dispatchPopulateAccessibilityEvent未觸發

public final void onClick(final android.view.View v) { 
      android.util.Log.v(CLASSNAME,"onClick tag:"+v.getTag()); 
      v.sendAccessibilityEvent(android.view.accessibility.AccessibilityEvent.TYPE_VIEW_CLICKED); 

我implmented輔助類,如下所示:

import android.content.Context; 

public final class Accessibility extends android.view.View { 
    public Accessibility(Context context) { 
     super(context); 
     // TODO Auto-generated constructor stub 
    } 



    public static android.view.accessibility.AccessibilityManager manager = (android.view.accessibility.AccessibilityManager)getSystemService(android.content.Context.ACCESSIBILITY_SERVICE); 
    public static android.view.accessibility.AccessibilityEvent event = android.view.accessibility.AccessibilityEvent.obtain(); 

    public static Accessibility accessibility; 


    public static boolean isEenabled() 
    { 

    if(manager.isEnabled()) 
     return true; 
    else 
     return false; 
    } 


    @Override 
    public boolean dispatchPopulateAccessibilityEvent(android.view.accessibility.AccessibilityEvent event) 
    { 
     super.dispatchPopulateAccessibilityEvent(event); 
     android.util.Log.e(CLASSNAME, "Came here"); 
         { 

      event.getText().add("Click here!!"); 
      event.setEnabled(true); 
          return true; 
     } 

我讀的開發者文檔,我不得不重寫方法在View類中(這就是我將我的類擴展到View的原因)。我意識到這種方法也存在於Activity類中(即extends Activity),它甚至不發送任何事件就調用這個方法。

我知道我在做一些愚蠢的事情,但無法找到確切的地方。

PS:我沒上設置斷點,v.sendAccessibilityEvent - 它道出View.java和不知何故,在條件「AccessibilityManager.getInstance(mContext)!= NULL」

回答

2

那就不叫的原因是出現故障因爲系統會調用ImageView的dispatchPopulateAccessibilityEvent(因爲您從那裏發送事件),而不是您的Accessibility對象之一。

要實現自定義的可訪問性的行爲,你有3種選擇:

  1. 實現一個可擴展的ImageView自定義視圖(和覆蓋dispatchPopulateAccessibilityEvent方法和其他輔助)。這是一種更通用的方法,可以讓開發人員模仿系統小部件的可訪問性行爲。

    下面是一個示例類,它向TYPE_VIEW_CLICKED事件上的事件對象添加自定義文本。您需要將其可點擊屬性設置爲true,以便它可以接收點擊事件。我已經覆蓋了onPopulateAccessibilityEvent而不是dispatchPopulateAccessibilityEvent,因爲此類沒有子代,因此不需要重寫調度算法。

    public class CustomImageView extends ImageView { 
    
        private static final String TAG = CustomImageView.class.getSimpleName(); 
    
        /* Here are constructors from ImageView */ 
    
        @Override 
        public void onPopulateAccessibilityEvent(AccessibilityEvent event) { 
         super.onPopulateAccessibilityEvent(event); 
    
         if (event.getEventType() == AccessibilityEvent.TYPE_VIEW_CLICKED) { 
          Log.v(TAG, "Populating accessibility event"); 
          event.getText().add("Custom text from onPopulateAccessibilityEvent"); 
         } 
        } 
    } 
    
  2. 實現AccessibilityDelegate。這不像第一種方法那樣通用,但對於簡單的應用程序來說,它更簡單並允許更復雜的可訪問性行爲。

    下面是一個AccessibilityDelegate,它和CustomImageView類似。主要優點是可以爲不同的對象和類重用相同的AccessibilityDelegate。

    imageView.setAccessibilityDelegate(new View.AccessibilityDelegate() { 
        @Override 
        public void onPopulateAccessibilityEvent(View host, AccessibilityEvent event) { 
         super.onPopulateAccessibilityEvent(host, event); 
    
         if (event.getEventType() == AccessibilityEvent.TYPE_VIEW_CLICKED) { 
          Log.v(TAG, "Populating accessibility event"); 
          event.getText().add("Custom text from AccessibilityDelegate"); 
         } 
        } 
    }); 
    
  3. 如果您需要非常複雜的輔助功能邏輯,請合併這兩種方法。

View中有許多可訪問性方法,請仔細閱讀文檔中哪些是您真正需要覆蓋的文檔。

+0

謝謝,但類Activity和類View的dispatchPopulateAccessibility方法有什麼區別? – Papps

+0

基本上他們服務於相同的目的。該方法在傳遞給系統之前處理AccessibilityEvents(各種類型的,不僅是單擊事件),也可以先處理事件源子項。差異將是事件的來源。 –

+0

謝謝。我在實施第一步時仍遇到問題。如果可能的話,我是否可以在代碼本身中展示如何去做?我很抱歉,但過去三天我被困在這裏。 – Papps