簡體   English   中英

在onCreate上調用了onSaveInstanceState,但saveInstanceState為null

[英]onSaveInstanceState called but savedInstanceState is null in onCreate

已經提出了類似的問題,但是我沒有找到任何令人滿意的解決方案或解釋。 這似乎是最接近的,但是沒有給出解決方案: 問題

簡而言之,我有三個活動,MainActivity,DisplayMessageActivity和EditMessageActivity。 在MainActivity中,我有一個EditText視圖,可以在其中輸入文本,然后按下按鈕“發送”,然后將文本發送到DisplayMessageActivity並顯示。

然后,我有一個“編輯”按鈕,如果按下該按鈕,它將啟動EditMessageActivity。 在EditMessageActivity中,我有另一個EditText視圖,可以在其中輸入新文本,當我按“編輯”時,我返回DisplayMessageActivity並顯示新消息。 到現在為止還挺好。

問題是,如果我在DisplayMessageActivity中按“編輯”,然后不做任何事情就從EditMessageActivity返回,原始文本消失了,而TextView只是空白。

我已經實施

   @Override
    public void onSaveInstanceState(Bundle savedInstanceState){
        // Store UI to the savedInstanceState
        // This bundle will be passed to onCreate on next call.
       super.onSaveInstanceState(savedInstanceState);

       TextView textView = (TextView) findViewById(R.id.display_text);
        String text = textView.getText().toString();

       savedInstanceState.putString("savedText", text);
       System.out.println("onSaveInstanceState triggered");
    }

我在DisplayMessageActivity中的onCreate方法看起來像

    protected void onCreate(Bundle savedInstanceState){
        // This probably calls the onCreate method in AppCompatActivity?
        super.onCreate(savedInstanceState);
            System.out.println("onCreate triggered");
            if (savedInstanceState != null){
                System.out.println("savedInstanceState is NOT null!");
            }
            Intent intent = getIntent();
            String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);

            setContentView(R.layout.fragment_display_message);

            TextView textView = (TextView) findViewById(R.id.display_text);
            textView.setTextSize(40);
            textView.setText(message);

    }

當按下“編輯”時,它說“ onSaveInstanceState觸發”。 當我在EditMessageActivity中按回時,它說“ onCreate觸發”,但是,saveInstanceState始終為null。

由於程序進入,我不明白這一點

onSaveInstanceState(Bundle savedInstanceState).

我知道以前也曾問過類似的問題,但是在大多數情況下,似乎沒有調用onSaveInstanceState的問題,現在似乎是這樣嗎?

我也只想保存當前會話的數據,而不是將其存儲在數據庫中,該數據庫將在重新啟動整個應用程序時恢復文本。 否則on可以在onPause()中使用SharedPreferences。

提前致謝

根據kasunbdn的建議進行編輯:

覆蓋onBackPressed

@Override
public void onBackPressed(){
    Intent intent = new Intent(EditMessageActivity.this, DisplayMessageActivity.class);
    // Add your extras here ?
    EditText editText = (EditText) findViewById(R.id.edit_text);
    String text = editText.getText().toString();
    System.out.println("Text in onBackPressed: " + text);
    intent.putExtra(EDITMESSAGE, text);
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(intent);
}

我的新onCreate方法:

    protected void onCreate(Bundle savedInstanceState){
        // This probably calls the onCreate method in AppCompatActivity?
        super.onCreate(savedInstanceState);
            System.out.println("onCreate triggered");
            if (savedInstanceState != null){
                System.out.println("savedInstanceState is NOT null!");
            }
            Intent intent = getIntent();
            String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);
            String text = intent.getStringExtra(EditMessageActivity.EDITMESSAGE);
            System.out.println("message: " + message);
            System.out.println("text: " + text);
            setContentView(R.layout.fragment_display_message);

            TextView textView = (TextView) findViewById(R.id.display_text);
            textView.setTextSize(40);
        if (message != null) {
                textView.setText(message);
            } else if (text != null){
                textView.setText(text);
        }
    }

然而,

System.out.println("Text in onBackPressed: " + text);

永遠不會打印,所以我想回去時不會調用onBackPressed。

而且我仍然不明白為什么saveInstanceState為null。

這是DisplayMessageActivity:

package com.example.erikbylow.myclayapplication;

import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.MenuItem;
import android.view.View;

import android.widget.EditText;
import android.widget.TextView;

import org.w3c.dom.Text;

/**
 * Created by erikbylow on 5/14/15.
 */
public class DisplayMessageActivity extends AppCompatActivity{
    public final static String EXTRA_MESSAGE = "com.example.erikbylow.myclayapplication.MESSAGEEDIT";

    // onCreate is where an activity receives an intent. All subclasses of Activity must implement this
    @Override
    protected void onCreate(Bundle savedInstanceState){
        // This probably calls the onCreate method in AppCompatActivity?
        super.onCreate(savedInstanceState);
            System.out.println("onCreate triggered");
            if (savedInstanceState != null){
                System.out.println("savedInstanceState is NOT null!");
            }
            Intent intent = getIntent();
            String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);
            String text = intent.getStringExtra(EditMessageActivity.EDITMESSAGE);
            System.out.println("message: " + message);
            System.out.println("text: " + text);
            setContentView(R.layout.fragment_display_message);

