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

第一个活动是RegisterActivity。用户输入电子邮件和密码,然后单击下一步按钮后,将弹出一个弹出窗口,其中包含用户详细信息的输入字段。

用户应填写所有字段,然后单击保存按钮。
对于保存按钮的OnClick操作,所有用户详细信息都将写入实时数据库。

在主活动中,我想显示数据库中的用户名。
在调试模式下,我获得了用户名,但不会显示在TextViewprivate 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);

08-28 11:26
查看更多