Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/230.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java dispatchPopulateAccessibilityEvent未触发_Java_Android_Android Activity_View_Accessibility - Fatal编程技术网

Java dispatchPopulateAccessibilityEvent未触发

Java dispatchPopulateAccessibilityEvent未触发,java,android,android-activity,view,accessibility,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.a

我正在尝试在我的应用程序中实现可访问性功能。我对它的实际工作原理感到困惑。我在不同的包中有一个简单的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);
我实现了如下可访问性类:

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)中,它调用这个方法而不发送任何事件

我知道我在做一些傻事,但却找不到确切的位置


注意:我确实在v.sendAccessibilityEvent上设置了一个断点-它转到View.java,但在“AccessibilityManager.getInstance(mContext)!=null”条件下失败了。

未调用它的原因是系统调用ImageView的dispatchPopulateAccessibilityEvent(因为您从那里发送事件),不是您的可访问性对象之一

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

  • 实现扩展ImageView的自定义视图(并重写dispatchPopulateAccessibilityEvent方法和其他可访问性)。这是一种更通用的方法,允许开发人员模拟系统小部件的可访问性行为

    下面是一个示例类,它将自定义文本添加到单击的
    TYPE\u VIEW\u
    event上的事件对象。您需要将其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");
            }
        }
    }
    
  • 实施。这并不像第一种方法那样通用,但对于简单的应用程序,它更容易,并且允许更复杂的可访问性行为

    这里有一个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");
            }
        }
    });
    
  • 如果需要非常复杂的可访问性逻辑,请将这两种方法结合使用


  • 视图中有许多可访问性方法,请仔细阅读文档,哪些方法是您真正需要覆盖的。

    谢谢,但是类活动的dispatchPopulateAccessibility方法和类视图的dispatchPopulateAccessibility方法之间有什么区别?基本上它们都有相同的用途。该方法在将AccessibilityEvents(各种类型的,不仅仅是单击事件)传递到系统之前处理它们(可能首先是事件源子事件)。差异将是事件的根源。谢谢。我在执行第一步时仍然遇到问题。如果可能的话,你能在我的代码中展示一下我该怎么做吗?很抱歉,过去三天我一直被困在这里。非常感谢。我使用了第二种方法,它确实触发了事件。。现在我在ImageView的onClick(视图)方法下使用这个。但是,如果我将其设置在图像之外,则它不会捕获任何事件(例如,TYPE_VIEW_FOCUSED)。另外,我是否需要在任何地方使用sendAccessibilityEvent()方法?再次感谢。如果sendAccessibilityEvent通常不是由用户操作触发的,则需要sendAccessibilityEvent(例如,单击视图对象通常会触发类型\视图\单击事件,但如果您有一个带有绘制对象的SurfaceView,则通常不会触发任何事件)。至于“我把它设置在图像之外”,我不确定我是否理解——你能再详细一点吗?