web-dev-qa-db-ja.com

変更方法Androidダブルタップと長押しのトークバック手順

長押しアクションハンドラーがあるビューがあります。コンテンツの説明を使用して、ビューがフォーカスされたときにTalkbackが話すメッセージを設定します。

現在、それはフォーカスを得た直後の私のコンテンツの説明を言い、少し間を置いた後:

ダブルタップすると有効になり、ダブルタップして押し続けると長押しします

このメッセージを次のようなものに変更したい

ダブルタップして"アクション1"、ダブルタップして押したまま"アクション2"

そうする方法はありますか?

onPopulateAccessibilityEvent()を調べましたが、TYPE_VIEW_ACCESSIBILITY_FOCUSEDイベントを取得しましたが、目的のメッセージを変更できませんでした。

簡単なものがないですか?

12
Paul

alanvが彼の回答を投稿して以来、AccessibilityActionは若干変更されているようです。以下は、ViewCompatを使用した実用的なソリューションです。

ViewCompat.setAccessibilityDelegate(view, new AccessibilityDelegateCompat() {
    @Override
    public void onInitializeAccessibilityNodeInfo(View Host, AccessibilityNodeInfoCompat info) {
        super.onInitializeAccessibilityNodeInfo(Host, info);
        // A custom action description. For example, you could use "pause"
        // to have TalkBack speak "double-tap to pause."
        CharSequence description = Host.getResources().getText(R.string.my_click_desc);
        AccessibilityActionCompat customClick = new AccessibilityActionCompat(
                    AccessibilityNodeInfoCompat.ACTION_CLICK, description);
        info.addAction(customClick);
    }
});
9
JustinMorris

API 21以降では、ビューのAccessibilityNodeInfoにカスタムアクションを設定することで、アクション名をカスタマイズできます。これには2つの方法があります。1)AccessibilityDelegateを設定してonInitializeAccessibilityNodeInfoデリゲートメソッドをオーバーライドするか、2)ビューのクラスを拡張してonInitializeAccessibilityNodeInfoをオーバーライドします。

どちらの方法でも、新しい AccessibilityAction を作成し、ノードに AccessibilityNodeInfo.addAction を使用して設定します。

デリゲートの使用を選択した場合は、クリックアクションのカスタムの説明を次のように設定します。

view.setAccessibilityDelegate(new AccessibilityDelegate() {
  @Override
  public void onInitializeAccessibilityNodeInfo(
      View v, AccessibilityNodeInfo info) {
    super.onInitializeAccessibilityNodeInfo(v, info);

    // A custom action description. For example, you could use "pause"
    // to have TalkBack speak "double-tap to pause."
    CharSequence description = getResources().getText(R.string.my_click_desc);
    AccessibilityAction customClick = new AccessibilityAction(
            AccessibilityAction.ACTION_ACTION_CLICK, description);
    info.addAction(customClick);
  }
});

アプリケーションのターゲットがAPI <21の場合は、適切な*Compatサポートライブラリメソッド。この機能はバックポートされないため、API <21でカスタムの説明を取得できませんが、アプリケーションコードでの明示的なバージョンチェックを回避できます。

8
alanv

すべてのフレーズieを削除する場合は、以下のコードを使用してください。 「ダブルタップしてアクティブにする」、「ダブルタップして長押し」。

mSubTitleText = (TextView) view.findViewById(R.id.txt_subtitle);

 ViewCompat.setAccessibilityDelegate(mSubTitleText, new AccessibilityDelegateCompat() {
            @Override
            public void onPopulateAccessibilityEvent(View Host, AccessibilityEvent event) {
                Host.setClickable(false);
                Host.setLongClickable(false);
            }
        });
1
Azeela

すべてのフレーズieを削除する場合は、以下のコードを使用してください。 「にダブルタップ」。

ViewCompat.setAccessibilityDelegate(view, new AccessibilityDelegateCompat() {
        @Override
        public void onInitializeAccessibilityNodeInfo(View Host, AccessibilityNodeInfoCompat info) {
            super.onInitializeAccessibilityNodeInfo(Host, info);
            info.addAction(AccessibilityNodeInfoCompat.ACTION_FOCUS);
        }
});

これは基本的に以下のコードを呼び出しており、requestFocusにはデフォルトのトークバックアナウンスが関連付けられていません。

case AccessibilityNodeInfo.ACTION_FOCUS: {
                if (!hasFocus()) {
                    // Get out of touch mode since accessibility
                    // wants to move focus around.
                    getViewRootImpl().ensureTouchMode(false);
                    return requestFocus();
                }
            }
1
Rubin Yoo