0

I'm developing an application adapted to people with visual disabilities. If the device has an Android API greater than 14 I want to enhance Talkback a bit.

I have a ListView filling the whole screen where each row has just one TextView. Since the text might be quite long, I wanted to use marquee and single line to scroll the text when the user clicks in it.

I tested it without Talkback and it works:

Marquee works

So I decided to test it with Talkback active. In this case, I have two kind of problems:

1- Some rows doesn't scroll at all.

2- Some rows scroll, but I can't see more text than the one that is shown when the text isn't scrolled:

Marquee doesn't work

I don't know why some rows scroll and some doesn't, I use the same code for all of them.

To change the background color and start the marquee I'm adding an AccessibilityDelegate to each row.

This is the layout for each row:

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

And this is some of my adapter's code:

@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();
    }
}

Anybody knows if I can use marquee with Talkback?

Thank you!

PX Developer
  • 8,065
  • 7
  • 42
  • 66
  • What are you trying to accomplish with the AccessibilityDelegate, exactly? In general, your application shouldn't special-case hover events because that breaks the interaction model that's consistent elsewhere in Android. – alanv Feb 11 '14 at 07:00
  • The AccessibilityDelegate detects TYPE_VIEW_HOVER_ENTER events. I use them to change the background color of the touched View (for people with low vision) and to play a sound to let the user know how many views are left in the screen. – PX Developer Feb 11 '14 at 10:34

1 Answers1

1

Check out this bug on the Android bug tracker, it looks like Accessibility services interfere with the ellipsize property on TextViews. I was having similar issues with android:ellipsize="start" jumping to the start of the string until I disabled the LastPass Accessibility service. I verified that the Talkback service caused the same issue.

IAmKale
  • 3,146
  • 1
  • 25
  • 46