簡體   English   中英

當我切換到活動或首先調用 onDataChanged 時,onCreate() 未運行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM