Android对讲不读取对话框的内容

时间:2017-10-03 13:27:59

标签: android dialog talkback

我试图在用户输入错误的用户名或密码时显示对话框,使用以下代码。

private void showAlert(String title, String msg) {
    customDialog = new Dialog(LoginActivity.this,
            android.R.style.Theme_Dialog);
    customDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
    customDialog.setContentView(R.layout.custom_alert_dialog);

    tvTitle = (TextView) customDialog
            .findViewById(R.id.dialog_title);
    tvMsg = (TextView) customDialog
            .findViewById(R.id.dialog_message);
    btnNeutral = (Button) customDialog
            .findViewById(R.id.closeAlert);

    tvMsg.setText(msg);
    tvTitle.setText(title);

    tvMsg.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED);
    tvMsg.setFocusable(true);

    btnNeutral.setText("Close");
    btnNeutral.setVisibility(View.VISIBLE);
    btnNeutral.setOnClickListener(new OnClickListener() {

        public void onClick(View v) {
            customDialog.dismiss();
        }
    });
    customDialog.show();
    tvMsg.requestFocus();
}

代码工作正常但我担心的是,当我尝试使用android对讲时。它只读取对话框的标题。对讲需要读取对话框的内容(消息)而不是标题。任何人都可以帮我这样做吗?

1 个答案:

答案 0 :(得分:1)

首先,宣布新对话框的标题非常标准。否则,在可访问性方面可能会产生相反的效果。这听起来像是一个有动力做好事的人的可访问性要求,并不能真正理解残疾用户的需求。任意推动焦点通常是不好的。让操作系统以焦点完成它想要的东西,这是辅助技术(TalkBack)用户将习以为常的。

这说明您的代码存在两个首要问题。首先,当你说焦点时,你的意思是可访问性焦点。

tvMsg.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED);
tvMsg.setFocusable(true);
tvMsg.requestFocus();

所有这些行都指的是键盘或输入焦点,其中没有一个对TextView特别有意义。这些仅对ButtonsEditText框等活动元素有意义。如果你做得对,这会有效吗,是的。但是,它带来了尴尬的副作用,比如将TextView添加到Tab排序中,这对于仅限键盘的用户来说很尴尬,因为TextViews没有焦点高光,因此Focus导航消失了。你真正想要的是以下事件类型:

AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED

现在,第二点。在您的视图实际渲染之前,您已经完成了所有这些操作。替换此行:

tvMsg.requestFocus();

这一行:

tvMsg.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED);

删除上面提到的其他行,你应该是金色的。虽然,再一次,我的最终建议就是放弃所有这一切,直接删除这三行,并忘记这一点。让操作系统做它的事情!