【问题标题】:Displaying one alert dialog, dismissing and displaying another alert dialog显示一个警报对话框,关闭并显示另一个警报对话框
【发布时间】:2019-07-06 20:19:22
【问题描述】:

我正在创建一个注册布局。因为要放入一个布局的信息太多,所以我需要使用两个

当用户选择REGISTER按钮时,我想显示布局1,将数据保存到firebase,然后当他们选择肯定按钮时,它会关闭布局1并显示布局2。

我该怎么做?

我有两个对话框:

showVehicleDetails

AlertDialog.Builder alert_dialog = new AlertDialog.Builder(this);
    alert_dialog.setTitle("VEHICLE DETAILS");
    alert_dialog.setMessage("Please, fill in the following:");
    LayoutInflater inflate = LayoutInflater.from(this);
    View vehicle_details = inflate.inflate(R.layout.layout_vehicle_details, null);

    final MaterialEditText edtYear = vehicle_details.findViewById(R.id.year);
    final MaterialEditText edtCMNM = vehicle_details.findViewById(R.id.cmnm);
    final MaterialEditText edtPlate = vehicle_details.findViewById(R.id.plate);

    alert_dialog.setView(vehicle_details);

    alert_dialog.setPositiveButton("SUBMIT", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            dialog.dismiss();

            // check validation
            if (TextUtils.isEmpty(edtYear.getText().toString())) {
                Snackbar.make(rootLayout, "Please enter year of your vehicle", Snackbar
                        .LENGTH_SHORT).show();

                return;
            }

            if (TextUtils.isEmpty(edtCMNM.getText().toString())) {
                Snackbar.make(rootLayout, "Please enter the Color, Make and Model of your vehicle",
                        Snackbar.LENGTH_SHORT).show();

                return;
            }

            if (TextUtils.isEmpty(edtPlate.getText().toString())) {
                Snackbar.make(rootLayout, "Please enter your license plate number", Snackbar
                        .LENGTH_SHORT).show();

                return;
            }

            // save to firebase/ Users/Drivers ...

            details = users;
            details.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot snapshot) {
                    // get drivers id
                    for (DataSnapshot ss : snapshot.getChildren()) {
                        String id = ss.getKey();

                        String year = edtYear.getText().toString();
                        String cmnm = edtCMNM.getText().toString();
                        String plate = edtPlate.getText().toString();

                        Log.e(TAG, "year: " + year + ", cmnm: " + cmnm + ", plate: " + plate);

                        // data sent
                        details.child(id).child("year").setValue(year);
                        details.child(id).child("cmnm").setValue(cmnm);
                        details.child(id).child("plate").setValue(plate);
                    }
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });
        }
    });

    AlertDialog dialog = alert_dialog.create();
    dialog.show();
}

showRegisterDialog

final AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle("REGISTER");
    builder.setMessage("Please use email to register");
    LayoutInflater inflater = LayoutInflater.from(this);
    View register_layout = inflater.inflate(R.layout.layout_register, null);

    final MaterialEditText edtEmail = register_layout.findViewById(R.id.email);
    final MaterialEditText edtPassword = register_layout.findViewById(R.id.password);
    final MaterialEditText edtName = register_layout.findViewById(R.id.usersname);
    final MaterialEditText edtPhone = register_layout.findViewById(R.id.cell);

    final MaterialAnimatedSwitch policies_switch = register_layout.findViewById(R.id.policies_switch);

    builder.setView(register_layout);

    builder.setPositiveButton("REGISTER", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(final DialogInterface dialog, int which) {
            dialog.dismiss();

            // check validation
            if (TextUtils.isEmpty(edtEmail.getText().toString())) {
                Snackbar.make(rootLayout, "Please enter email address", Snackbar
                        .LENGTH_SHORT).show();

                return;
            }

            if (TextUtils.isEmpty(edtPhone.getText().toString())) {
                Snackbar.make(rootLayout, "Please enter phone number", Snackbar
                        .LENGTH_SHORT).show();

                return;
            }

            if (TextUtils.isEmpty(edtPassword.getText().toString())) {
                Snackbar.make(rootLayout, "Please enter password", Snackbar
                        .LENGTH_SHORT).show();

                return;
            }

            if (edtPassword.getText().toString().length() < 6) {
                Snackbar.make(rootLayout, "Password too short !!!", Snackbar
                        .LENGTH_SHORT).show();

                return;
            }


            // Register new user
            auth.createUserWithEmailAndPassword(edtEmail.getText().toString(),
                    edtPassword.getText().toString())
                    .addOnSuccessListener(new OnSuccessListener<AuthResult>() {
                        @Override
                        public void onSuccess(AuthResult authResult) {
                            // Save user to db
                            Driver driver = new Driver();
                            driver.setEmail(edtEmail.getText().toString());
                            driver.setUsersname(edtName.getText().toString());
                            driver.setCell(edtPhone.getText().toString());
                            driver.setPassword(edtPassword.getText().toString());
                            driver.setRates("4.5"); // TODO: Default added

                            // use uid to key
                            users.child(FirebaseAuth.getInstance().getCurrentUser().getUid())
                                    .setValue(driver)
                                    .addOnSuccessListener(new OnSuccessListener<Void>() {
                                        @Override
                                        public void onSuccess(Void aVoid) {
                                            Snackbar.make(rootLayout, "Registration successful !!!",
                                                    Snackbar.LENGTH_SHORT).show();
                                        }
                                    })

                                    .addOnFailureListener(new OnFailureListener() {
                                        @Override
                                        public void onFailure(@NonNull Exception e) {
                                            Snackbar.make(rootLayout, "Failed" + e.getMessage(),
                                                    Snackbar.LENGTH_SHORT).show();
                                        }
                                    });
                        }
                    })

                    .addOnFailureListener(new OnFailureListener() {
                        @Override
                        public void onFailure(@NonNull Exception e) {
                            Snackbar.make(rootLayout, "Failed" + e.getMessage(),
                                    Snackbar.LENGTH_SHORT).show();
                        }
                    });
        }
    });

    builder.setNegativeButton("CANCEL", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            dialog.dismiss();
        }
    });

    final AlertDialog dialog = builder.create();

    /* If switch is on, enable REGISTER button */
    policies_switch.setOnCheckedChangeListener(new MaterialAnimatedSwitch.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(boolean isChecked) {
            if (isChecked) {
                dialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(true); // if checked, enable
            }
        }
    });

    dialog.show();

    dialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false); // set disabled by default

}

就目前而言,当我单击Register 按钮时,它会显示第二个布局 showRegisterDialog。

我希望它首先显示showVehicleDetails,当我选择肯定按钮SUBMIT 时,它应该显示showRegisterDetails

当我运行代码时,在onCreate

btnRegister.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            showVehicleDetails();
            showRegisterDialog();
        }
    });

编辑

当我按下注册按钮时会发生这种情况,它会粘在上面而不是关闭

【问题讨论】:

  • 您可以先分享一下您到目前为止所做的任何代码吗?
  • 一种方法是为 2 个对话创建自定义布局,因为它们具有不同的数据,步骤如下 1. 在 .setPositiveButton 中单击(启动将数据保存到您将获得的 firebase使用对话框组件内容 textview edittext ...等)2.在firebase中成功启动第二个对话,我更喜欢将它们保留在方法中,以便您可以单独跟踪它们中的每一个,并关闭当前的对话,你可以现在有它的参考 3. 在第二个对话中执行步骤 1 和 2 直到保存,而不是启动只是关闭 dialgoue
  • 从 OnClickListener 中移除这个 showRegisterDialog(); 并在 datasnapshot 的 foreach 之后将其与 dialog.dismiss() 一起放入 onDataChange ... 在侦听器之后删除 dialog.dismiss 并将其放在您之前showRegisterDialog();现在在 showRegisterDialog 中将 dialogDismiss 放在 Snackbar.make(rootLayout, "Registration successful !!!", Snackbar.LENGTH_SHORT).show(); 之后
  • 嘿@LizG,我已经使用自定义对话框类添加了答案。我相信它可以帮助您简化代码并解决问题。请记住 - 您可以通过多种方式解决一个问题,这只是解决问题的另一种方式。
  • dialog.dismiss 超出范围 但我没有 foreach -> 是的,我意味着 onDataChange 中的 for 循环将其放在此 for 循环之后,以确保在进行下一步之前已更改所有数据

标签: android android-alertdialog


【解决方案1】:

好的,我不推荐它像这样我更喜欢它像@Tamir 在他的回答中所表达的那样更干净,但是这是您需要做的,以便您稍后可以重构更清洁和更简单的代码来帮助您采取轻松分离和调试。

正如我在评论中所解释的,这里是您将要更改的修正 关于 showVehicleDetails :

