簡體   English   中英

如何為雙擊和長按更改 Android 對講指令

[英]How to change Android talkback instructions for double tap and long press

我有一個長按動作處理程序的視圖。 我使用內容描述來設置當視圖獲得焦點時 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上設置自定義操作來自定義操作名稱。 有兩種方法: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_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();
                }
            }

這是一個示例:

ViewCompat.setAccessibilityDelegate(set_actions_button, object : AccessibilityDelegateCompat() {
    override fun onInitializeAccessibilityNodeInfo(v: View, info: AccessibilityNodeInfoCompat) {
        super.onInitializeAccessibilityNodeInfo(v, info)
        info.addAction(AccessibilityActionCompat(
            AccessibilityNodeInfoCompat.ACTION_CLICK, "Edit note"))
        info.addAction(AccessibilityActionCompat(
            AccessibilityNodeInfoCompat.ACTION_LONG_CLICK, "Copy note"))
    }
})

看看這篇文章,它解釋得很好。

我的一些設備正在添加“雙擊並按住以長按”等。我只想閱讀我的整個段落並僅添加“雙擊激活”。 所以我是這樣寫的;

ViewCompat.setAccessibilityDelegate(<YOUR_TEXTVIEW>, object : AccessibilityDelegateCompat() {
            override fun onInitializeAccessibilityNodeInfo(host: View, info: AccessibilityNodeInfoCompat) {
                super.onInitializeAccessibilityNodeInfo(host, info)
                info.removeAction(AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_CLICK)
                info.isClickable = false
                info.isLongClickable = false
                info.text = "${<YOUR_TEXTVIEW>.text}\n" + "Double tap to activate."
                host.isLongClickable = false
            }
        })

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM