0

I am making an android app. In which I am trying to set the username and mail of the user, in TextViews in java. The data gets set when I start the app first time, as I signin using google-signin, but when I quit the app and try to start it again, it crashes, giving a null object reference exception. It does not pick a value the second time from:

mUsername = user.getDisplayName();

I only have MainActivity Class as follows:

public class MainActivity extends AppCompatActivity
    implements NavigationView.OnNavigationItemSelectedListener {

public static final String ANONYMOUS = "anonymous";
public static final String EMAIL = "mail@domain.com";
public static final int RC_SIGN_IN = 1;

private String mUsername;
private String mEmail;

private FirebaseDatabase mFirebaseDatabase;
private DatabaseReference mDatabaseReference;
private FirebaseAuth mFirebaseAuth;
private FirebaseAuth.AuthStateListener mAuthStateListener;


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


    /**Add Drawer layout and Navigation view*/
    addDrawerLayoutAndNAvigationView();

    /**FireBase Authentication Check*/
    runFirebaseAuthenticator();

}

private void setUsernameAndMail(String name, String mail) {
    TextView username = (TextView) findViewById(R.id.username_text_view);
    username.setText(name);

    TextView email = (TextView) findViewById(R.id.user_mail_text_view);
    email.setText(mail);
}

@Override
protected void onResume() {
    super.onResume();
    if(mFirebaseAuth!=null){
        FirebaseUser user = mFirebaseAuth.getCurrentUser();
        onSignedInInitializer(user.getDisplayName(), user.getEmail());
    }
    mFirebaseAuth.addAuthStateListener(mAuthStateListener);
}

@Override
protected void onPause() {
    super.onPause();
    if (mAuthStateListener != null) {
        mFirebaseAuth.removeAuthStateListener(mAuthStateListener);
    }
}


@Override
public void onBackPressed() {
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    if (drawer.isDrawerOpen(GravityCompat.START)) {
        drawer.closeDrawer(GravityCompat.START);
    } else {
        super.onBackPressed();
    }
}


@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {
    // Handle navigation view item clicks here.
    int id = item.getItemId();
    if (id == R.id.home) {
        Intent i = new Intent(this, MainActivity.class);
        startActivity(i);
    } else if (id == R.id.settings) {
        Intent i = new Intent(this, SettingsActivity.class);
        startActivity(i);
    } else if (id == R.id.signout) {
        AuthUI.getInstance().signOut(this);
        return true;
    }
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    drawer.closeDrawer(GravityCompat.START);
    return true;
}


private void addDrawerLayoutAndNAvigationView() {

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
            this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
    drawer.addDrawerListener(toggle);
    toggle.syncState();

    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
    navigationView.setNavigationItemSelectedListener(this);
}


private void runFirebaseAuthenticator() {

    mUsername = ANONYMOUS;
    mEmail = EMAIL;
    mFirebaseDatabase = FirebaseDatabase.getInstance();

    mFirebaseAuth = FirebaseAuth.getInstance();

    mAuthStateListener = new FirebaseAuth.AuthStateListener() {
        @Override
        public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {

            FirebaseUser user = firebaseAuth.getCurrentUser();
            if (user != null) {

                Toast.makeText(MainActivity.this, "You are signed in!", Toast.LENGTH_LONG).show();
                onSignedInInitializer(user.getDisplayName(), user.getEmail());
            } else {

                onSignedOutCleanup();
                startActivityForResult(
                        AuthUI.getInstance()
                                .createSignInIntentBuilder()
                                .setIsSmartLockEnabled(false)
                                .setAvailableProviders(Arrays.asList(
                                        new AuthUI.IdpConfig.GoogleBuilder().build(),
                                        new AuthUI.IdpConfig.EmailBuilder().build()))
                                .build(),
                        RC_SIGN_IN);
            }
        }
    };
}


public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == RC_SIGN_IN) {
        if (resultCode == RESULT_OK) {
            Toast.makeText(MainActivity.this, "Signed In!", Toast.LENGTH_LONG).show();
        } else if (resultCode == RESULT_CANCELED) {
            Toast.makeText(MainActivity.this, "Signed Cancelled!", Toast.LENGTH_LONG).show();
            finish();
        }
    }
}


private void onSignedInInitializer(String username, String email) {
    mUsername = username;
    mEmail = email;
    /**Set username and email*/
    setUsernameAndMail(mUsername,mEmail);
}

private void onSignedOutCleanup() {
    mUsername = ANONYMOUS;
    mEmail = EMAIL;
}}

Then I have nav_header_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="@dimen/nav_header_height"
android:background="@drawable/side_nav_bar"
android:gravity="bottom"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:theme="@style/ThemeOverlay.AppCompat.Dark">

<ImageView
    android:id="@+id/imageView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:paddingTop="@dimen/nav_header_vertical_spacing"
    app:srcCompat="@mipmap/ic_launcher_round" />

<TextView
    android:id="@+id/username_text_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingTop="@dimen/nav_header_vertical_spacing"
    android:text="@string/username"
    android:textAppearance="@style/TextAppearance.AppCompat.Body1" />

<TextView
    android:id="@+id/user_mail_text_view"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/user_mail" />
</LinearLayout>

Here, when I try to set the username and email in their respective TextView, the code gives me null-pointer exception

as follows:

java.lang.RuntimeException: Unable to resume activity {example.com.navdrawer/example.com.navdrawer.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
                                                   at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3519)
                                                   at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3559)
                                                   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2807)
                                                   at android.app.ActivityThread.-wrap12(ActivityThread.java)
                                                   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1548)
                                                   at android.os.Handler.dispatchMessage(Handler.java:102)
                                                   at android.os.Looper.loop(Looper.java:163)
                                                   at android.app.ActivityThread.main(ActivityThread.java:6372)
                                                   at java.lang.reflect.Method.invoke(Native Method)
                                                   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)
                                                   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:791)
                                                Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
                                                   at example.com.navdrawer.MainActivity.setUsernameAndMail(MainActivity.java:61)
                                                   at example.com.navdrawer.MainActivity.onSignedInInitializer(MainActivity.java:188)
                                                   at example.com.navdrawer.MainActivity.onResume(MainActivity.java:72)
                                                   at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1270)
                                                   at android.app.Activity.performResume(Activity.java:6974)
                                                   at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3496)
                                                   at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3559) 
                                                   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2807) 
                                                   at android.app.ActivityThread.-wrap12(ActivityThread.java) 
                                                   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1548) 
                                                   at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                   at android.os.Looper.loop(Looper.java:163) 
                                                   at android.app.ActivityThread.main(ActivityThread.java:6372) 
                                                   at java.lang.reflect.Method.invoke(Native Method) 
                                                   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901) 
                                                   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:791) 

I an unable to get a solution to this problem.

Nitin
  • 246
  • 1
  • 7
  • @nilesh Can you point me to 1 such solution, I am unable to find any! – Nitin Jul 18 '18 at 05:49
  • follow this answer https://stackoverflow.com/a/35684620/7666442 – AskNilesh Jul 18 '18 at 05:51
  • @nilesh I want to get a username from firebase user object. I am unable to put the value into my "mUsername" variable from user obj. – Nitin Jul 18 '18 at 06:01
  • 1
    no the issue is in your `TextView username` and `TextView email` you need to do `findViewById` like this https://stackoverflow.com/a/35684620/7666442 – AskNilesh Jul 18 '18 at 06:02
  • 1
    @nilesh Thanks a lot!!! It solved the issue I was facing, But I still did not get Why I had to get navigationView into a variable and then query for other. Also why null object error was shown? – Nitin Jul 18 '18 at 13:36

0 Answers0