AlertDialog.Builder alert_dialog = new AlertDialog.Builder(this);
alert_dialog.setTitle("VEHICLE DETAILS");
alert_dialog.setMessage("Please, fill in the following:");
LayoutInflater inflate = LayoutInflater.from(this);
View vehicle_details = inflate.inflate(R.layout.layout_vehicle_details, null);

final MaterialEditText edtYear = vehicle_details.findViewById(R.id.year);
final MaterialEditText edtCMNM = vehicle_details.findViewById(R.id.cmnm);
final MaterialEditText edtPlate = vehicle_details.findViewById(R.id.plate);

alert_dialog.setView(vehicle_details);

alert_dialog.setPositiveButton("SUBMIT", new DialogInterface.OnClickListener() {
    @Override
    public void onClick(final DialogInterface dialog, int which) {


        // check validation
        if (TextUtils.isEmpty(edtYear.getText().toString())) {
            Snackbar.make(rootLayout, "Please enter year of your vehicle", Snackbar
                    .LENGTH_SHORT).show();

            return;
        }

        if (TextUtils.isEmpty(edtCMNM.getText().toString())) {
            Snackbar.make(rootLayout, "Please enter the Color, Make and Model of your vehicle",
                    Snackbar.LENGTH_SHORT).show();

            return;
        }

        if (TextUtils.isEmpty(edtPlate.getText().toString())) {
            Snackbar.make(rootLayout, "Please enter your license plate number", Snackbar
                    .LENGTH_SHORT).show();

            return;
        }

        // save to firebase/ Users/Drivers ...

        details = users;
        details.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot snapshot) {
                // get drivers id
                for (DataSnapshot ss : snapshot.getChildren()) {
                    String id = ss.getKey();

                    String year = edtYear.getText().toString();
                    String cmnm = edtCMNM.getText().toString();
                    String plate = edtPlate.getText().toString();

                    Log.e(TAG, "year: " + year + ", cmnm: " + cmnm + ", plate: " + plate);

                    // data sent
                    details.child(id).child("year").setValue(year);
                    details.child(id).child("cmnm").setValue(cmnm);
                    details.child(id).child("plate").setValue(plate);
                }
                 showRegisterDialog();
                 dialog.dismiss();

            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
    }
});
AlertDialog dialog = alert_dialog.create();
dialog.show();}

以下是您将要更改的修正 关于 showRegisterDialogue :

final AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("REGISTER");
builder.setMessage("Please use email to register");
LayoutInflater inflater = LayoutInflater.from(this);
View register_layout = inflater.inflate(R.layout.layout_register, null);

final MaterialEditText edtEmail = register_layout.findViewById(R.id.email);
final MaterialEditText edtPassword = register_layout.findViewById(R.id.password);
final MaterialEditText edtName = register_layout.findViewById(R.id.usersname);
final MaterialEditText edtPhone = register_layout.findViewById(R.id.cell);

final MaterialAnimatedSwitch policies_switch = register_layout.findViewById(R.id.policies_switch);

builder.setView(register_layout);

builder.setPositiveButton("REGISTER", new DialogInterface.OnClickListener() {
    @Override
    public void onClick(final DialogInterface dialog, int which) {

        // check validation
        if (TextUtils.isEmpty(edtEmail.getText().toString())) {
            Snackbar.make(rootLayout, "Please enter email address", Snackbar
                    .LENGTH_SHORT).show();

            return;
        }

        if (TextUtils.isEmpty(edtPhone.getText().toString())) {
            Snackbar.make(rootLayout, "Please enter phone number", Snackbar
                    .LENGTH_SHORT).show();

            return;
        }

        if (TextUtils.isEmpty(edtPassword.getText().toString())) {
            Snackbar.make(rootLayout, "Please enter password", Snackbar
                    .LENGTH_SHORT).show();

            return;
        }

        if (edtPassword.getText().toString().length() < 6) {
            Snackbar.make(rootLayout, "Password too short !!!", Snackbar
                    .LENGTH_SHORT).show();

            return;
        }


        // Register new user
        auth.createUserWithEmailAndPassword(edtEmail.getText().toString(),
                edtPassword.getText().toString())
                .addOnSuccessListener(new OnSuccessListener<AuthResult>() {
                    @Override
                    public void onSuccess(AuthResult authResult) {
                        // Save user to db
                        Driver driver = new Driver();
                        driver.setEmail(edtEmail.getText().toString());
                        driver.setUsersname(edtName.getText().toString());
                        driver.setCell(edtPhone.getText().toString());
                        driver.setPassword(edtPassword.getText().toString());
                        driver.setRates("4.5"); // TODO: Default added

                        // use uid to key
                        users.child(FirebaseAuth.getInstance().getCurrentUser().getUid())
                                .setValue(driver)
                                .addOnSuccessListener(new OnSuccessListener<Void>() {
                                    @Override
                                    public void onSuccess(Void aVoid) {
                                        Snackbar.make(rootLayout, "Registration successful !!!",
                                                Snackbar.LENGTH_SHORT).show();
                                        dialog.dismiss();
                                    }
                                })

                                .addOnFailureListener(new OnFailureListener() {
                                    @Override
                                    public void onFailure(@NonNull Exception e) {
                                        Snackbar.make(rootLayout, "Failed" + e.getMessage(),
                                                Snackbar.LENGTH_SHORT).show();
                                        dialog.dismiss();
                                    }
                                });
                    }
                })

                .addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        Snackbar.make(rootLayout, "Failed" + e.getMessage(),
                                Snackbar.LENGTH_SHORT).show();
                                        dialog.dismiss();
                    }
                });
    }
});

