長押しアクションハンドラーがあるビューがあります。コンテンツの説明を使用して、ビューがフォーカスされたときにTalkbackが話すメッセージを設定します。
現在、それはフォーカスを得た直後の私のコンテンツの説明を言い、少し間を置いた後:
ダブルタップすると有効になり、ダブルタップして押し続けると長押しします
このメッセージを次のようなものに変更したい
ダブルタップして"アクション1"、ダブルタップして押したまま"アクション2"
そうする方法はありますか?
onPopulateAccessibilityEvent()
を調べましたが、TYPE_VIEW_ACCESSIBILITY_FOCUSED
イベントを取得しましたが、目的のメッセージを変更できませんでした。
簡単なものがないですか?
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);
}
});
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でカスタムの説明を取得できませんが、アプリケーションコードでの明示的なバージョンチェックを回避できます。
すべてのフレーズ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);
}
});
すべてのフレーズ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();
}
}