【问题标题】:User-friendly display of validation errors in Android dialogs在 Android 对话框中以用户友好的方式显示验证错误
【发布时间】:2013-05-03 09:02:45
【问题描述】:

我有一个带有多个输入控件元素的对话框片段 A。当用户为某些字段输入无效值时,会弹出一个带有验证错误消息的对话框 B。

问题是当我关闭对话框 B 时,对话框 A 不可见。这对用户不友好 - 如果对话框有 10 个值并且用户为其中 9 个输入了正确的值,那么在验证错误的情况下,他/她必须再次重新输入这 9 个正确的值。

A 和 B 都使用AlertDialog 实现。

如何实现验证错误消息的显示,以便用户可以返回对话框 A,更正错误值并再次按下 OK 按钮?

【问题讨论】:

  • 我不认为当用户点击对话框按钮时你可以在屏幕上保持对话框......所以使用 Activity 作为 AlertDialog 的更好和更好的方法......这个会很容易
  • @Dmitri Pisarenko-1 对话框一次只显示..所以你应该存储对话框 A 字段的值并将其关闭。之后当对话框 B 打开并按下对话框 B 的确定时 - 恢复对话框 A 的字段值。
  • @PankajKumar 我不能让它成为一个活动,因为对话框的父级是一个片段。
  • 谢谢。有没有其他方法可以告诉用户控件 X 的值是错误的(例如突出显示它)?

标签: android user-interface usability


【解决方案1】:

这是杂乱无章的,但我设法让它为我工作。执行此操作的方法是在警报对话框上显示验证错误(并防止对话框被关闭),即覆盖对话框按钮的OnClickListener。您可能会想“我已经在这样做了……谢谢混蛋”,但这就是诀窍。您可能正在调用 AlertDialog.Builder().setTitle().setView().setPositiveButton(title, new OnClickListener() {...validation logic...}).create(); 然后返回它。如果你想防止对话框被关闭,你需要在对话框中添加一个OnShowListener(在它被创建之后)并覆盖按钮点击那里。这是一个例子:

不起作用的方式:

    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    builder.setTitle("Dialog example").setPositiveButton(android.R.string.ok, new Dialog.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            // do some validation logic
            if (!valid) {
                myEditText.setError(R.string.invalid_value); //
            } else {
                dialog.dismiss();
            }
        }
    });

    Dialog dialog = builder.create();
    // show the dialog, or return it, whatever you're going to do with it

所以上面的方法不起作用,因为你的onClickListener 在默认值之前被调用,这将关闭对话框。这是一种解决方法:

    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    builder.setTitle("Dialog example").setPositiveButton(android.R.string.ok, null);

    Dialog dialog = builder.create();
dialog.setOnShowListener(new OnShowListener() {

    @Override
    public void onShow(DialogInterface dialog) {
        ((AlertDialog)dialog).getButton(DialogInterface.BUTTON_POSITIVE).setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            // do some validation logic
            if (!valid) {
                myEditText.setError(R.string.invalid_value); //
            } else {
                dialog.dismiss();
            }
        }
    }
});

请记住,您有责任解雇它!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 2012-05-31
    • 1970-01-01
    • 2017-08-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多