2014-01-30 29 views
0

我正在开发一个适用于visual disabilities的应用程序。如果设备的Android API大于14,我想稍微增强TalkbackAndroid:使用带有TalkBack的选取框(辅助功能)

我有一个ListView填充整个屏幕,每行只有一个TextView。由于文字可能相当长,因此我想在用户点击文字时使用marquee和单行滚动文字。

我测试了它没有Talkback和它的作品:

Marquee works

所以我决定用对讲积极测试它。在这种情况下,我有两种问题:

1-有些行根本不滚动。

2-一些行滚动,但我看不出比显示文本时不滚动的一个更多的文字:

Marquee doesn't work

我不知道为什么有些行滚动有些则没有,我使用相同的代码。

要更改背景颜色并开始选取框,我要为每行添加一个AccessibilityDelegate

这是每一行的布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" > 

    <TextView 
     android:id="@+id/rowTextView" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center_vertical" 
     android:layout_marginLeft="10dp" 
     android:layout_marginRight="10dp" 
     android:ellipsize="marquee" 
     android:marqueeRepeatLimit="marquee_forever" 
     android:singleLine="true" 
     android:textSize="18dp" /> 

</LinearLayout> 

这是我的一些适配器的代码:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

    if(convertView == null){ // If the View is not cached 
     // Inflates the Common View from XML file 
     convertView = this.inflater.inflate(R.layout.list_simple_row, parent, false); 
    } 

    TextView tv = (TextView) convertView.findViewById(R.id.rowTextView); 
    tv.setText(list.get(position)); 
    convertView.setContentDescription(list.get(position)); 

    addAccessibilityDelegate(tv, position); // Add delegate to the TextView to detect touches 

    tv.setSingleLine(true); 

    if(position == selected){ 

     // The user touched this row: Change background color to green. 

     convertView.setBackgroundColor(Color.GREEN); 
     tv.setTextColor(Color.BLACK); 
     tv.setSelected(true); 

    } 
    else{ 

     convertView.setBackgroundColor(Color.TRANSPARENT); 
     tv.setTextColor(Color.WHITE); 
     tv.setSelected(false); 

    } 

    return convertView; 
} 

protected void addAccessibilityDelegate(View v, final int position){ 

    v.setAccessibilityDelegate(new AccessibilityDelegate(){ 
     @Override 
     public void onInitializeAccessibilityEvent(View host, AccessibilityEvent event) { 
      super.onInitializeAccessibilityEvent(host, event); 
     } 

     @Override 
     public void onInitializeAccessibilityNodeInfo(View host, 
       AccessibilityNodeInfo info) { 
      super.onInitializeAccessibilityNodeInfo(host, info); 
     } 

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

      if(event.getEventType() == AccessibilityEvent.TYPE_VIEW_HOVER_ENTER){ 
       focusBackground(position); 
      } 
     } 
    });  
} 

public void focusBackground(int position){ 

    if(selected != position){ 
     selected = position; 
     notifyDataSetInvalidated(); 
    } 
} 

任何人都知道,如果我可以使用选取框用对讲?

谢谢!

+0

你想用AccessibilityDelegate完成什么?一般来说,您的应用程序不应该存在特殊情况的悬停事件,因为这会打破与Android中其他位置一致的交互模式。 – alanv

+0

AccessibilityDelegate检测TYPE_VIEW_HOVER_ENTER事件。我使用它们来改变所触摸视图的背景颜色(对于视力不好的人)并播放声音以让用户知道屏幕中剩下多少视图。 –

回答

0

在Android bug跟踪器上检出this bug,它看起来像辅助功能服务干扰TextViews上的ellipsize属性。我遇到类似的问题android:ellipsize="start"跳到字符串的开头,直到我禁用了LastPass Accessibility服务。我确认Talkback服务导致了同样的问题。