Java 来自firebase rt dababase的数据在屏幕上消失的文本视图
我正在尝试从数据库中获取用户名,并将其设置为屏幕上的文本。 我有3个活动和片段对象 第一个活动是Java 来自firebase rt dababase的数据在屏幕上消失的文本视图,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我正在尝试从数据库中获取用户名,并将其设置为屏幕上的文本。 我有3个活动和片段对象 第一个活动是RegisterActivity。用户插入电子邮件和密码并单击“下一步”按钮后,将出现一个弹出窗口,其中包含用户详细信息的输入字段 用户应填写所有字段并单击“保存”按钮。 对于保存按钮的OnClick操作,所有用户详细信息都会写入实时数据库 在主活动中,我想显示数据库中的用户名。 在调试模式下,我获得用户名,但它不会显示在TextView(private TextView mWelcomeText)上
RegisterActivity
。用户插入电子邮件和密码并单击“下一步”按钮后,将出现一个弹出窗口,其中包含用户详细信息的输入字段
用户应填写所有字段并单击“保存”按钮。
对于保存按钮的OnClick
操作,所有用户详细信息都会写入实时数据库
在主活动中,我想显示数据库中的用户名。
在调试模式下,我获得用户名,但它不会显示在TextView
(private TextView mWelcomeText
)上
以下是我所做的:
package com.enjoyapp.weddapp.Activities;
public class MainActivity extends AppCompatActivity {
private TextView mWelcomeText;
private String mGreetings;
private String mDisplayName;
private FirebaseAuth mAuth;
private FirebaseDatabase db;
private DatabaseReference users;
private MethodManager mm;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mAuth = FirebaseAuth.getInstance();
db = FirebaseDatabase.getInstance();
users = db.getReference("Users");
mWelcomeText = findViewById(R.id.mWelcomeText);
bottomNavigationView = findViewById(R.id.bottom_navigation);
bottomNavigationView.setOnNavigationItemSelectedListener(navListener);
getDataFromUsersDetails();
mWelcomeText.setText(mDisplayName);
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new HomeFragment())
.commit();
}
private BottomNavigationView.OnNavigationItemSelectedListener navListener =
new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
Fragment selectedFragment = null;
switch (menuItem.getItemId()) {
case R.id.nav_home:
selectedFragment = new HomeFragment();
break;
case R.id.nav_favorites:
selectedFragment = new FavoritesFragment();
break;
case R.id.nav_search:
selectedFragment = new SearchFragment();
break;
}
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, selectedFragment)
.commit();
return true;
}
};
public void getDataFromUsersDetails() {
ValueEventListener eventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot ds : dataSnapshot.getChildren()) {
mDisplayName = ds.child(mAuth.getCurrentUser().getUid()).child("mEventOwnerName").getValue(String.class);
Log.d("Database reader", mDisplayName);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
};
users.addListenerForSingleValueEvent(eventListener);
}
public String getGreetings() {
mm = new MethodManager();
if (mm.getTime() >= 6 && mm.getTime() < 12) {
return "Good morning";
} else if (mm.getTime() >= 12 && mm.getTime() < 18) {
return "Good afternoon";
} else if (mm.getTime() >= 18 && mm.getTime() < 22) {
return "Good evening";
} else if (mm.getTime() >= 22 && mm.getTime() < 6) {
return "Good night";
}
return null;
}
}
mWelcomeText=findviewbyd(R.id.mWelcomeText)
mWelcomeText.setText(user.setGreetingsOnTop());
公共字符串设置greetingsontop(){
MethodManager mm=新的MethodManager();
字符串=null;
如果(mm.getTime()>=6&&mm.getTime()<12){
问候语=“早上好”;
}else如果(mm.getTime()>=12&&mm.getTime()<18){
问候语=“下午好”;
}else如果(mm.getTime()>=18&&mm.getTime()<22){
问候语=“晚上好”;
}else如果(mm.getTime()>=22&&mm.getTime()<6){
问候语=“晚安”;
}
返回getmDisplayName()+“”+问候语;
}
我想请您看看这两行主要活动
getDataFromUsersDetails();
mWelcomeText.setText(mDisplayName); //mDisplayName is null initially
getDataFromUsersDetails正在使用valueEventListener进行异步调用。当响应到来时,您正在将该值分配给mDisplayName,但它不会在textView中更新
在For循环中,需要显式更新
mWelcomeText.setText(mDisplayName)代码>您必须更新valueEventListener中的textview
for (DataSnapshot ds : dataSnapshot.getChildren()) {
mDisplayName = ds.child(mAuth.getCurrentUser().getUid()).child("mEventOwnerName").getValue(String.class);
Log.d("Database reader", mDisplayName);
mWelcomeText.setText(mDisplayName);//here
}
请发布数据库结构android:text=”“
它是设置为textView.mWelcomeText.setText(mDisplayName)的硬编码值;将这一行移到getDataFromUsersDetails循环的内部。请将您的数据库结构置于编辑您的问题的位置,如果名称不为空,您是否检查了日志?嘿,这对我来说非常有效,非常感谢。现在我稍微修改了代码,添加了splash活动,在主活动开始之前从firebase数据库中获取数据(否则,显示文本(mWelcomeText.setText(mDisplayName))大约需要3秒钟)。在splash活动中,添加了函数(getDataFromUsersDetails())。在函数中,我创建了一个用户对象,而不是setText(mDisplayName)。然后在主活动中执行user.getText并获取null。知道为什么吗?主目录中的新代码表明您的代码格式不可读。您正在混合不同活动的代码。为此添加新问题。
getDataFromUsersDetails();
mWelcomeText.setText(mDisplayName); //mDisplayName is null initially
for (DataSnapshot ds : dataSnapshot.getChildren()) {
mDisplayName = ds.child(mAuth.getCurrentUser().getUid()).child("mEventOwnerName").getValue(String.class);
Log.d("Database reader", mDisplayName);
mWelcomeText.setText(mDisplayName);//here
}