2013-03-01 2 views
1

Я пытаюсь обновить пример кода приложения Android «API Demos», чтобы элементы TextView в списке активности по умолчанию имели «описание содержимого», необходимое для доступности. Это то, что инициализация выглядит для списка в этой деятельности:Установить содержимоеОписание динамически при заполнении списка TextViews

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    Intent intent = getIntent(); 
    String path = intent.getStringExtra("com.example.android.apis.Path"); 

    if (path == null) { 
     path = ""; 
    } 

    setListAdapter(new SimpleAdapter(this, getData(path), 
      android.R.layout.simple_list_item_1, new String[] { "title" }, 
      new int[] { android.R.id.text1 })); 
    getListView().setTextFilterEnabled(true); 
} 

И функция getData создает карту с соответствующими намерениями, указанных когда кто-то стучит на одном из элементов списка TextView. Внутри она использует эту функцию:

protected void addItem(List<Map<String, Object>> data, String name, Intent intent) { 
    Map<String, Object> temp = new HashMap<String, Object>(); 
    temp.put("title", name); 
    temp.put("intent", intent); 
    data.add(temp); 
} 

Это как карта заполняется title, который, как вы можете видеть выше отображается @android/text1 в макете XML.

Я хочу установить описание содержимого каждого из TextViews с тем же значением, что и name. Вещи, которые я пробовал:

(1): Цитирование через дочерние элементы ListView, который сгенерирован и вызывает item.setContentDescription(xxx) на каждом из них. Это не сработало; по-видимому, в тот момент, когда я перебираю элементы, которые они не видны/доступны/отсутствуют, и в любом случае попытка вызова setContentDescription взрывается.

(2): Создание нового формата XML для этого модифицированного TextView, который включает в себя android:contentDescription. Макет XML выглядел как этот

<?xml version="1.0" encoding="utf-8"?> 
<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@android:id/text1" 
    android:contentDescription="@android:id/text2" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:textAppearance="?android:attr/textAppearanceLarge" 
    android:gravity="center_vertical" 
    android:paddingLeft="6dip" 
    android:minHeight="?android:attr/listPreferredItemHeight"> 
</TextView> 

тогда я убедился, что «contentDescription» была добавлена ​​к карте, возвращаемой addItem, и изменил код инициализации выглядеть следующим образом:

setListAdapter(new SimpleAdapter(this, getData(path), 
      R.layout.simple_list_item_with_desc, new String[] { "title", "contentDescription" }, 
      new int[] { android.R.id.text1, android.R.id.text2 })); 

Другими словами , Я пытался получить «contentDescription» из моей статической карты данных, чтобы заполнить поле в макете XML, определяемом android.R.id.text2.

Это также не сработало - без сбоев, но когда я просматриваю список в uiautomatorviewer, описание содержимого не доступно. Это может быть из-за того, что я не понимаю, что означает android.R.id.text2, за исключением того, что это местозаполнитель для какой-либо ценности. Я также попробовал android.R.id.content с тем же результатом.

Так что мой вопрос в том, как динамически установить содержание описания этих текстовых элементов?

ответ

3

Я хочу установить описание содержимого каждого из TextViews с тем же значением, что и имя. Вещи, которые я пробовал:

(1): Цитирование через дочерние элементы ListView, который сгенерирован и вызывает item.setContentDescription (xxx) для каждого из них. Это не сработало; по-видимому, в тот момент, когда я перебираю элементы, которые они не видны/доступны/отсутствуют, и в любом случае попытка вызова setContentDescription взрывается.

Вы правы, ваш первый метод завершился неудачно, потому что ни один из TextViews еще не создан. Проблема в том, что они никогда не видны все в то же время (если у вас есть только несколько строк, и они помещаются на экране без прокрутки.)

Решение: Продлить SimpleAdapter и переопределить getView(). Этот метод вызывается каждый раз, когда отображается строка.Это дает вам доступ к TextView, поэтому вы можете позвонить setContentDescription() здесь.

+2

Awesome, спасибо! Это решило это для меня. –

3

@ Сэм предоставил решение, и я хотел бы также внести свой вклад обратно код в мой класс расширения в случае, если это полезно кому-либо еще:

package com.example.android.apis; 

import java.util.List; 
import java.util.Map; 

import android.content.Context; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.SimpleAdapter; 
import android.widget.TextView; 

public class SimpleAdapterWithDesc extends SimpleAdapter { 

    public SimpleAdapterWithDesc(Context context, 
      List<? extends Map<String, ?>> data, int resource, String[] from, 
      int[] to) { 
     super(context, data, resource, from, to); 
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 
     TextView myView = (TextView)super.getView(position, convertView, parent); 
     myView.setContentDescription(myView.getText()); 
     return myView; 
    } 

}