7

私の Android アプリにはView、画像を表示する があり、関連付けられている がありますContentDescription

Settings->Accessibility->Talkbackを有効にし、Talkback 設定からExplore By Touchを使用してから、ビューを 1 回タップしてContentDescription読み上げることができます。

これまでのところ、これはすべて予想どおりです。

ただし、もう一度同じものを 1 回タップすると、 Explore By Touchが繰り返されます。たとえば、私の画像と説明は、 が含まれている間に更新される可能性があるため、新しいフレーズを言うとユーザーに役立ちます。どうすればこれを達成できますか?ContentDescriptionViewAccessibilityFocus

View.clearFocus()とを試してみましView.invalidate()たが、成功しませんでした。

建設的なアイデアは大歓迎です。

アップデート

API 8 以降のサポートを追加したいということも言及すべきでした。したがって、API 4 のアクセシビリティ インターフェイスでできる限りのことをしようとしています。

私は現在、更新されたビューの問題を回避するためにView.clearFocus()使用するソリューションに取り組んでいます。View.requestFocus()これは、API 8 および 16 を使用したテスト キットでこれまでのところ機能しているようです。

最終結果はまた更新しますが、それまでの間、さらなる提案を歓迎します。

4

1 に答える 1

12

私の質問で約束したように、これが私の調査の結果と実用的な解決策です。

まず、alanv の助けとサポート、および最新の API (14 以降) に関する質問に答えてくれたことに感謝します。彼は古い API の解決策を見つけられませんでしたが、答えを見つけるのに役立つ重要な情報を提供してくれました。

この記事の執筆時点ではAccessibilityEvent、TalkBack の既知のバグにより、正常に読み上げられた を作成することはできません。詳細については、「ビューにリンクされていないアクセシビリティ イベントを送信する」を参照してください。イベント ソースが null の場合、イベントは TalkBack (v3.5.0_r105) によって無視され、 API 14AccessibilityEvent.setSource(View)で最初に登場したように、それ以前にソースを設定することはできません - Google Eyes-Free issue #379を参照してください

しかし、前に示唆したように、Android にそのようなイベントを生成させることは可能です。View.requestFocus()

  1. 以下を使用して、 XML レイアウトでビューをフォーカス可能にします。

    android:focusable="true"
    android:focusableInTouchMode="true"

  2. 静的な場合は XML レイアウトでView.setContentDescription(text)inActivity.onCreateまたは withを使用して、音声テキストを設定し、必要に応じてコードで動的に設定します。android:contentDescription="text"

  3. 音声テキストが必要な場合は、 を使用してフォーカスを正しいビューに移動しView.requestFocus()ますAccessibilityEvent

  4. フレーズが繰り返されるようにするには (私の元の質問)、View.clearFocus()前のステップでフォーカスをリクエストする前に呼び出します。

API 8 で動作するこのアプローチのテスト済みの実装があり、API 16 でも動作します。アクセシビリティ APIが最初に導入されたときの API 4 までずっと動作するはずです。

このソリューションは、最近の Android API (14 以降) のみをサポートする開発者には必要ないかもしれませんが、以前の API でアクセシビリティをサポートしている開発者には、現時点で他にいくつかのオプションがあると思います。幸運を。

アップデート

残念ながら、alanv の回答は、コメント内の関連するすべての詳細と議論とともに消えた - おそらく削除されたようです。以下に要点をまとめてみました。

  1. Android API 14 以降では、次のようにフォーカスされたイベントを作成できます。

    if (mAccessibilityService.isEnabled()) { AccessibilityEvent event = AccessibilityEvent.obtain( AccessibilityEvent.TYPE_VIEW_FOCUSED); event.setSource(myView); // API 14 & later event.setClassName(myView.getClass().getName()); event.setPackageName(myView.getContext().getPackageName()); event.setEnabled(true); event.setContentDescription(text); myView.sendAccessibilityEventUnchecked(event); }

  2. Android API 16 以降の場合、View.announceForAccessibility(text)使用できます。

于 2014-08-06T13:13:05.347 に答える