簡體   English   中英

在onActivityResult之后設置TextView文本

[英]Setting TextView text after onActivityResult

我有一個帶有登錄頁面的應用程序。

首先,我的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中設置文本?

UPDATE

即使我將構造函數中loggedUser中的字符串loggedUser為空,也將loggedUser = loggedUser.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)

空視圖通常是由於布局不包含具有在findViewById()中指定的ID的視圖而導致的。 因此,當調用onResume()時,findViewById()返回null,並且變量保持為null。 在main_activity.xml中仔細檢查您的視圖ID。

如果您使用的是更復雜的布局,則也可能無法在onCreate()中使用完整的內容視圖。 如果在onCreate()中發現視圖為空,請嘗試將findViewById()移動到生命周期中的更高位置。

嘗試像這樣重新排序代碼

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

在訪問變量之前,請嘗試初始化變量。

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 navigationView = findViewById(R.id.nav_id)
View header = navigationView.getHeaderView(0)
TextView usernameText = header.findViewById(R.id.username_text_view_id);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM