简体   繁体   中英

Setting TextView text after onActivityResult

I have an app with a login page.

First, I have my MainActivity where everything starts:

public class MainActivity extends AppCompatActivity {

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

    // here i launch LoginActivity
    startActivityForResult(new Intent(this, LoginActivity.class), REQUEST_CODE);

    emailText = findViewById(R.id.nav_text_email);
    usernameText = findViewById(R.id.nav_text_username);
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data){
    if(requestCode == REQUEST_CODE){
        if(resultCode != Activity.RESULT_OK) {
            finish();
        }
        // if login succesful, i attach to variable instance of
        // logged user class.
        // that part works correct, in object vars exist
        loggedUser = loggedUser.getInstance();

        // i want to attach strings after succesful login
        emailText.setText(loggedUser.getEmail());
        usernameText.setText(loggedUser.getUsername());
    }
}

When run the app with the code above, after succesful LoginActivity app crashes with this exception:

2019-01-26 20:46:48.015 13071-13071/com.example.admin.keystroke_dynamics E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.admin.keystroke_dynamics, PID: 13071
java.lang.RuntimeException: Unable to resume activity {com.example.admin.keystroke_dynamics/com.example.admin.keystroke_dynamics.Activities.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:3586)
    at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3626)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2876)
    at android.app.ActivityThread.-wrap12(ActivityThread.java)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1567)
    at android.os.Handler.dispatchMessage(Handler.java:105)
    at android.os.Looper.loop(Looper.java:156)
    at android.app.ActivityThread.main(ActivityThread.java:6523)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:942)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832)
 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
    at com.example.admin.keystroke_dynamics.Activities.MainActivity.onResume(MainActivity.java:89)
    at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1279)
    at android.app.Activity.performResume(Activity.java:7022)
    at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3561)
    at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3626) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2876) 
    at android.app.ActivityThread.-wrap12(ActivityThread.java) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1567) 
    at android.os.Handler.dispatchMessage(Handler.java:105) 
    at android.os.Looper.loop(Looper.java:156) 
    at android.app.ActivityThread.main(ActivityThread.java:6523) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:942) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832) 

When I deleted the setText() methods from `onActivityResult(), I don't get that exception. The error appears when I click the Login button and the app crashes.

While debugging, compiler not even go in lines with setText()

My question is, how to set texts in textviews in the scenario that I coded above?

UPDATE

Even if i popualte strings in loggedUser in constructor as empty, move loggedUser = loggedUser.getInstance() and move setText() to onCreat , i still get that NPE.

EDIT:

I added onResume method:

@Override
protected void onResume()
{
    if(isLogged) {
        emailText.setText(loggedUser.getEmail());
        usernameText.setText(loggedUser.getUsername());
    }
    super.onResume();
}

And edited onActivityResult() :

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data){
    if(requestCode == REQUEST_CODE){
        if(resultCode != Activity.RESULT_OK) {
            finish();
        }
        isLogged = true; //var for if statement in onResume()
        loggedUser = loggedUser.getInstance();
    }
}

And i still get the same error on onResume() method when i setting up TextViews .

2019-01-26 21:21:57.752 18262-18262/com.example.admin.keystroke_dynamics E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.admin.keystroke_dynamics, PID: 18262
java.lang.RuntimeException: Unable to resume activity {com.example.admin.keystroke_dynamics/com.example.admin.keystroke_dynamics.Activities.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:3586)
    at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3626)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1618)
    at android.os.Handler.dispatchMessage(Handler.java:105)
    at android.os.Looper.loop(Looper.java:156)
    at android.app.ActivityThread.main(ActivityThread.java:6523)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:942)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832)
 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
    at com.example.admin.keystroke_dynamics.Activities.MainActivity.onResume(MainActivity.java:90)
    at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1279)
    at android.app.Activity.performResume(Activity.java:7022)
    at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3561)
    at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3626) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1618) 
    at android.os.Handler.dispatchMessage(Handler.java:105) 
    at android.os.Looper.loop(Looper.java:156) 
    at android.app.ActivityThread.main(ActivityThread.java:6523)

A null view is usually a result of your layout not containing a view with the id you specified in findViewById(). Therefore findViewById() returns null and the variables are remaining null when onResume() is called. Double check your view ids in main_activity.xml.

It's also possible that the full content view is not available in onCreate() if you are using a more complicated layout. If you find that your views are null in onCreate(), try moving findViewById() to a later point in the lifecycle.

Try reordering the code like this

emailText = findViewById(R.id.nav_text_email);
usernameText = findViewById(R.id.nav_text_username);
startActivityForResult(new Intent(this, LoginActivity.class), REQUEST_CODE);

Try initializing the variables before accessing them.

public class MainActivity extends AppCompatActivity {
TextView emailText;
TextView usernameText;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_activity);

    // here i launch LoginActivity
    startActivityForResult(new Intent(this, LoginActivity.class), REQUEST_CODE);

    emailText = findViewById(R.id.nav_text_email);
    usernameText = findViewById(R.id.nav_text_username);
}

Could fit in a comment

You need to access the NavigationView from the activity

Update

NavigationView navigationView = findViewById(R.id.nav_id)
View header = navigationView.getHeaderView(0)
TextView usernameText = header.findViewById(R.id.username_text_view_id);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM