dispatchPopulateAccessibilityEvent未触发

我正在尝试在我的应用中实现辅助function。 我对它的实际运作方式感到困惑。 我在不同的包中有一个简单的imageView,我将事件发送到:

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); 

我已按照以下方式实施Accessibility类:

 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类(即扩展Activity)中,它调用此方法甚至不发送任何事件。

我知道我在做一些愚蠢的事,但却找不到确切的地方。

PS:我确实在v.sendAccessibilityEvent上设置了一个断点 – 它转到View.java并且在条件“AccessibilityManager.getInstance(mContext)!= null”时以某种方式失败

它未被调用的原因是系统调用ImageView的dispatchPopulateAccessibilityEvent(因为您从那里发送事件),而不是您的Accessibility对象之一。

要实现自定义辅助function行为,您有3个选项:

  1. 实现扩展ImageView的自定义View(并覆盖dispatchPopulateAccessibilityEvent方法和其他可访问性)。 这是一种更通用的方法,可让开发人员模仿系统小部件的可访问性行为。

    这是一个示例类,它将自定义文本添加到TYPE_VIEW_CLICKED事件的事件对象上。 您需要将其clickable属性设置为true,以便它可以接收单击的事件。 我重写了onPopulateAccessibilityEvent而不是dispatchPopulateAccessibilityEvent因为这个类没有子onPopulateAccessibilityEvent ,也没有必要覆盖调度算法。

     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 。 这不像第一种方法那样通用,但对于简单的应用程序来说,它更容易,并允许更复杂的可访问性行为。

    这是一个与CustomImageView类似的AccessibilityDelegate。 主要优点是您可以为不同的对象和类重用相同的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中有许多可访问性方法,仔细阅读文档,您需要覆盖哪些方法。