builder.setNegativeButton("CANCEL", new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        dialog.dismiss();
    }
});

final AlertDialog dialog = builder.create();

/* If switch is on, enable REGISTER button */
policies_switch.setOnCheckedChangeListener(new MaterialAnimatedSwitch.OnCheckedChangeListener() {
    @Override
    public void onCheckedChanged(boolean isChecked) {
        if (isChecked) {
            dialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(true); // if checked, enable
        }
    }
});

dialog.show();

dialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false); // set disabled by default

 }

对于 ClickListener,您只需删除 showRegisterDialogue,它会是这样的

btnRegister.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        showVehicleDetails();
    }
});

【讨论】:

  • 我已经尝试清理和重建项目,但当我单击注册时,对话框仍然没有消失。它显示了一个成功的小吃店,并将数据添加到 firebase。有什么想法吗?
  • 这是driver.setRates("4.5"); 之后的一个想法,添加dialog.dismiss(); 试试,让我知道@LizG 发生了什么
  • 相同,没有区别
【解决方案2】:

为此,我将使用 2 个自定义对话框类。

每个对话框都有他的类和布局,现在我们需要这样做:

  • 显示对话框 A

  • 向firebase发送一些数据并等待回调

  • 在我们从对话框 A 获得回调后,关闭它并显示第二个对话框。

听起来不错?让我们看看我们是怎么写的:


这是一个通用自定义对话框的示例:

这将是您的对话框类(或类似的东西,这只是一个示例):

public class FullSizeImageDialog extends Dialog {
private ImageView imageView;
private ProgressBar fullImageProgreesBar;
private Context dialogContext;

public FullSizeImageDialog(@NonNull Context context) {
    super(context);
    setContentView(R.layout.full_size_image_dialog);
    dialogContext = context;
    imageView = findViewById(R.id.full_size_image);
    fullImageProgreesBar = findViewById(R.id.fullImageProgreesBar);
    }
}

这是你的对话框布局(在我的例子中是R.id.full_size_image):

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  android:layout_width="match_parent"
  android:layout_height="match_parent">


 <!--Place your views here-->


 </android.support.constraint.ConstraintLayout>

当你想显示你的对话框时,它超级简单:

FullSizeImageDialog dialog = new FullSizeImageDialog ();
dialog.show();

当第一个对话框将从 firebase 调用 dismiss() 获取对话框 A 和 show() 用于对话框 B 的回调时。


为什么我推荐使用这个而不是AlertDialog.Builder

  • 您可以使用自定义对话框更快地构建布局。

  • 当您可以拥有自定义布局时,无需编写大量代码来添加视图。

  • 你更容易(或者我相信)看到myCoolDialog.show();,而不是在一个方法中看到 50 行或更多的代码。

  • 您是否需要更改有关对话框外观和代码的任何内容?好的,去你的单独的类并改变它,而不是在你的活动中添加 20 多行代码。

【讨论】:

  • 感谢@Tamir 提供的新方法,但我想保留它,因为它与我在整个应用程序中的对话框一致。下次创建对话框时,我一定会记住这一点:-)
猜你喜欢
  • 2023-03-13
  • 2020-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多