我试图在用户输入错误的用户名或密码时显示对话框,使用以下代码。
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对讲时。它只读取对话框的标题。对讲需要读取对话框的内容(消息)而不是标题。任何人都可以帮我这样做吗?
答案 0 :(得分:1)
首先,宣布新对话框的标题非常标准。否则,在可访问性方面可能会产生相反的效果。这听起来像是一个有动力做好事的人的可访问性要求,并不能真正理解残疾用户的需求。任意推动焦点通常是不好的。让操作系统以焦点完成它想要的东西,这是辅助技术(TalkBack)用户将习以为常的。
这说明您的代码存在两个首要问题。首先,当你说焦点时,你的意思是可访问性焦点。
tvMsg.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED);
tvMsg.setFocusable(true);
tvMsg.requestFocus();
所有这些行都指的是键盘或输入焦点,其中没有一个对TextView
特别有意义。这些仅对Buttons
和EditText
框等活动元素有意义。如果你做得对,这会有效吗,是的。但是,它带来了尴尬的副作用,比如将TextView
添加到Tab排序中,这对于仅限键盘的用户来说很尴尬,因为TextViews没有焦点高光,因此Focus导航消失了。你真正想要的是以下事件类型:
AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED
现在,第二点。在您的视图实际渲染之前,您已经完成了所有这些操作。替换此行:
tvMsg.requestFocus();
这一行:
tvMsg.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED);
删除上面提到的其他行,你应该是金色的。虽然,再一次,我的最终建议就是放弃所有这一切,直接删除这三行,并忘记这一点。让操作系统做它的事情!