在Toast中自定义Android对讲

时间:2015-09-01 06:00:59

标签: android android-toast talkback accessibilityservice

我已通过 Android TalkBack检查了所有默认Toast消息。默认Android Talkback行为是它读取Toast中的所有内容(不停止)。有什么方法可以根据我的需要定制它。例如:

Toast.makeText(getApplicationContext(), "Hello world! Welcome to Android. This is Stackoverflow.", Toast.LENGTH_SHORT).show();

当Toast出现时,它会自动读取“Hello world!欢迎使用Android。这是Stackoverflow。”但我想控制它,就像它应该只读“Hello world”或“Welcome to Android”或“This is Stackoverflow”等。

1 个答案:

答案 0 :(得分:3)

我无法想到这样做的理由 - 通常,您希望在为用户提供的信息之间存在某种奇偶性,无论他们使用这些信息的方式如何。

如果您只是在寻找TalkBack朗读文本,也许您可​​以直接使用View.announceForAccessibility API。那说......

是的,通过语音反馈可访问性服务可以大声朗读不同的内容。

Toast toast = Toast.makeText(this, "visible text", Toast.LENGTH_SHORT);
View.AccessibilityDelegate delegate = new View.AccessibilityDelegate() {
    @Override
    public void onPopulateAccessibilityEvent(View host, AccessibilityEvent event) {
        super.onPopulateAccessibilityEvent(host, event);
        event.setContentDescription("audible text");
    }
};
((ViewGroup) toast.getView()).getChildAt(0).setAccessibilityDelegate(delegate);
toast.show();

注意获得TextView引用的超级hacky方法。这很危险,因为它可能会破坏Android的不同实现。

您可以直接在Toast上设置自己的视图:

Toast toast = new Toast(this);
TextView messageView = new TextView(this);
messageView.setText("visible text");
View.AccessibilityDelegate delegate = new View.AccessibilityDelegate() {
    @Override
    public void onPopulateAccessibilityEvent(View host, AccessibilityEvent event) {
        super.onPopulateAccessibilityEvent(host, event);
        event.setContentDescription("audible text");
    }
};
messageView.setAccessibilityDelegate(delegate);
toast.setView(messageView);
toast.show();