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関数は、誰かが TextView リスト要素の 1 つをタップしたときに指定された適切な意図を持つ Map を作成します。内部的には、次の関数を使用します。

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): を含む、この変更された 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>

次に、 によって返される Map に「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.

これも機能しませんでした。失敗ではありませんが、uiautomatorviewer でリストを調べると、コンテンツの説明がありません。android.R.id.text2なんらかの値のプレースホルダーである以外に、意味がわからないことが原因である可能性があります。android.R.id.content私も同じ結果で試しました。

私の質問は、これらの TextViews の contentDescription を動的に設定するにはどうすればよいですか?

4

2 に答える 2

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

}
于 2013-03-01T22:47:44.863 に答える
3

各 TextView のコンテンツの説明を name と同じ値に設定したいと考えています。私が試したこと:

(1): 生成された ListView の子項目をループし、それぞれに対して item.setContentDescription(xxx) を呼び出します。これはうまくいきませんでした。どうやら、アイテムが表示されていない、アクセスできない、または存在しないアイテムをループしている時点で、いずれにしても setContentDescription を呼び出そうとすると失敗します。

その通りです。TextView がまだ作成されていないため、最初のメソッドは失敗しました。問題は、それらがすべて同時に表示されることはないことです (ほんの一握りの行しかなく、スクロールせずに画面に収まる場合を除きます)。

解決策: SimpleAdapter を拡張してオーバーライドしますgetView()。このメソッドは、行が表示されるたびに呼び出されます。TextView にアクセスできるので、setContentDescription()ここで呼び出すことができます。

于 2013-03-01T18:34:20.090 に答える