Android 如何在方向更改时使用onSaveInstanceState和onRestoreInstanceState保存状态
我读了几乎所有关于堆栈溢出中onSaveInstanceState和onRestoreInstanceState的文章,但我无法解决我的问题Android 如何在方向更改时使用onSaveInstanceState和onRestoreInstanceState保存状态,android,android-orientation,Android,Android Orientation,我读了几乎所有关于堆栈溢出中onSaveInstanceState和onRestoreInstanceState的文章,但我无法解决我的问题 我在main.java中有一个文本视图和按钮,当您单击按钮时(a是一个int变量),变量的值将增加并显示在文本视图中,但是,当我旋转手机(方向改变)时,文本视图将重置 我重写了onSaveInstanceState和onRestoreInstanceState,但它不起作用。 还有一件事,我有专门的layout-land.xml文件用于横向视图 这是我的密
我在main.java中有一个文本视图和按钮,当您单击按钮时(a是一个int变量),变量的值将增加并显示在文本视图中,但是,当我旋转手机(方向改变)时,文本视图将重置 我重写了onSaveInstanceState和onRestoreInstanceState,但它不起作用。 还有一件事,我有专门的layout-land.xml文件用于横向视图 这是我的密码
import android.app.Activity;
import android.graphics.Typeface;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class main extends Activity {
/** Called when the activity is first created. */
public int a = 0;
public String fonts="TAHOMA.TTF";
TextView tv = (TextView) findViewById(R.id.salavat);
Button b = (Button) findViewById(R.id.showsalavat);
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
b.setOnClickListener(new Button.OnClickListener() {
public void onClick(View arg0) {
a++;
tv.setText(""+a);
}
});
}
@Override
protected void onSaveInstanceState(Bundle SavedInstanceState) {
super.onSaveInstanceState(SavedInstanceState);
SavedInstanceState.putInt("salavat-count", a);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
a= savedInstanceState.getInt ("salavat-count");
}
}
这里是我的main.xml
我真的需要一些帮助。
非常感谢您的帮助。作为更新,您可以设置
freezesText=“true”
但是,当您开始在方向更改时保存大量对象时,拥有一个表示您的状态的内部类会更好
使用内部类,它将如下所示。您可以想象,当您有越来越多的状态要保存时,内部类使处理程序变得更加容易(不那么混乱)
private static class State implements Serializable {
private static final String STATE = "com.your.package.classname.STATE";
private String yourTextViewText;
public State(String yourTextViewText) {
this.yourTextViewText = yourTextViewText;
}
public String getYourTextViewText() {
return yourTextViewText;
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
State s = new State(yourTextView.getText().toString());
outState.putSerializable(State.STATE, s);
super.onSaveInstanceState(outState);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
State s = (State) savedInstanceState.getSerializable(State.STATE);
yourTextView.setText(s.getYourTextViewText());
}
您需要使用保存的值重建视图组件。 用保存的值填充textview
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
a = savedInstanceState.getInt ("salavat-count");
tv.setText(""+a);
}
你真的想使用这些方法吗 这是一种解决问题的方法,只需将其放入清单文件中即可
<activity android:name="package.subpackage.xptoactivity" android:configChanges="orientation"></activity>
如果您这样做,当您更改方向时,您的活动将不会重新加载所有视图并重置其值我认为此代码对您有帮助
public class MainActivity extends Activity
{
protected void onSaveInstanceState(Bundle outState)
{
super.onSaveInstanceState(outState);
System.out.println("TAG, onSavedInstanceState");
final TextView text = (TextView)findViewById(R.id.textView1);
CharSequence userText = text.getText();
outState.putCharSequence("savedText", userText);
}
protected void onRestoreInstanceState(Bundle savedState)
{
System.out.println("TAG, onRestoreInstanceState");
final TextView text = (TextView)findViewById(R.id.textView1);
CharSequence userText = savedState.getCharSequence("savedText");
text.setText(userText);
}
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final String name = "5";
final TextView show = (TextView)findViewById(R.id.textView1);
Button btn = (Button)findViewById(R.id.button1);
btn.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v)
{
// TODO Auto-generated method stub
show.setText(name);
}
});
}
}
一个被忽视但严重的错误。 必须首先将数据传递给onSavedInstanceState()并调用onSavedInstanceState()。如果您这样想,您会发现在传递要保存的数据之前调用savedinstancestate是无用的。它不会将活动实例保存为之前调用的onSavedInstanceState()。。 它应该是:
@Override
protected void onSaveInstanceState(Bundle SavedInstanceState)
{
SavedInstanceState.putInt("salavat-count", a);
super.onSaveInstanceState(SavedInstanceState);
}
认真地这可能是我见过的最糟糕的格式化代码了…@AlexLockwood我知道我要编辑和整理,但后来我觉得。。。H@Alexlockwood:D.u.r是的,因为我是安卓系统的新手。这很有帮助。这能回答你的问题吗?这不是一个解决方案,而是重新启动方向的一个解决方案。您的活动可以在许多事件中重新启动,更改方向只是其中之一。广泛且公开建议避免这种做法,因为随着android的发展,它甚至不再是一种解决方法。如果我们在更新textview文本时使用不同的文本颜色。我们怎样才能把它保存下来呢?你能帮我吗?
<activity android:name="package.subpackage.xptoactivity" android:configChanges="orientation"></activity>
public class MainActivity extends Activity
{
protected void onSaveInstanceState(Bundle outState)
{
super.onSaveInstanceState(outState);
System.out.println("TAG, onSavedInstanceState");
final TextView text = (TextView)findViewById(R.id.textView1);
CharSequence userText = text.getText();
outState.putCharSequence("savedText", userText);
}
protected void onRestoreInstanceState(Bundle savedState)
{
System.out.println("TAG, onRestoreInstanceState");
final TextView text = (TextView)findViewById(R.id.textView1);
CharSequence userText = savedState.getCharSequence("savedText");
text.setText(userText);
}
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final String name = "5";
final TextView show = (TextView)findViewById(R.id.textView1);
Button btn = (Button)findViewById(R.id.button1);
btn.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v)
{
// TODO Auto-generated method stub
show.setText(name);
}
});
}
}
@Override
protected void onSaveInstanceState(Bundle SavedInstanceState)
{
SavedInstanceState.putInt("salavat-count", a);
super.onSaveInstanceState(SavedInstanceState);
}