我正在尝试从数据库中获取用户名,并将其设置为屏幕上的文本。
我有3个Activity和Fragment对象。
第一个活动是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;
}
}
我希望文本显示在屏幕上的
private TextView mWelcomeText
字段中。在
layout_main
中,我可以使用以下工具查看文本视图:text="something";
但是,当我在真实设备或仿真器上运行它时,只会出现一个空的地方。
更新:
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);
user = new User();
user.setmDisplayName(mDisplayName);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
};
users.addListenerForSingleValueEvent(eventListener);
}
mWelcomeText = findViewById(R.id.mWelcomeText);
mWelcomeText.setText(user.setGreetingsOnTop());
public String setGreetingsOnTop(){
MethodManager mm = new MethodManager();
String greetings = null;
if (mm.getTime() >= 6 && mm.getTime() < 12) {
greetings = "Good morning";
} else if (mm.getTime() >= 12 && mm.getTime() < 18) {
greetings = "Good afternoon";
} else if (mm.getTime() >= 18 && mm.getTime() < 22) {
greetings = "Good evening";
} else if (mm.getTime() >= 22 && mm.getTime() < 6) {
greetings = "Good night";
}
return getmDisplayName() +""+greetings;
}
最佳答案
我要求您看一下这两个主要活动行。
getDataFromUsersDetails();
mWelcomeText.setText(mDisplayName); //mDisplayName is null initially
getDataFromUsersDetails正在使用valueEventListener进行异步调用。当响应到来时,您正在将值分配给mDisplayName,但不会在textView中更新。
在For循环中,您需要显式更新
mWelcomeText.setText(mDisplayName);