2015-06-18 98 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