java - Firebase/DrawerLayout - 无缘无故注销?

标签 java android firebase-authentication navigation-drawer drawerlayout

我正在开发一个 DrawerLayout,当我单击其中一项进入配置文件页面时,它会将我注销(我可以注意到这一点,因为我收到了 UserAuth 的 NullPointer 错误 [即使我之前已通过身份验证)单击此]

注意:直到我尝试通过添加“初始化”方法等来模块化我的代码时,我才注意到这一点。

这是抽屉布局中项目的代码:

private void setupDrawerLayout() {
        drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        navigationView = (NavigationView) findViewById(R.id.navigation_view);
        navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
            @Override public boolean onNavigationItemSelected(MenuItem menuItem) {
                //If Clicked...then get item and go to associated page
                switch(menuItem.getTitle().toString())
                {
                    case "Profile":
                        Log.i("Profile", menuItem.getTitle().toString());
                        startActivity(new Intent(HomeActivity.this, ProfileActivity.class));
                    /*case "Share":
                        startActivity(new Intent(HomeActivity.this, ProfileActivity.class));
                    case "Settings":
                        startActivity(new Intent(HomeActivity.this, ProfileActivity.class)); */
                    case "Logout":
                        Log.i("Logout", menuItem.getTitle().toString());
                        FirebaseAuth.getInstance().signOut();
                        //startActivity(new Intent(HomeActivity.this, LoginActivity.class));
                }
                menuItem.setChecked(true);
                drawerLayout.closeDrawers();
                return true;
                }
        });
    }

出于某种原因,即使我单击“个人资料”项目,它也会转到该案例和“注销”,如日志语句所示:

I/Profile: Profile
I/Logout: Profile

然后这会导致错误:

E/UncaughtException: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.netgalaxystudios.timeclock/com.netgalaxystudios.timeclock.Activities.ProfileActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.google.firebase.auth.FirebaseUser.getUid()' on a null object reference

  Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.google.firebase.auth.FirebaseUser.getUid()' on a null object reference
                         at com.netgalaxystudios.timeclock.Activities.ProfileActivity.onCreate(ProfileActivity.java:70)

ProfileActivity.java(是我试图通过单击菜单中的 ITEM 来访问的 Activity )。它指的是这一行,但据我了解,实际上错误来自 HomeActivity...):

 currentUserString = currentUser.getUid().toString();

HomeActivity.java:

public class HomeActivity extends AppCompatActivity {

    private DrawerLayout drawerLayout;
    private NavigationView navigationView;
    ImageView menu, closeDrawer;
    RelativeLayout navHeader;

