java - 在 onActivityResult 之后设置 TextView 文本

标签 java android android-lifecycle

我有一个带有登录页面的应用程序。

首先,我有我的 MainActivity ,一切都从这里开始:

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());
    }
}

当使用上面的代码运行应用程序时,成功后 LoginActivity 应用程序崩溃并出现以下异常:

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) 

当我从 `onActivityResult() 中删除 setText() 方法时,我没有收到该异常。当我单击登录按钮时出现错误,并且应用程序崩溃。

调试时,编译器甚至不符合 setText()

我的问题是,在我上面编码的场景中如何在 textviews 中设置文本?

更新

即使我将构造函数中的 loggedUser 中的字符串填充为空,也将 loggedUser =loggingUser.getInstance() 移动到 setText()onCreat,我仍然得到那个 NPE。

编辑:

我添加了onResume方法:

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

并编辑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();
    }
}

当我设置 TextViews 时,我仍然在 onResume() 方法上遇到相同的错误。

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)

最佳答案

空 View 通常是由于您的布局不包含具有您在 findViewById() 中指定的 id 的 View 而导致的。因此,findViewById() 返回 null,并且当调用 onResume() 时变量保持为 null。仔细检查 main_activity.xml 中的 View ID。

如果您使用更复杂的布局,则完整内容 View 也可能在 onCreate() 中不可用。如果您发现 onCreate() 中的 View 为 null,请尝试将 findViewById() 移至生命周期的稍后位置。

关于java - 在 onActivityResult 之后设置 TextView 文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54382131/

相关文章:

android - RecyclerView 适配器的生命周期是什么?

android - 如何检测方向变化但让 android 处理它们?

Android:在 Activity 之间向前和向后传递消息

java - 如何使用 final 方法模拟一个类?

java - java中Singleton的并发访问

java - Java 内存模型是仅在 Java 范围内还是实际上在 JVM 范围内?

java - 使用支持新旧 Android 版本的剪贴板管理器进行复制?

java - 发现两个列表之间的差异

java - 安卓 N : Platform Migration toward OpenJDK 8

android - 从调试应用程序中暂时禁用泄漏金丝雀