我正在尝试更新Android的示例代码“API Demos”应用程序,以便默认活动列表中的TextView项目具有可访问性所需的“内容描述”。这是此活动中列表的初始化外观:
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
函数创建了一个Map,其中指定了当有人点击其中一个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
填充地图的方式,如上所示,它在布局XML中映射到@android/text1
。
我想设置每个TextView的内容描述,其值与name
相同。我尝试过的事情:
(1):循环生成ListView的子项,并在每个项上调用item.setContentDescription(xxx)
。这没用;显然,当我循环浏览项目时,他们看不到/无法访问/存在,无论哪种方式都试图调用setContentDescription。
(2):为此修改后的TextView创建一个新的布局XML,其中包含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
返回的Map中,并将初始化代码更改为如下所示:
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”,以填充由android.R.id.text2
定义的布局XML中的字段。
这也没有用 - 没有失败,但是当我检查uiautomatorviewer中的列表时,没有可用的内容描述。这可能是因为我不明白android.R.id.text2
的意思,除了作为某种价值的占位符。我也尝试了android.R.id.content
同样的结果。
所以我的问题是,如何动态设置这些TextView的contentDescription?
答案 0 :(得分:3)
我想设置每个TextView的内容描述,其值与name相同。我尝试过的事情:
(1):循环生成ListView的子项,并在每个子项上调用item.setContentDescription(xxx)。这没用;显然,当我循环浏览项目时,他们看不到/无法访问/存在,无论哪种方式都试图调用setContentDescription。
你是对的,你的第一个方法失败了,因为还没有创建任何TextView。问题是它们同时永远不会可见(除非你只有一些行,它们适合屏幕而不滚动。)
解决方案:扩展SimpleAdapter并覆盖getView()
。每次显示一行时都会调用此方法。它允许您访问TextView,因此您可以在此处调用setContentDescription()
。
答案 1 :(得分: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;
}
}