我已經使用PreferenceFragment實現了我的應用程序的設置屏幕。 當點擊設置屏幕工具欄中的向上按鈕時,我的應用程序將返回到MainActivity屏幕,但之前輸入到EditTexts中的數據(在進入設置屏幕之前)將丟失,並且EditTexts全部爲空。從PreferenceFragment返回MainActivity時恢復EditText
我試着實現onSaveInstanceState和onRestoreInstanceState,但它不工作,因爲onRestoreInstanceState在單擊設置屏幕工具欄中的向上按鈕時未被調用。 savedInstanceState在onCreate中也爲null。
如果有人可以指出如何恢復EditTexts中的數據,那麼會真的很感激嗎? :)
這裏的日誌MainActivity:
點擊從工具欄菜單設置:
I/LOG:在onPause
I/LOG:的onSaveInstanceState保存
I /日誌:onStop
點擊在設置界面工具欄後退按鈕:
I/LOG:的onDestroy
I/LOG:的onCreate
I/LOG:savedInstanceState是空
I/LOG:在onStart
我/登錄:onResume
MainAcitivy.j AVA
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.widget.EditText;
import android.util.Log;
//...
public class MainActivity extends AppCompatActivity {
Toolbar toolbarMain;
EditText editText;
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.i("LOG", "onCreate");
super.onCreate(savedInstanceState);
Log.i("LOG", "savedInstanceState is " + savedInstanceState);
if(savedInstanceState !=null) {
editText.setText(savedInstanceState.getString("ET_KEY"), TextView.BufferType.EDITABLE);
}
setContentView(R.layout.activity_main);
editText = (EditText) findViewById(R.id.myEditText);
toolbarMain = (Toolbar) findViewById(R.id.toolbar);
toolbarMain.setTitle(R.string.app_name);
toolbarMain.inflateMenu(R.menu.menu_main);
toolbarMain.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.settings:
startActivity(new Intent(MainActivity.this, SettingsActivity.class));
}
return true;
}
});
}
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
Log.i("LOG", "onRestoreInstanceState");
super.onRestoreInstanceState(savedInstanceState);
editText.setText(savedInstanceState.getString("ET_KEY"), TextView.BufferType.EDITABLE);
}
@Override
public void onSaveInstanceState(Bundle outState) {
Log.i("LOG", "onSaveInstanceState saving");
outState.putString("ET_KEY", editText.getText().toString());
}
@Override
public void onPause() {
Log.i("LOG", "onPause");
super.onPause();
}
@Override
public void onStop() {
Log.i("LOG", "onStop");
super.onStop();
}
@Override
public void onDestroy() {
Log.i("LOG", "onDestroy");
super.onDestroy();
}
@Override
public void onStart() {
Log.i("LOG", "onStart");
super.onStart();
}
@Override
public void onResume() {
Log.i("LOG", "onResume");
super.onResume();
}
SettingsActivity.java
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
public class SettingsActivity extends AppCompatActivity {
SharedPreferences sharedPref;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.preferences_layout);
sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
Toolbar toolbar = (Toolbar)findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
//getSupportActionBar().setHomeButtonEnabled(true);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
// Display the fragment as the main content.
getFragmentManager().beginTransaction()
.replace(R.id.pref_content, new SettingsFragment())
.commit();
}
}
您不需要保存state.unless您在第一個活動中調用finish()或方向改變時,數據不會丟失。[Check this](https://stackoverflow.com/questions/) 15569790/android-onsaveinstancestate-in-back-button) – Adithya
我不太理解SO線程中的討論,您要求我查看。我注意到,當我單擊導航欄 –
上的後退按鈕時。 ..注意到只有onStart然後onResume被調用,edittext仍然有它的數據;我想這意味着國家沒有失去。所以在我看來,我需要重寫工具欄上的向上按鈕是如何模仿後退導航按鈕的?如果是這樣,我該怎麼做? –