![](/img/trans.png)
[英]OnCreate and onActivityResult called when I finish the activity for result
[英]onCreate() is not running when i switch to the activity or onDataChanged is getting called first
我正在做一個學校項目,我正在使用 firebase 身份驗證和 email 和密碼。 我在用戶唱歌時遇到問題,然后返回到唱歌頁面並嘗試創建一個新帳戶。 當單擊提交按鈕以創建他的新帳戶而不是返回登錄頁面時,它會轉到用戶主頁。 只有當用戶已經登錄然后嘗試注冊另一個帳戶時才會發生這種情況。 當他返回登錄頁面時,我嘗試將用戶注銷,但它沒有用。 這是我的代碼:
登錄頁面:
public class SignIn extends AppCompatActivity {
EditText email,pass;
private FirebaseAuth mAuth;
FirebaseUser user;
FirebaseDatabase db;
DatabaseReference mRef;
String type,name;
public ProgressDialog pd;
Context context;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sign_in);
mAuth = FirebaseAuth.getInstance();
email = findViewById(R.id.inpSigninEmail);
pass = findViewById(R.id.inpSigninPass);
db.getInstance();
mRef = FirebaseDatabase.getInstance().getReference().child("Users/");
type=null;
name=null;
context=this;
Log.e("asd","Loginoncreate");
}
public void signIn (View view){
if (email.getText().toString().trim().length() < 1 || pass.getText().toString().trim().length() < 1){
Toast.makeText(getApplicationContext(), "Please fill your information.", Toast.LENGTH_LONG).show();
}else{
pd = new ProgressDialog(this);
pd.setMessage("Signing in...");
pd.show();
mAuth.signInWithEmailAndPassword(email.getText().toString(), pass.getText().toString()).addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()){
user = mAuth.getCurrentUser();
mRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
while (type==null){
for (DataSnapshot dataSnapshot : snapshot.getChildren()){
type = String.valueOf(dataSnapshot.child(user.getUid()).child("/Type").getValue());
if (type!="null"){
break;
}
}
}
while (name==null){
for (DataSnapshot dataSnapshot : snapshot.getChildren()){
name = String.valueOf(dataSnapshot.child(user.getUid()).child("/Name").getValue());
if (name!="null"){
break;
}
}
}
pd.dismiss();
if (type.matches("user")){
Intent intent = new Intent(context, UserMain.class);
intent.putExtra("name", name);
type=null;
name=null;
startActivity(intent);
finish();
Log.e("as","loginUser");
}else{
Intent intent = new Intent(context, CompanyMain.class);
intent.putExtra("name", name);
startActivity(intent);
finish();
type=null;
name=null;
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
pd.dismiss();
Toast.makeText(getApplicationContext(), error.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}else{
pd.dismiss();
Toast.makeText(getApplicationContext(), task.getException().getMessage(),Toast.LENGTH_LONG).show();
}
}
});
}
}
public void signUp (View view){
startActivity(new Intent(SignIn.this, SignUp.class));
finish();
}
}
注冊頁面:
public class SignUp extends AppCompatActivity {
EditText name,email,pass;
private FirebaseAuth mAuth;
FirebaseDatabase db;
FirebaseUser user;
RadioButton Rbtn;
RadioGroup Rgroup;
DatabaseReference mRef;
boolean out = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sign_up);
mAuth = FirebaseAuth.getInstance();
name = findViewById(R.id.inpSignupName);
email = findViewById(R.id.inpSignupEmail);
pass = findViewById(R.id.inpSignupPass);
Rgroup = findViewById(R.id.radioGroup);
db = FirebaseDatabase.getInstance();
mRef = db.getReference("Users/");
Log.e("asd","Signuponcreate");
}
public void submit (View view){
if (name.getText().toString().trim().length() < 1 || email.getText().toString().trim().length() < 1 || pass.getText().toString().trim().length() < 1){
Toast.makeText(getApplicationContext(), "Please fill your information.", Toast.LENGTH_LONG).show();
}else{
mAuth.createUserWithEmailAndPassword(email.getText().toString() , pass.getText().toString()).addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()){
Toast.makeText(getApplicationContext(),"Sign Up success!",Toast.LENGTH_LONG).show();
user = mAuth.getCurrentUser();
int radioId = Rgroup.getCheckedRadioButtonId();
Rbtn = findViewById(radioId);
if (Rbtn.getText().equals("User")){
mRef.child("/Normal").child(user.getUid()).child("/Name").setValue(name.getText().toString());
mRef.child("/Normal").child(user.getUid()).child("/Type").setValue("user");
}else{
mRef.child("/Company").child(user.getUid()).child("/Name").setValue(name.getText().toString());
mRef.child("/Company").child(user.getUid()).child("/Type").setValue("company");
}
startActivity(new Intent(SignUp.this, SignIn.class));
finish();
Log.e("as","signupUserGotoSignin");
}else{
Toast.makeText(getApplicationContext(), task.getException().getMessage(),Toast.LENGTH_LONG).show();
}
}
});
}
}
}
這是我的日志:
E/asd: Loginoncreate(這是我看到的第一條消息,當我啟動應用程序時,我登錄並 go 到用戶主頁)
E/as: loginUser (當我第一次登錄時打開並 go 到用戶主頁)
E/asd: Loginoncreate (當我從用戶主頁返回時)
E/asd: Signuponcreate (i go 創建一個新賬戶)
E/as:signupUserGotoSignin(我創建了帳戶並想返回登錄頁面)
E/as:loginUser(在這里我希望再次出現 Loginoncreate 消息,但我從來沒有收到,我總是收到此消息 2 次。此消息是 onDataChanged) E/as:loginUser
在我單擊提交按鈕創建新帳戶后,它永遠不會返回登錄頁面。 我知道 firebase 是異步的,但我不知道我在這里做錯了什么。 為什么登錄頁面上的 onCreate 永遠不會被調用,它會立即進入 onDataChanged 並將我帶到用戶主頁?
我假設登錄(查看視圖)方法是您的登錄按鈕單擊事件。 所以,
首先,您需要從按鈕 XML 代碼中刪除onClick屬性。
android:onClick="signIn"
然后,在 onCreate() 方法中創建 onClick 按鈕事件。
喜歡,
Button button = findViewById(R.id.SignInbutton);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//put your signIn button all code here
}
});
在注冊頁面活動中也是如此。
好的,所以我將所有內容放在 onDataChange 中的 If 語句下,我在其中檢查 temp 變量是否為真,並且在我將用戶移動到用戶主頁之前,我將該變量設為假。 這解決了我的問題,但如果有人解釋為什么會發生這種情況,我仍然會很感激。 謝謝
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.