            TextView textView = (TextView) findViewById(R.id.display_text);
            textView.setTextSize(40);
        if (message != null) {
                textView.setText(message);
            } else if (text != null){
                textView.setText(text);
        }
    }


    @Override
    public boolean onOptionsItemSelected(MenuItem item){
        // Handle action bar item clicks here. The action bar will automatically handle clicks on the Home/Up button,
        // so long as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    public void editText(View view){
        Intent intent = new Intent(this, EditMessageActivity.class);
        final int result = 3;
        TextView textView = (TextView) findViewById(R.id.display_text);
        String currentText = textView.getText().toString();
        intent.putExtra("currentText", currentText);
        startActivityForResult(intent, result);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode,
                                    Intent data){
        super.onActivityResult(requestCode, resultCode, data);
        System.out.println("resultCode: " + resultCode);
        if (resultCode == 3) {
            String message = data.getStringExtra("Edited");
            TextView textView = (TextView) findViewById(R.id.display_text);
            textView.setText(message);
        }
    }
   @Override
    public void onSaveInstanceState(Bundle savedInstanceState){
        // Store UI to the savedInstanceState
        // This bundle will be passed to onCreate on next call.
       TextView textView = (TextView) findViewById(R.id.display_text);
        String text = textView.getText().toString();

       savedInstanceState.putString("savedText", text);
       System.out.println("onSaveInstanceState triggered");
       super.onSaveInstanceState(savedInstanceState);
    }

   /* protected void onPause() {
        super.onPause();
        System.out.println("onPause triggered");
        // Store values between instances here
        SharedPreferences preferences = getPreferences(MODE_PRIVATE);
        SharedPreferences.Editor editor = preferences.edit();

        TextView textView = (TextView) findViewById(R.id.display_text);
        String savedText = textView.getText().toString();
        editor.putString("savedText", savedText);
        editor.commit();
    }*/
}

這是EditMessageActivity:

package com.example.erikbylow.myclayapplication;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;


/**
* Created by erikbylow on 5/14/15.
*/
public class EditMessageActivity extends AppCompatActivity {
   final static  String EDITMESSAGE =   "com.example.erikbylow.myclayapplication.EDITMESSAGE";
@Override
protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.edit_display_message);
    EditText editText = (EditText) findViewById(R.id.edit_text);
    editText.setText(getIntent().getStringExtra("currentText"));
 }
@Override
public boolean onOptionsItemSelected(MenuItem item){
    // Handle action bar item clicks here. The action bar will automatically handle clicks on the Home/Up button,
    // so long as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();
    if (id == R.id.action_settings) {
        return true;
    }
    return super.onOptionsItemSelected(item);
}

public void submitEdit(View view){
    EditText editText = (EditText) findViewById(R.id.edit_text);
    String edit = editText.getText().toString();
    Intent intent = new Intent();
    intent.putExtra("Edited",edit);
    setResult(3,intent);
    finish();
}

@Override
public void onBackPressed(){
    Intent intent = new Intent(EditMessageActivity.this, DisplayMessageActivity.class);
    // Add your extras here ?
    EditText editText = (EditText) findViewById(R.id.edit_text);
    String text = editText.getText().toString();
    System.out.println("Text in onBackPressed: " + text);
    intent.putExtra(EDITMESSAGE, text);
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(intent);
}

}

您可以在這里做些小技巧。 只需在EditMessageActivity中重寫onBackPressed(),然后再使用新的附加功能(已編輯的文本)啟動新的DisplayMessageActivity。 它的行為就像按下返回鍵一樣。

@Override
public void onBackPressed() {
            Intent intent = new Intent(EditMessageActivity.this, DisplayMessageActivity.class); 
            //add your extras here
            intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
            startActivity( intent );
}

編輯您的submitEdit()方法

public void submitEdit(View view){
  EditText editText = (EditText) findViewById(R.id.edit_text);
  String edit = editText.getText().toString();
  Intent intent = new Intent(EditMessageActivity.this, DisplayMessageActivity.class);
  intent.putExtra("Edited",edit);
  intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
  startActivity( intent );
}

這是我想嘗試的代碼

DisplayMessage.java

public class DisplayMessage extends ActionBarActivity {

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

    Intent intent = getIntent();
    String message = intent.getStringExtra("testing");

    Button edit=(Button)findViewById(R.id.edit_button); //this button is for go next activity 
    EditText edit_message=(EditText)findViewById(R.id.edit_message);
    if(message!=null)
        edit_message.setText(message);

    edit.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            Intent intent = new Intent(DisplayMessage.this, EditActivity.class);
            final int result = 3;
            EditText edit_message=(EditText)findViewById(R.id.edit_message);
            String currentText = edit_message.getText().toString();
            intent.putExtra("currentText", currentText);
            startActivityForResult(intent, result);

        }
    });


}

}

EditActivity.java

public class EditActivity extends ActionBarActivity {

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

    Intent intent = getIntent();
    String message = intent.getStringExtra("currentText");
    Button edit=(Button)findViewById(R.id.edit_button);
    EditText edit_message=(EditText)findViewById(R.id.edit_message);
    if(message!=null)
        edit_message.setText(message);

    edit.setOnClickListener(new OnClickListener() {         //to submit edits

        @Override
        public void onClick(View v) {
            Intent intent = new Intent(EditActivity.this, DisplayMessage.class);
            EditText edit_message=(EditText)findViewById(R.id.edit_message);
            String text = edit_message.getText().toString();
            intent.putExtra("testing", text);
            intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(intent);
        }


    });

}

}

您應該重寫onRestoreInstanceState()方法。 恢復DisplayActivity時,此方法將獲得回調(在您從Edit Activity按下display之后)

請參考下面的圖片,這是不言自明的: 在此處輸入圖片說明

代碼:

@Override

protected void onRestoreInstanceState(Bundle savedInstanceState) {

    if (savedInstanceState != null) {
        editText.setText(savedInstanceState.getString("savedText"));
    }
}

暫無
暫無

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

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