2014-02-27 64 views
3

我使用的Viewpager由一些相对复杂的相对布局兄弟组成。Android AccessibilityDelegate阅读ViewGroup而不是儿童

如果我点击相对布局,它会突出显示整个页面,并按照预期逐个读取标题和几个文字浏览。

如果我滚动viewpager,我希望talkback以同样的方式阅读下一页,如果我点击,它会读取第一页。其次,如果我滚动到第二,第三等页面并单击这些布局,反馈将按预期阅读。

我正试图实现滚动事件完成后的点击行为。

下面是我对accessibilityDelegate的看法。

viewPager.setAccessibilityDelegate(new AccessibilityDelegate() { 
     @Override 
     public boolean onRequestSendAccessibilityEvent(ViewGroup host, View child, AccessibilityEvent event) { 
      if (event.getEventType() == AccessibilityEvent.TYPE_VIEW_SCROLLED) { 
       View page = viewPager.getCurrentPageView(); 
       performAccessibilityAction(page, AccessibilityNodeInfo.ACTION_CLICK, Bundle.EMPTY); 
      } 
      return super.onRequestSendAccessibilityEvent(host, child, event); 
     } 
    }); 

我已验证'page'是RelativeLayout父母,我认为它是。 我也确认onRequestSendAccessibilityEvent被解雇,但它没有读取其子女的内容。我错过了什么吗?

更新

我使用

viewpager.getCurrentPageView().sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED); 

,当我需要强制对讲重读一个项目上面工作了另一个例子也试过,但没有任何影响,如果我尝试它在页面上。

感谢

回答

2

一些背景 - 当您在相对布局挖掘,话语提示生成基于布局的内容发言。在ICS上,这由HOVER_ENTER事件触发。在Jelly Bean上,它由ACCESSIBILITY_FOCUS事件触发。这些事件由框架自动发送,一般来说,不应该从应用程序手动发送。对于FOCUS事件也是如此,除了自定义视图的特殊情况(有关更多详细信息,请参阅Accessibility talk from Google I/O 2013)。

所以,回到主题。

您可以通过使用要读取的文本填充传出事件来控制SCROLLED事件的语音。不利的一面是,您需要手动生成要阅读的文本,并且很可能该文本与用户触摸布局时TalkBack会读取的内容有所不同。

viewPager.setAccessibilityDelegate(new AccessibilityDelegate() { 
    @Override 
    public void onPopulateAccessibilityEvent(View host, AccessibilityEvent event) { 
     super.onPopulateAccessibilityEvent(host, event); 

     if (event.getEventType() == AccessibilityEvent.TYPE_VIEW_SCROLLED) { 
      event.setContentDescription(/** your text */); 
     } 
    } 
}); 

另一种选择是什么都不做,让用户自己探索视图。这是Android可访问性的首选交互模式。

编辑:视频网址已损坏,已更改。

+0

这是否意味着我需要手动递归通过所有子节点并获取内容描述? –

+0

我使用onInitializeAccessibilityNodeInfo,onInitializeAccessibilityEvent,onPopulateAccessibilityEvent和onRequestSendAccessibilityEvent设置了可访问性委托。唯一被触发的是onRequestSendAccessibilityEvent。如果我在第一次读取的事件上设置了内容描述,但它看起来像事件被重用,并且它不读取第二,第三和第二次事件中设置的contentDescription。 –

0

报道对谷歌这个问题检查

其中滚动时ViewPager不设置AccessibilityEvent参数正确 。

但是(2016年3月)的Android Support Library, revision 23.2.1 releas 此问题已得到解决之后。

更新支持库,以Android Support Library to 23.2.1

0

我以前有同样的问题。现在我将android:focusable="true"添加到ViewGroup中,TalkBalk将读取ViewGroup而不是其子节点