如何在抽屉菜单中获取已登录用户的信息?

huangapple go评论105阅读模式
英文:

How to get logged user's information in drawer menu?

问题

我试图从 Firebase 中获取当前用户的用户名和电子邮件,并在抽屉菜单中显示出来。然而,程序崩溃并返回了以下错误:

  1. java.lang.NullPointerException: 尝试在空对象引用上调用虚拟方法 'void android.widget.TextView.setText(java.lang.CharSequence)'
  2. at com.example.android.myapplication.NavigationActivity$1.onDataChange(NavigationActivity.java:79)

以下是我的导航活动代码部分:

  1. public class NavigationActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener{
  2. // ... (其他代码)
  3. private void getUserInformation() {
  4. DatabaseReference userDatabase= FirebaseDatabase.getInstance().getReference().child("users").child(userId);
  5. userDatabase.addValueEventListener(new ValueEventListener() {
  6. @Override
  7. public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
  8. if (dataSnapshot.exists()) {
  9. for (DataSnapshot child : dataSnapshot.getChildren()) {
  10. if (child.getKey().equals("name")) {
  11. name.setText(child.getValue().toString());
  12. }
  13. if (child.getKey().equals("email")) {
  14. email.setText(child.getValue().toString());
  15. }
  16. }
  17. }
  18. }
  19. @Override
  20. public void onCancelled(@NonNull DatabaseError databaseError) {
  21. }
  22. });
  23. }
  24. // ... (其他代码)
  25. }

这是我的数据库结构截图:

如何在抽屉菜单中获取已登录用户的信息?

我猜测问题可能是因为 NavigationActivity 不是主要活动,然而,即使我将其更改为主要活动,我仍然遇到相同的错误。

英文:

I've tried to retrieve the current user's username and email from firebase and display it in the drawer menu. However, the program crashed and return the error:

  1. java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
  2. at com.example.android.myapplication.NavigationActivity$1.onDataChange(NavigationActivity.java:79)

Here is my Navigation Activity

  1. public class NavigationActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener{
  2. protected DrawerLayout drawer;
  3. private String userId;
  4. private TextView email,name;
  5. private DatabaseReference mDatabase;
  6. private FirebaseAuth mAuth;
  7. @Override
  8. protected void onCreate(Bundle savedInstanceState) {
  9. super.onCreate(savedInstanceState);
  10. setContentView(R.layout.activity_navigation);
  11. Toolbar toolbar = findViewById(R.id.toolbar);
  12. setSupportActionBar(toolbar);
  13. drawer = findViewById(R.id.drawer_layout);
  14. NavigationView navigationView=findViewById(R.id.nav_view);
  15. navigationView.setNavigationItemSelectedListener(this);
  16. ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawer, toolbar,
  17. R.string.navigation_drawer_open, R.string.navigation_drawer_close);
  18. drawer.addDrawerListener(toggle);
  19. toggle.syncState();
  20. name = (TextView)findViewById(R.id.name);
  21. email=(TextView)findViewById(R.id.email);
  22. mAuth=FirebaseAuth.getInstance();
  23. userId= mAuth.getCurrentUser().getUid();
  24. getUserInformation();
  25. }
  26. private void getUserInformation() {
  27. DatabaseReference userDatabase= FirebaseDatabase.getInstance().getReference().child("users").child(userId);
  28. userDatabase.addValueEventListener(new ValueEventListener() {
  29. @Override
  30. public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
  31. if (dataSnapshot.exists()) {
  32. for (DataSnapshot child : dataSnapshot.getChildren()) {
  33. if (child.getKey().equals("name")) {//find the child that Equals to start
  34. name.setText(child.getValue().toString());
  35. }
  36. if (child.getKey().equals("email")) {//find the child that Equals to start
  37. email.setText(child.getValue().toString());
  38. }
  39. }
  40. }
  41. }
  42. @Override
  43. public void onCancelled(@NonNull DatabaseError databaseError) {
  44. }
  45. });
  46. }
  47. @Override
  48. public void onBackPressed() {
  49. if (drawer.isDrawerOpen(GravityCompat.START)) {
  50. drawer.closeDrawer(GravityCompat.START);
  51. } else {
  52. super.onBackPressed();
  53. }
  54. }
  55. @Override
  56. public boolean onNavigationItemSelected(@NonNull MenuItem item) {
  57. switch(item.getItemId()){
  58. case R.id.nav_run:
  59. Intent intent = new Intent(NavigationActivity.this,running_map.class);
  60. startActivity(intent);
  61. finish();
  62. break;
  63. case R.id.nav_history:
  64. Intent intent2 = new Intent(NavigationActivity.this,HistoryActivity.class);
  65. startActivity(intent2);
  66. finish();
  67. break;
  68. //......
  69. }
  70. drawer.closeDrawer(GravityCompat.START);
  71. return true;
  72. }
  73. }

Here is my database:
如何在抽屉菜单中获取已登录用户的信息?
I guessed that this is because the NavigationActivity was not the main activity, however, even when I changed it to the main activity, I still got the same error.

答案1

得分: 2

你不需要使用 for 循环:

  1. private void getUserInformation() {
  2. DatabaseReference userDatabase = FirebaseDatabase.getInstance().getReference().child("users").child(userId);
  3. userDatabase.addValueEventListener(new ValueEventListener() {
  4. @Override
  5. public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
  6. if (dataSnapshot.exists()) {
  7. if (dataSnapshot.child("name").getValue(String.class).equals("name")) {
  8. name.setText(child.getValue().toString());
  9. }
  10. if (dataSnapshot.child("email").getValue(String.class).equals("email")) {
  11. email.setText(child.getValue().toString());
  12. }
  13. }
  14. }
  15. @Override
  16. public void onCancelled(@NonNull DatabaseError databaseError) {
  17. }
  18. });
  19. }

你的引用位于节点 userId,因此要获取详细信息,你不需要进行迭代。

英文:

You dont need the for loop:

  1. private void getUserInformation() {
  2. DatabaseReference userDatabase= FirebaseDatabase.getInstance().getReference().child("users").child(userId);
  3. userDatabase.addValueEventListener(new ValueEventListener() {
  4. @Override
  5. public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
  6. if (dataSnapshot.exists()) {
  7. if (dataSnapshot.child("name").getValue(String.class).equals("name")) {//find the child that Equals to start
  8. name.setText(child.getValue().toString());
  9. }
  10. if (dataSnapshot.child("email").getValue(String.class).equals("email")) {//find the child that Equals to start
  11. email.setText(child.getValue().toString());
  12. }
  13. }
  14. }
  15. @Override
  16. public void onCancelled(@NonNull DatabaseError databaseError) {
  17. }
  18. });
  19. }

Your reference is at node userId, therefore to get the details you dont need to iterate.

huangapple
  • 本文由 发表于 2020年3月16日 05:49:40
  • 转载请务必保留本文链接:https://go.coder-hub.com/60698009.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定