dispatchPopulateAccessibilityEvent未触发

时间:2015-06-18 00:15:37

标签: java android android-activity view accessibility

我试图在我的应用中实现辅助功能。我对它的实际运作方式感到困惑。我在不同的包中提供了一个简单的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),它调用此方法甚至不发送任何事件。

我知道我做了些傻事,但却找不到确切的地方。

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

1 个答案:

答案 0 :(得分:3)

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

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

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

    这是一个示例类,它将自定义文本添加到TYPE_VIEW_CLICKED事件上的事件对象。您需要将其clickable属性设置为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。这不像第一种方法那样通用,但对于简单的应用程序来说,它更容易,并允许更复杂的可访问性行为。

    这是一个与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. 如果您需要非常复杂的辅助功能逻辑,请将两种方法结合使用。

  4. View中有许多辅助功能方法,仔细阅读文档,您需要覆盖哪些方法。