我正在尝试保存一个TextView值,该值会在按钮单击时更改并保持存储直到我终止应用程序。 我试图使用onSaveInstanceState和onRestoreInstanceState来保存和恢复,只要应用程序正在运行。它对我不起作用。这是我的代码。
TextView questionText;
Button button ;
String perso1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_settings);
perso1 = MainActivity.perso;
questionText = (TextView)findViewById(R.id.perso);
questionText.setText(perso1));
getSupportActionBar().setIcon(R.drawable.ic_back_icon);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setTitle(R.string.settings);
button = (Button) findViewById(R.id.button1);
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
resetConsent();
questionText.setText("You clicked on the button");
}
});
}
@Override
protected void onSaveInstanceState(Bundle outState) {
// TODO Auto-generated method stub
super.onSaveInstanceState(outState);
String newtext = questionText.getText().toString();
outState.putString("TEXT", newtext);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onRestoreInstanceState(savedInstanceState);
questionText.setText(savedInstanceState.getString("TEXT"));
}
当我点击按钮直到我杀死应用程序时,我正在尝试保留textview的新值。我做错了什么?
答案 0 :(得分:0)
ViewModel就是您所需要的!
<强>为什么强>
string URI = "http://www.testwebsite.com/submit?q=+mydata"; string myParameters = ""; using (WebClient wc = new WebClient()) { wc.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded"; HtmlResult = wc.UploadString(URI, myParameters); }
类旨在以生命周期意识的方式存储和管理与UI相关的数据。ViewModel
类允许数据在配置更改(例如屏幕旋转)后继续存在。
它让您的生活更轻松。您无需考虑如何在ViewModel
中保存它,但您可以将字符串存储在savedInstanceState
(作为ViewModel
)中,然后观察它。
使用LiveData
,您可以在每次单击按钮时更改值,并在每次更改时观察值。
答案 1 :(得分:0)
您总是可以尝试以不同的方式保存状态。
@Override
protected void onSaveInstanceState(Bundle outState) {
// TODO Auto-generated method stub
super.onSaveInstanceState(outState);
String newtext = questionText.getText().toString();
outState.putString("TEXT", newtext);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_settings);
//check if there was a previous saved state
if(savedInstanceState != null){
//get the value you stored earlier in onSaveInstanceState()
perso1 = savedInstanceState.getString("TEXT");
}
questionText = (TextView)findViewById(R.id.perso);
questionText.setText(perso1));
//....
}
但这只是拯救国家的另一种方式。
我想我的错误解释如下。
//你正确地做了 - 看,你在这里设置了questionText
onRestoreInstanceState(Bundle savedInstanceState){
super.onRestoreInstanceState(savedInstanceState);
//set the questionText below
questionText.setText(savedInstanceState.getString("TEXT"));
}
然后在onCreate()中再次设置questionText。这次是一个不正确的值。
perso1 = MainActivity.perso;//< -- setting perso1 to nothing?
questionText = (TextView)findViewById(R.id.perso);
questionText.setText(perso1));//<-- setting questionText again
onRestoreInstanceState
在onStart()和onPostCreate(Bundle)之间调用此方法。
在onSaveInstanceState()中你正确地做了,在onRestoreInstanceState()中你做得正确,在onCreate()中你再次将值设置为错误的值。
另外,在决定以这种方式保持状态或使用ViewModel
时,请阅读此内容对于简单数据,活动可以使用onSaveInstanceState()方法并从onCreate()中的包中恢复其数据,但此方法仅适用于可以序列化然后反序列化的少量数据,而不适用于潜在的大数据大量数据,如用户列表或位图。