在填充TextView列表时动态设置contentDescription

3

我正在尝试更新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?
2个回答

3
我希望将每个TextView的内容描述设置为与名称相同的值。我尝试过以下方法:(1)循环遍历生成的ListView的子项,并在每个子项上调用item.setContentDescription(xxx)。这种方法失败了,因为在我循环遍历子项时,它们并不可见/可访问/存在,无论如何都会导致setContentDescription失败。
你是正确的,第一种方法失败了,因为TextView还没有被创建。问题在于,除非只有少量行并且它们在屏幕上不滚动,否则它们永远不会同时可见。
解决方法:扩展SimpleAdapter并重写getView()。每次显示一行时,都会调用此方法。它使您可以访问TextView,因此您可以在此处调用setContentDescription()。

3

@Sam提供了一种解决方案,我也想将代码贡献到我的扩展类中,以便其他人使用:

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

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接