如果EditText为空,则阻止用户关闭警报对话框

时间:2018-04-11 05:47:47

标签: java android android-studio android-edittext android-alertdialog

我使用带有EditText的AlertDialog Box,用户输入他的名字。当EditText为空时,我想阻止alertDialog关闭。

以下是我的代码



 private void request_user_name() {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("Enter name:");

        final EditText input_field = new EditText(this);
        input_field.setText(sharedpreferences.getString("username",""));
        final SharedPreferences.Editor editor = sharedpreferences.edit();

        builder.setCancelable(false);
        builder.setView(input_field);
        String savedName = sharedpreferences.getString(username,"");
        input_field.setText(savedName);
        input_field.setSelection(input_field.getText().length());
        builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                name = input_field.getText().toString();
               

                editor.putString(username, name);
                editor.apply();
            }
        });

        builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                dialogInterface.cancel();
                request_user_name();
            }
        });

        builder.show();
    }




我试图插入

 if(TextUtils.isEmpty(name)) {
                input_field.setError("Your message");
                return;
            }

在这样的AlertDialog Box中,但它没有工作

 private void request_user_name() {
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle("Enter name:");

    final EditText input_field = new EditText(this);
    input_field.setText(sharedpreferences.getString("username",""));
    final SharedPreferences.Editor editor = sharedpreferences.edit();

    builder.setCancelable(false);
    builder.setView(input_field);
    String savedName = sharedpreferences.getString(username,"");
    input_field.setText(savedName);
    input_field.setSelection(input_field.getText().length());
    builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialogInterface, int i) {
            name = input_field.getText().toString();
            if(TextUtils.isEmpty(name)) {
                input_field.setError("Your message");
                return;
            }


            editor.putString(username, name);
            editor.apply();
        }
    });

    builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialogInterface, int i) {
            dialogInterface.cancel();
            request_user_name();
        }
    });

    builder.show();
}

下面是图片文件,我有

enter image description here

和我想要的图像

enter image description here

提前致谢。

3 个答案:

答案 0 :(得分:2)

使用setCancelable(false)

只需设置此

即可
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle("Enter name:");
    builder.setCancelable(false);

答案 1 :(得分:0)

试试我制作的这个样本。首先,您必须为对话框创建布局,只需根据您的需要进行自定义。

//R.layout.new_message_dialog
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/checker_txt_frame"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">


    <TextView
        android:id="@+id/pin_header"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Send message to?"
        android:textAppearance="?android:attr/textAppearanceMedium"/>

    <EditText
        android:id="@+id/pin_txt"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:hint="Name"
        android:inputType="text"
        android:padding="10dp"
        android:layout_marginTop="10dp"
        android:cursorVisible="false"
        android:singleLine="true" />

    <TextView
        android:id="@+id/pin_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="right"
        android:padding="10dp"
        android:text="Confirm"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:textColor="@color/colorAccent" />
</LinearLayout>

然后给视图充气并将其设置为您的构建器。

View view = getLayoutInflater().inflate(R.layout.new_message_dialog, null, false);

    AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
    builder.setView(view);


    TextView tvConfirmBtn = view.findViewById(R.id.pin_btn);

    final EditText txtName = view.findViewById(R.id.pin_txt);

    final AlertDialog dialog = builder.create();
    dialog.show();

    tvConfirmBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            String name = txtName.getText().toString().trim();

            if (name.isEmpty()) {
                txtName.setError("Please provide a name.");
                txtName.requestFocus();
            } else {
                //do something here
                dialog.dismiss();
            }
        }
    });

答案 2 :(得分:0)

您会看到AlertDialog使用默认点击监听器,默认情况下转发点击呼叫dismiss

在您的情况下,您必须从对话框本身覆盖默认的单击侦听器,以定义对话框的自定义行为:

//Create the AlertDialog with a reference to edit it later
final AlertDialog dialog = new AlertDialog.Builder(context)
        .setView(v)
        .setTitle(R.string.my_title)
        .setCancelable(false)
        .setPositiveButton(android.R.string.ok, null) //Set to null. We override the onclick
        .setNegativeButton(android.R.string.cancel, null)
        .create();

dialog.setOnShowListener(new DialogInterface.OnShowListener() {

    @Override
    public void onShow(DialogInterface dialogInterface) {

        Button button = ((AlertDialog) dialog).getButton(AlertDialog.BUTTON_POSITIVE);
        button.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {
                // Check if your condition is met, Dismiss once everything is OK.
                dialog.dismiss();
            }
        });
    }
});
dialog.show();