我的 activity 完成并导航到前一个 activity 而没有必要的代码
My activity finishes and navigates to the previous activity without the necessary code for that
我遇到了一个奇怪的问题,我正在尝试刷新当前的 activity 所以我传递了与两个意图参数相同的 activity
Intent intent = new Intent(Profile_Page_Activity.this, Profile_Page_Activity.class);
然后 finish();
之后出现,所以我不会同时拥有相同 activity 运行ning 的两个实例,但是当我 运行 是的,它首先显示了来自完全不同的 activity 的祝酒词,它在之前的活动中排在第二位,既不会导致当前的 activity,也不会导致当前的 activity 导致它,显示的 toast 不是来自当前的 activity,然后它继续到前一个 activity,最后到当前的 activity 我希望它导航到,就像它识别意图代码之前的 finish();
代码一样,但我知道某处有问题,因为我肯定在 Intent intent = new Intent(Profile_Page_Activity.this, Profile_Page_Activity.class); startActivity(intent);
之后提供了 finish()
这是包含我遇到问题的代码点的方法
private void Updatecredentials2(String textfullname, String textUsername, String textemail, String text_del_phone, String textAddress, String stateAddress, String townAddress) {
DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("Users");
HashMap<String, Object> userdata = new HashMap<>();
userdata.put("email", textemail);
userdata.put("name", textfullname);
userdata.put("username", textUsername);
userdata.put("delieveryphone", "+234" + text_del_phone);
userdata.put("address", textAddress);
userdata.put("State", stateAddress);
userdata.put("Town", townAddress);
databaseReference.child(path).updateChildren(userdata).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if (task.isSuccessful()) {
Toast.makeText(Profile_Page_Activity.this, "Credentials updated successfully", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(Profile_Page_Activity.this, Profile_Page_Activity.class);
startActivity(intent);
finish();
} else {
Toast.makeText(Profile_Page_Activity.this, "Credentials update was unsuccessful", Toast.LENGTH_SHORT).show();
}
}
});
}
这个方法引出了上面的方法
private void validateupdate2() {
final String textfullname = fullname.getText().toString();
final String textUsername = username.getText().toString();
final String textemail = email.getText().toString();
final String text_del_phone = del_phone.getText().toString();
final String textAddress = address.getText().toString();
final String stateAddress = state.getSelectedItem().toString();
final String townAddress = town_et.getText().toString();
if (TextUtils.isEmpty(textfullname) || TextUtils.isEmpty(textUsername) || TextUtils.isEmpty(textemail) || TextUtils.isEmpty(text_del_phone) || TextUtils.isEmpty(textAddress)) {
Toast.makeText(Profile_Page_Activity.this, "Please fill out all fields", Toast.LENGTH_SHORT).show();
} else {
DatabaseReference cred_check = FirebaseDatabase.getInstance().getReference("Usernames");
cred_check.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
for(DataSnapshot suu : snapshot.getChildren()){
if(suu.getValue().toString().equalsIgnoreCase(Prevalent.currentOnlineUser.getUsername())){
continue;
}
if(suu.getValue().toString().equalsIgnoreCase(textUsername)){
Toast.makeText(Profile_Page_Activity.this, "Username is taken, please provide another one", Toast.LENGTH_SHORT).show();
}else{
Updatecredentials2(textfullname, textUsername, textemail, text_del_phone, textAddress, stateAddress, townAddress);
break;
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
}
}
这是完全不同 activity 的方法,它包含在我的应用程序中显示的 toast,“已登录”toast 是显示
private void Allowaccess(final String useremail, final String userpassword) {
final DatabaseReference cref;
cref = FirebaseDatabase.getInstance().getReference("Users");
cref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
String email = useremail;
String password = userpassword;
if (snapshot.hasChild(email.replace(".", " "))) {
Users userdata = snapshot.child(email.replace(".", " ")).getValue(Users.class);
if (snapshot.child(email.replace(".", " ")).child("password").getValue().toString().equals(password)) {
Toast.makeText(MainActivity.this, "Already Logged in", Toast.LENGTH_SHORT).show();
startActivity(new Intent(MainActivity.this, HomeActivity2.class));
Prevalent.currentOnlineUser = userdata;
finish();
} else {
Toast.makeText(MainActivity.this, "Your password might have changed since your last login.", Toast.LENGTH_SHORT).show();
startActivity(new Intent(MainActivity.this, Login_Activity.class));
finish();
}
} else {
Toast.makeText(MainActivity.this, "User does not exist", Toast.LENGTH_SHORT).show();
startActivity(new Intent(MainActivity.this, Login_Activity.class));
finish();
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
}
关于 Allowaccess
方法的问题 - 似乎只要您在 firebase 数据库中更新某些内容,就会触发此方法中的侦听器。在 Profile_Page_Activity
上执行 databaseReference.child(path).updateChildren(userdata)
,这可能会触发任何已注册的侦听器,例如 Allowaccess
方法中的 cref.addValueEventListener
。所以解决方案是在您成功登录后删除 ValueEventListener
,这样就不会向它传递任何其他更改。
关于刷新你的 activity,我认为更合适的方法是在你想刷新你的 activity 时调用 recreate()
方法。
要刷新 activity,您应该调用 recreate()
方法
我遇到了一个奇怪的问题,我正在尝试刷新当前的 activity 所以我传递了与两个意图参数相同的 activity
Intent intent = new Intent(Profile_Page_Activity.this, Profile_Page_Activity.class);
然后 finish();
之后出现,所以我不会同时拥有相同 activity 运行ning 的两个实例,但是当我 运行 是的,它首先显示了来自完全不同的 activity 的祝酒词,它在之前的活动中排在第二位,既不会导致当前的 activity,也不会导致当前的 activity 导致它,显示的 toast 不是来自当前的 activity,然后它继续到前一个 activity,最后到当前的 activity 我希望它导航到,就像它识别意图代码之前的 finish();
代码一样,但我知道某处有问题,因为我肯定在 Intent intent = new Intent(Profile_Page_Activity.this, Profile_Page_Activity.class); startActivity(intent);
finish()
这是包含我遇到问题的代码点的方法
private void Updatecredentials2(String textfullname, String textUsername, String textemail, String text_del_phone, String textAddress, String stateAddress, String townAddress) {
DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("Users");
HashMap<String, Object> userdata = new HashMap<>();
userdata.put("email", textemail);
userdata.put("name", textfullname);
userdata.put("username", textUsername);
userdata.put("delieveryphone", "+234" + text_del_phone);
userdata.put("address", textAddress);
userdata.put("State", stateAddress);
userdata.put("Town", townAddress);
databaseReference.child(path).updateChildren(userdata).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if (task.isSuccessful()) {
Toast.makeText(Profile_Page_Activity.this, "Credentials updated successfully", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(Profile_Page_Activity.this, Profile_Page_Activity.class);
startActivity(intent);
finish();
} else {
Toast.makeText(Profile_Page_Activity.this, "Credentials update was unsuccessful", Toast.LENGTH_SHORT).show();
}
}
});
}
这个方法引出了上面的方法
private void validateupdate2() {
final String textfullname = fullname.getText().toString();
final String textUsername = username.getText().toString();
final String textemail = email.getText().toString();
final String text_del_phone = del_phone.getText().toString();
final String textAddress = address.getText().toString();
final String stateAddress = state.getSelectedItem().toString();
final String townAddress = town_et.getText().toString();
if (TextUtils.isEmpty(textfullname) || TextUtils.isEmpty(textUsername) || TextUtils.isEmpty(textemail) || TextUtils.isEmpty(text_del_phone) || TextUtils.isEmpty(textAddress)) {
Toast.makeText(Profile_Page_Activity.this, "Please fill out all fields", Toast.LENGTH_SHORT).show();
} else {
DatabaseReference cred_check = FirebaseDatabase.getInstance().getReference("Usernames");
cred_check.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
for(DataSnapshot suu : snapshot.getChildren()){
if(suu.getValue().toString().equalsIgnoreCase(Prevalent.currentOnlineUser.getUsername())){
continue;
}
if(suu.getValue().toString().equalsIgnoreCase(textUsername)){
Toast.makeText(Profile_Page_Activity.this, "Username is taken, please provide another one", Toast.LENGTH_SHORT).show();
}else{
Updatecredentials2(textfullname, textUsername, textemail, text_del_phone, textAddress, stateAddress, townAddress);
break;
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
}
}
这是完全不同 activity 的方法,它包含在我的应用程序中显示的 toast,“已登录”toast 是显示
private void Allowaccess(final String useremail, final String userpassword) {
final DatabaseReference cref;
cref = FirebaseDatabase.getInstance().getReference("Users");
cref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
String email = useremail;
String password = userpassword;
if (snapshot.hasChild(email.replace(".", " "))) {
Users userdata = snapshot.child(email.replace(".", " ")).getValue(Users.class);
if (snapshot.child(email.replace(".", " ")).child("password").getValue().toString().equals(password)) {
Toast.makeText(MainActivity.this, "Already Logged in", Toast.LENGTH_SHORT).show();
startActivity(new Intent(MainActivity.this, HomeActivity2.class));
Prevalent.currentOnlineUser = userdata;
finish();
} else {
Toast.makeText(MainActivity.this, "Your password might have changed since your last login.", Toast.LENGTH_SHORT).show();
startActivity(new Intent(MainActivity.this, Login_Activity.class));
finish();
}
} else {
Toast.makeText(MainActivity.this, "User does not exist", Toast.LENGTH_SHORT).show();
startActivity(new Intent(MainActivity.this, Login_Activity.class));
finish();
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
}
关于 Allowaccess
方法的问题 - 似乎只要您在 firebase 数据库中更新某些内容,就会触发此方法中的侦听器。在 Profile_Page_Activity
上执行 databaseReference.child(path).updateChildren(userdata)
,这可能会触发任何已注册的侦听器,例如 Allowaccess
方法中的 cref.addValueEventListener
。所以解决方案是在您成功登录后删除 ValueEventListener
,这样就不会向它传递任何其他更改。
关于刷新你的 activity,我认为更合适的方法是在你想刷新你的 activity 时调用 recreate()
方法。
要刷新 activity,您应该调用 recreate()
方法