web-dev-qa-db-ja.com

Android-TalkBackアクセシビリティフォーカスを特定のビューに設定する

TalkBackが有効な場合、アクセシビリティフォーカスマニュアルを特定のビューに設定する方法はありますか?たとえば、アクティビティが開始されたときに、TalkBackが特定のボタン(ビューの周りの黄色のフレーム)に自動的にフォーカスし、そのコンテンツの説明を読むようにします。

私がこれまでに試したこと:

    myButton.setFocusable(true);
    myButton.setFocusableInTouchMode(true);
    myButton.requestFocus();

requestFocus()は、入力フォーカスのみを要求しており、アクセシビリティフォーカスとは何の関係もないようです。私も試しました:

    myButton.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED);
    myButton.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED);
    myButton.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED);
    myButton.announceForAccessibility("accessibility test");
    myButton.performAccessibilityAction(64, null); // Equivalent to ACTION_ACCESSIBILITY_FOCUS

    AccessibilityManager manager = (AccessibilityManager) getSystemService(Context.ACCESSIBILITY_SERVICE);
    if (manager.isEnabled()) {
        AccessibilityEvent e = AccessibilityEvent.obtain();
        e.setSource(myButton);
        e.setEventType(AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED);
        e.setClassName(getClass().getName());
        e.setPackageName(getPackageName());
        e.getText().add("another accessibility test");
        manager.sendAccessibilityEvent(e);
    }

これはどれもうまくいかないようです。

20
Skywalker10

免責事項:アクティビティの負荷に焦点を当てるのはどこかであるが、一番上のバーは常に(大丈夫、ほとんど言われるべきではありません)ですが、実際にはそうしないでください。これは、予測可能なナビゲーションとコンテキストの変更に関する3.2.1と3.2.3を含む、あらゆる種類のWCAG 2.0規制の違反です。これを行うことで、実際にアプリにアクセスできなくなる可能性があります。

http://www.w3.org/TR/WCAG20/#consistent-behavior

免責条項。

正しい関数呼び出しを使用しています。あなたがする必要があるのはこれだけです:

myButton.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED);

問題は、おそらくあなたがこれをしようとするポイントです。 Talkbackは、アクティビティサイクルの少し後の時点でアクティビティにアタッチされます。次の解決策はこの問題を示しています、正直に言うと、これを行うより良い方法があるかどうかはわかりません。 onPostResumeを試しました。これは、アクティビティの読み込みに関してAndroid OSが呼び出す最後のコールバックであり、それでも遅延を追加する必要がありました。

@Override
protected void onPostResume() {
    super.onPostResume();

    Log.wtf(this.getClass().getSimpleName(), "onPostResume");

    Runnable task = new Runnable() {

        @Override
        public void run() {
            Button theButton = (Button)WelcomeScreen.this.findViewById(R.id.idButton);
            theButton.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED);
        }
    };

    final ScheduledExecutorService worker = Executors.newSingleThreadScheduledExecutor();

    worker.schedule(task, 5, TimeUnit.SECONDS);

}

カスタムビューを作成できる場合があります。ビュー内のコールバックは、競合状態なしに、これを行うために必要なロジックを提供する場合があります!時間があればもっと後で調べるかもしれません。

33
ChrisCM