[英]Displaying one alert dialog, dismissing and displaying another alert dialog
我正在創建一個注冊布局。 因為要放在一個布局中的信息太多,所以我需要使用兩個
當用戶選擇REGISTER
按鈕時,我想顯示布局 1,將數據保存到 firebase,然后當他們選擇肯定按鈕時,它會關閉布局 1 並顯示布局 2。
我怎樣才能做到這一點?
我有兩個對話框:
顯示車輛詳情
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();
}
顯示注冊對話框
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();
}
});
這就是當我按下注冊按鈕時發生的情況,它堅持這個而不是關閉
好吧,我不推薦它像這樣,我更喜歡它像@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();
}
});
為此,我將使用 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 獲得回調時,為對話框 A 調用調用dismiss()
和為對話框B 調用show()
。
為什么我建議使用這個而不是AlertDialog.Builder
:
您可以使用自定義對話框以更快的方式構建布局。
當您可以擁有自定義布局時,無需編寫大量代碼來添加視圖。
你更容易(或者我相信)看到myCoolDialog.show();
而不是單個方法中的 50 行或更多代碼。
您需要更改有關對話框外觀和代碼的任何內容嗎? 好的,轉到您單獨的課程並對其進行更改,而不是在您的活動中再添加 20 行代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.