2017-01-10 33 views
0

MainActivity中包含的我的導航窗格導航到多個片段。在這些片段類的onCreate方法,我試圖onAuthStateChanged來獲得當前用戶:FirebaseAuth.AuthStateListener未在片段類中調用

FirebaseAuth.AuthStateListener mAuthListener; 
... 
public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
mAuthListener = new FirebaseAuth.AuthStateListener() { 
     @Override 
     public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { 
      user = firebaseAuth.getCurrentUser(); 
      if (user != null) { 
       Log.e(TAG, "onAuthStateChanged:signed_in" + user.getUid()); 

      } else { //user is not logged in 

       Log.e(TAG, "onAuthStateChanged:signed_out"); 

      } 

     } 
    }; 
    } 

onAuthStateChanged永遠不會被調用。 類似的代碼在MainActivity工作得很好。我曾嘗試在片段的onCreateView()onResume()方法中調用此代碼,但沒有任何反應。 爲了解決這個問題,並獲得當前用戶,我創建在MainActivity的方法:

public FirebaseUser getFirebaseUser() { 
    return user; 
} 

,然後做所謂的碎片類中的方法:

FirebaseUser user = ((MainActivity) getActivity()).getFirebaseUser(); 

if (user != null) { 
      Log.e(TAG, "onAuthStateChanged:signed_in" + user.getUid()); 

     } else { //user is not logged in 

      Log.e(TAG, "onAuthStateChanged:signed_out"); 

     } 

,一切工作就好了。 我的問題是,我爲什麼不能叫

mAuthListener = new FirebaseAuth.AuthStateListener() { 
    @Override 
    public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { 
     ... 
從我的片段類

+0

曾嘗試從片段的'onViewCreated'打電話呢? –

+0

也可能是因爲FirebaseAuth對象沒有本地實例。 –

+0

還有一個本地實例。這就是爲什麼從容器活動中獲取用戶的原因 –

回答

3

感謝@ArnisShaykh,我發現我沒有打電話:

public void onStart(){ 
    super.onStart(); 
    firebaseAuth.addAuthStateListener(mAuthListener); //firebaseAuth is of class FirebaseAuth 
} 

片段中的類。

記得還補充:

@Override 
public void onStop() { 
    super.onStop(); 
    if (mAuthListener != null) { 
     firebaseAuth.removeAuthStateListener(mAuthListener); 
    } 
}