如何从实时数据库中获取用户名并将其显示在导航 header 中?
How can I get username from real time database and show it in navigation header?
在注册活动中注册按钮
public void registerBtnClicked(View view){
String email = binding.userEmailEditText.getText().toString();
String password = binding.userPasswordEditText.getText().toString();
String userNameData = binding.usernameEditText.getText().toString();
user = new Users(userNameData,email,password);
db = FirebaseDatabase.getInstance();
databaseReference = db.getReference(Users.class.getSimpleName());
databaseReference.push().setValue(user);
if(email.equals("") || password.equals("")){
Toast.makeText(this, "Enter email and password", Toast.LENGTH_LONG).show();
}else{
auth.createUserWithEmailAndPassword(email,password).addOnSuccessListener(new OnSuccessListener<AuthResult>() {
@Override
public void onSuccess(AuthResult authResult) {
Intent intent = new Intent(RegisterPage.this, MainActivity.class);
startActivity(intent);
finish();
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(RegisterPage.this, e.getLocalizedMessage(),Toast.LENGTH_LONG).show();
}
});
}
}
我创建了一个实时 database.But 我不知道如何在导航 header 部分显示用户名。你能帮帮我吗?
如果我理解正确,当您尝试从中读取显示名称时,firebaseUser
为空。这其实是一个常见的场景,因为用户的sign-in会话是由Firebase在后台管理的,当前用户随时可能发生变化。
简单的解决方法是在访问他们的显示名称之前检查是否有当前用户,您可以这样做:
firebaseUser = FirebaseAuth.getInstance().getCurrentUser();
if (firebaseUser != null) {
navUserEmail.setText(firebaseUser.getEmail());
navUserName.setText(firebaseUser.getDisplayName());
}
请注意,显示名称是用户配置文件的可选 属性,因此它确实可以是 null
。如果你不想在这种情况下显示任何内容,你可以这样做:
String displayName = firebaseUser.getDisplayName();
navUserName.setText(displayName != null ? displayName : "");
即使您设置了用户的显示名称,也最多可能需要一个小时才能为所有连接的客户端更新该名称,因为它们都缓存了用户配置文件。由于此类更新发生在后台...
要正确处理所有身份验证状态更改,您需要使用身份验证状态侦听器,如本文所示:https://whosebug.com/collectives/google-cloud/articles/68104924/listen-for-authentication-state-in-android
在注册活动中注册按钮
public void registerBtnClicked(View view){
String email = binding.userEmailEditText.getText().toString();
String password = binding.userPasswordEditText.getText().toString();
String userNameData = binding.usernameEditText.getText().toString();
user = new Users(userNameData,email,password);
db = FirebaseDatabase.getInstance();
databaseReference = db.getReference(Users.class.getSimpleName());
databaseReference.push().setValue(user);
if(email.equals("") || password.equals("")){
Toast.makeText(this, "Enter email and password", Toast.LENGTH_LONG).show();
}else{
auth.createUserWithEmailAndPassword(email,password).addOnSuccessListener(new OnSuccessListener<AuthResult>() {
@Override
public void onSuccess(AuthResult authResult) {
Intent intent = new Intent(RegisterPage.this, MainActivity.class);
startActivity(intent);
finish();
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(RegisterPage.this, e.getLocalizedMessage(),Toast.LENGTH_LONG).show();
}
});
}
}
我创建了一个实时 database.But 我不知道如何在导航 header 部分显示用户名。你能帮帮我吗?
如果我理解正确,当您尝试从中读取显示名称时,firebaseUser
为空。这其实是一个常见的场景,因为用户的sign-in会话是由Firebase在后台管理的,当前用户随时可能发生变化。
简单的解决方法是在访问他们的显示名称之前检查是否有当前用户,您可以这样做:
firebaseUser = FirebaseAuth.getInstance().getCurrentUser();
if (firebaseUser != null) {
navUserEmail.setText(firebaseUser.getEmail());
navUserName.setText(firebaseUser.getDisplayName());
}
请注意,显示名称是用户配置文件的可选 属性,因此它确实可以是 null
。如果你不想在这种情况下显示任何内容,你可以这样做:
String displayName = firebaseUser.getDisplayName();
navUserName.setText(displayName != null ? displayName : "");
即使您设置了用户的显示名称,也最多可能需要一个小时才能为所有连接的客户端更新该名称,因为它们都缓存了用户配置文件。由于此类更新发生在后台...
要正确处理所有身份验证状态更改,您需要使用身份验证状态侦听器,如本文所示:https://whosebug.com/collectives/google-cloud/articles/68104924/listen-for-authentication-state-in-android