デフォルトでは、アクセシビリティ サービスは EditText ビューに対して以下を読み上げます。
- EditText に値が入力されている場合 = その値が読み出されます
- 値が入力されていない場合 = 「ヒント」を読み上げます
どちらの場合もまったく異なるものを読み上げてほしい。
私のxmlスニペットは
<EditText
android:id="@+id/my_edit_text"
android:layout_height="wrap_content"
android:layout_width="0dp"
android:layout_weight="1"
android:editable="false"
android:focusable="true"
android:hint="my hint text"/>
API 14 以降をサポートする必要があります。
この 1 つのケースで EditText を拡張する手間をかけたくないので、am AccessibilityDelegate を使用しています。
mEditTextView.setAccessibilityDelegate(accessibilityDelegate);
ドキュメントから、私のデリゲートでは、動作を変更したいデリゲートのメソッドを上書きするだけでよいことがわかりました。他のすべてのメソッドは、デフォルトでビューの実装になります。
http://developer.android.com/reference/android/view/View.AccessibilityDelegate.html http://developer.android.com/reference/android/view/View.html
「onPopulateAccessibilityEvent」のドキュメントは次のように述べています。「ホスト View にアクセシビリティ イベントにテキスト コンテンツを設定する機会を与えます。」「dispatchPopulateAccessibilityEvent」のドキュメントは次のように述べています。テキスト コンテンツをイベントに追加します。 " デフォルトの動作は、ビュー自体に対して "onPopulateAccessibilityEvent" を呼び出し、次にそのすべての子に対して "dispatchPopulateAccessibilityEvent" を呼び出すことです。
http://developer.android.com/guide/topics/ui/accessibility/apps.html
このドキュメントは、「onPopulateAccessibilityEvent」の下に「*このイベントの実装が出力テキストを完全にオーバーライドし、レイアウトの他の部分がコンテンツを変更できないようにする場合は、コードでこのメソッドのスーパー実装を呼び出さないでください。」
したがって、私の代理人は次のとおりです
View.AccessibilityDelegate accessibilityDelegate = new View.AccessibilityDelegate() {
@Override
public void onPopulateAccessibilityEvent(View v, AccessibilityEvent event) {
event.getText().add("Apples");
}
};
キーボードを使用して移動するか、画面を使用して EditText ビューをタップすると、「リンゴ」ではなく「ヒント テキスト」と表示されるのはなぜですか?
デバッガーを使用すると、イベント テキストを設定する前はテキストが空で、設定後は「りんご」になっているのに、TalkBack がまだヒントを読み上げていることがわかります。
奇妙なことに、「onInitializeAccessibilityNodeInfo」を上書きして目的のテキストでイベントを送信すると、この目的のテキストが読み上げられます (以下のコード スニペットを参照)。しかし、「onInitializeAccessibilityNodeInfo」は EditText のイベントに反応しているが、新しいイベントを発生させるだけなので、これは私には間違っているようです。
@Override
public void onInitializeAccessibilityNodeInfo(View v, AccessibilityNodeInfo info){
super.onInitializeAccessibilityNodeInfo(v, info);
...
final AccessibilityEvent event = AccessibilityEvent.obtain(eventType);
event.getText().add("Pears");
event.setClassName(className);
event.setPackageName(packageName);
...
v.getParent().requestSendAccessibilityEvent(v, event);
}