    //Profile Stuff
    DatabaseReference employeesRefPhoto, employeesRefFname, employeesRefLname;
    FirebaseDatabase database;
    String photoUrl;
    ImageView profilePhoto;
    FirebaseUser currentUser;
    String currentUserString;
    TextView nameTV, lnameTV;
    TextView businessesTV;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.drawer_layout);

        /////////////////////////
        //METHODS
        //initViews();
        //setupDrawerLayout();
        //footerOnClick();
        //////////////////////////

        menu = (ImageView) findViewById(R.id.menu);
        menu.setOnClickListener(new View.OnClickListener() {
                                    @Override
                                    public void onClick(final View view) {
                                            drawerLayout.openDrawer(Gravity.LEFT);
                                    }
                                });

        currentUser = FirebaseAuth.getInstance().getCurrentUser();
        currentUserString = currentUser.getUid().toString();

        setupDrawerLayout();

        //https://stackoverflow.com/questions/37163579/null-pointer-exception-on-navigation-header-initialized-variables
        navHeader=(RelativeLayout) LayoutInflater.from(this).inflate(R.layout.drawer_header, null);
        navigationView.addHeaderView(navHeader); //This seems to add a SECOND "X" image

        nameTV = (TextView) navHeader.findViewById(R.id.employeeFname);
        lnameTV = (TextView) navHeader.findViewById(R.id.employeeLname);

        closeDrawer = (ImageView) navHeader.findViewById(R.id.closedrawer);
        profilePhoto = (ImageView) navHeader.findViewById(R.id.profilephoto);
        businessesTV = (TextView) findViewById(R.id.businesses);

         closeDrawer.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(final View view) {
                drawerLayout.closeDrawer(Gravity.LEFT);
            }
        });

        ///////////////////////////////////////////////////////////////////////////
        //INFORMATION FOR MENU/////////////////////
        //PROFILE PHOTO
        //currentUser = FirebaseAuth.getInstance().getCurrentUser();
        //currentUserString = currentUser.getUid().toString();

        setupDrawerLayout();

        database = FirebaseDatabase.getInstance();
        employeesRefPhoto = database.getReference("Employees").child(currentUserString).child("photoDownloadUrl");
        employeesRefPhoto.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                Log.i("onDataChange","Inside");

                try {
                    photoUrl = dataSnapshot.getValue().toString();
                    Log.i("photoUrl", photoUrl);
                    Glide.with(getApplicationContext()).load(photoUrl).into(profilePhoto);
                    profilePhoto.setScaleType(ImageView.ScaleType.CENTER_CROP);
                }
                catch (NullPointerException e) {
                    Log.i("Null", e.toString());
                }

            }

            @Override
            public void onCancelled(DatabaseError databaseError) {
                Log.d("Cancelled",databaseError.toString());
            }
        });

        //////////////////////////////////////////////
        //GET NAME//////////////////////////////////
        //FIRST NAME
        employeesRefFname = database.getReference("Employees").child(currentUserString).child("firstName");
        employeesRefFname.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                try {
                    Log.i("firstname", dataSnapshot.getValue().toString());
                    nameTV.setText(dataSnapshot.getValue().toString());
                }
                catch (Exception e) {  Log.i("FNull?", e.toString());     }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {   Log.d("Cancelled",databaseError.toString());     }
        });

        //LAST NAME
        employeesRefLname = database.getReference("Employees").child(currentUserString).child("lastName");
        employeesRefLname.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                try {
                    Log.i("lastname", dataSnapshot.getValue().toString());

                    lnameTV.setText(dataSnapshot.getValue().toString());
                }
                catch (Exception e) {  Log.i("LNull?", e.toString());     }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {   Log.d("Cancelled",databaseError.toString());     }
        });

        //footerOnClick();
        footerOnClick();



    } //END OF ONCREATE

    /////////////////////////////////////////////////////////////////////////////////



    //INITIALIZE VIEWS
    private void initViews(){
        navHeader=(RelativeLayout) LayoutInflater.from(this).inflate(R.layout.drawer_header, null);

        nameTV = (TextView) navHeader.findViewById(R.id.employeeFname);
        lnameTV = (TextView) navHeader.findViewById(R.id.employeeLname);

        menu = (ImageView) findViewById(R.id.menu);
        closeDrawer = (ImageView) navHeader.findViewById(R.id.closedrawer);
        profilePhoto = (ImageView) navHeader.findViewById(R.id.profilephoto);
        businessesTV = (TextView) findViewById(R.id.businesses);
    }

    //INTENTS FOR THE FOOTER OF THE SCREEN
    private void footerOnClick() {

        businessesTV.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(final View view) {
                startActivity(new Intent(HomeActivity.this, BusinessesActivity.class));
            }
        });

        //EMPLOYEES
        //PAYROLL REPORT
    }

    //MENU / DRAWER
    //https://antonioleiva.com/navigation-view/
    private void setupDrawerLayout() {
        drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);

        navigationView = (NavigationView) findViewById(R.id.navigation_view);
        navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
            @Override public boolean onNavigationItemSelected(MenuItem menuItem) {
                //If Clicked...then get item and go to associated page
                switch(menuItem.getTitle().toString())
                {
                    case "Profile":
                        Log.i("Profile", menuItem.getTitle().toString());
                        startActivity(new Intent(HomeActivity.this, ProfileActivity.class));
                    /*case "Share":
                        startActivity(new Intent(HomeActivity.this, ProfileActivity.class));
                    case "Settings":
                        startActivity(new Intent(HomeActivity.this, ProfileActivity.class)); */
                    case "Logout":
                        Log.i("Logout", menuItem.getTitle().toString());
                        FirebaseAuth.getInstance().signOut();
                        //startActivity(new Intent(HomeActivity.this, LoginActivity.class));
                }

                menuItem.setChecked(true);
                drawerLayout.closeDrawers();
                return true;
            }
        });
    }

    //??????????????????????????????????????
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                drawerLayout.openDrawer(GravityCompat.START);
                return true;
        }

        return super.onOptionsItemSelected(item);
    }


} //END OF CLASS

最佳答案

onNavigationItemSelected() 下的 setupDrawerLayout() 内,您有一个 switch 语句。 在 switch 语句的每种情况下都使用 break 否则以下所有 switch 条件都可能执行。由于最后一种情况是注销,因此每次执行 switch 语句时用户都可能会注销。

关于java - Firebase/DrawerLayout - 无缘无故注销?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48798532/

相关文章:

android - 如何使用 MediaMuxer 合并音频和视频?

java - 找不到要构建的任何修订。验证此作业的存储库和分支配置。完成 : FAILURE

java - 在瓷砖水平上阻挡光线

java - 测量方法调用的 I/O 需求

java,mockito - 我如何找出调用了哪些模拟?

firebase - EXC_BAD_ACCESS code=2 在 Podfile 中包含 Firebase/Auth

android - 为什么 Canvas.drawPath() 这么慢?

Android ImageButton ClickEvent 不起作用

unity-game-engine - Firebase 不在 Unity SDK 中创建用户

firebase - `firebase_tools.firestore .delete` 需要一个 token ,但该 token 从何而来?