【问题标题】:Set contentDescription dynamically when populating list of TextViews填充 TextView 列表时动态设置 contentDescription
【发布时间】:2013-03-01 18:27:23
【问题描述】:

我正在尝试更新 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 返回的地图中,并将初始化代码更改为如下所示:

    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?

【问题讨论】:

    标签: android


    【解决方案1】:

    我想将每个 TextView 的内容描述设置为与名称相同的值。我尝试过的事情:

    (1):循环遍历生成的 ListView 的子项,并在每个子项上调用 item.setContentDescription(xxx)。这没有用;显然,此时我正在遍历它们不可见/不可访问/不存在的项目,并且尝试调用 setContentDescription 的任何一种方式都会爆炸。

    你是对的,你的第一个方法失败了,因为还没有创建任何 TextView。问题是它们从不同时可见(除非您只有几行并且它们适合屏幕而不滚动。)

    解决方案:扩展 SimpleAdapter 并覆盖 getView()。每次显示一行时都会调用此方法。它使您可以访问 TextView,因此您可以在此处调用 setContentDescription()

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-12
        • 2011-01-13
        • 2011-05-31
        • 1970-01-01
        • 2011-05-01
        • 2013-08-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多