当前位置: 首页 > 知识库问答 >
问题:

带有firebase rt dababase数据的TextView在屏幕上消失

梁嘉澍
2023-03-14

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

第一个活动是RegisterActivity。在用户插入他的电子邮件和密码,并单击next按钮后,将弹出一个包含用户详细信息输入字段的窗口。

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

在main活动中,我希望显示来自数据库的用户名。在调试模式下,我获取用户名,但它不会显示在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;
}

共有1个答案

艾仲渊
2023-03-14

我想请你看看这两条线的主要活动。

    getDataFromUsersDetails();

    mWelcomeText.setText(mDisplayName); //mDisplayName is null initially

getDataFromUsersDetails正在使用ValueEventListener进行异步调用。当响应出现时,您将值赋给mDisplayName,但它不会在TextView中更新。

在For循环中,您需要显式更新Mwelcometext.settext(mDisplayName);

 类似资料:
  • 最近,我一直在构建一个应用程序,在JFrame上绘制图像,一切都很好,但是当窗口离开屏幕时,已经绘制的图像消失了,我一直在想是否有办法避免这种情况?谢谢 导入java。awt。;导入java。awt。事件 公共类Pokemoneur扩展了JFrame,实现了AdjustmentListener、ActionListener、MouseListener和Runnable{ }问题是,当用户在屏幕上画

  • 主要内容:【脑筋急转弯】%ds输出什么,【拓展】如何在字符串中书写长文本在《 第一个C语言程序》一节中,我们使用 puts 来输出字符串。puts 是 output string 的缩写,只能用来输出字符串,不能输出整数、小数、字符等,我们需要用另外一个函数,那就是  printf。 printf 比 puts 更加强大,不仅可以输出字符串,还可以输出整数、小数、单个字符等,并且输出格式也可以自己定义,例如: 以十进制、八进制、十六进制形式输出; 要求输出的数字占 n

  • 相关问题: 在Flutter中在小部件之间传递数据的最佳方式 在小部件之间抖动传递数据? 颤振/如何在StateFulWidget之间传递和获取数据

  • 我试图移动这个图像: 在我的PyGame屏幕上,从右到左再向后,但是随着图像的移动,每隔一秒左右我就会有一点屏幕撕裂,就像这样: 我使用的代码是类似于此的循环: 到目前为止,我已经尝试了以下方法来解决这个问题: 在创建屏幕时使用,,标志,这没有效果,我也调整了更新为(因为使用?)时建议使用此选项) 在GPU和CPU之间拆分内存(我在raspberry pi 2上运行此功能)我尝试过为这两个处理器提

  • 我在控制台中不断得到的错误是: core.js:6241 ERROR firebaseerror:不能使用空路径调用函数collectionreference.doc()。 我的firestore设计: 集合名称“用户”->包含每个用户的文档->每个用户都有“联系人”集合->每个联系人包含电子邮件、姓名、电话联系人属性。