[英]onSaveInstanceState is called, but savedInstanceState in onCreate method throws 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.