Java 来自firebase rt dababase的数据在屏幕上消失的文本视图

Java 来自firebase rt dababase的数据在屏幕上消失的文本视图,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我正在尝试从数据库中获取用户名,并将其设置为屏幕上的文本。 我有3个活动和片段对象 第一个活动是RegisterActivity。用户插入电子邮件和密码并单击“下一步”按钮后,将出现一个弹出窗口,其中包含用户详细信息的输入字段 用户应填写所有字段并单击“保存”按钮。 对于保存按钮的OnClick操作,所有用户详细信息都会写入实时数据库 在主活动中,我想显示数据库中的用户名。 在调试模式下,我获得用户名,但它不会显示在TextView(private TextView mWelcomeText)上

我正在尝试从数据库中获取用户名,并将其设置为屏幕上的文本。 我有3个活动和片段对象

第一个活动是
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
            }