代码之家  ›  专栏  ›  技术社区  ›  michasaucer

设置onActivityResult后的文本查看文本

  •  0
  • michasaucer  · 技术社区  · 7 年前

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

    首先,我有我的 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) 
    

    当我删除 setText() 从`onActivityResult()中,我没有得到该异常。当我单击 登录 按钮,应用程序崩溃。

    setText()

    我的问题是,如何设置文本 textviews

    使现代化

    即使我把线插进去 loggedUser loggedUser = loggedUser.getInstance() 搬家 到 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();
        }
    }
    

    但我还是会犯同样的错误 onResume() 方法设置时使用 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)
    
    3 回复  |  直到 7 年前
        1
  •  1
  •   Greg Moens    7 年前

    如果您使用的是更复杂的布局,则onCreate()中也可能没有完整内容视图。如果在onCreate()中发现视图为空,请尝试将findViewById()移动到生命周期中的稍后点。

        2
  •  0
  •   Charan M    7 年前

    试着像这样重新排列代码

    emailText = findViewById(R.id.nav_text_email);
    usernameText = findViewById(R.id.nav_text_username);
    startActivityForResult(new Intent(this, LoginActivity.class), REQUEST_CODE);
    
        3
  •  0
  •   christoandrew    7 年前

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

    可以发表评论吗

    使现代化

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