【发布时间】: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