Как сохранить состояние с помощью onSaveInstanceState и onRestoreInstanceState при изменении ориентации
Я прочитал почти всю статью о onSaveInstanceState и onRestoreInstanceState в переполнении стека, но не могу решить свою проблему.
У меня есть текстовое представление и кнопка в моем 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
<TextView android:id="@+id/shoma" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="right" android:text="@string/shoma" android:textSize="20sp" /> <Button android:id="@+id/showsalavat" android:layout_width="fill_parent" android:layout_height="150dp" android:text="+" android:textSize="100sp" /> <TextView android:id="@+id/eltemas" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="55dp" android:text="@string/eltemas" /> <TextView android:id="@+id/salavat" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Large Text" android:textAppearance="?android:attr/textAppearanceLarge" android:textSize="35sp" /> <TextView android:id="@+id/ferestade" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="24dp" android:text="@string/salavat" android:textSize="20sp" /> </LinearLayout>
Мне действительно нужна помощь в этом. Я действительно ценю твою помощь.
5 ответов
Я думаю, что этот код полезен для вас..
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);
}
});
}
}
В качестве обновления вы можете просто установить freezesText="true"
http://developer.android.com/reference/android/R.attr.html
<TextView
android:id="@+id/eltemas"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:freezesText="true"/>
Или же
Это самый простой пример:
TextView yourTextView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
yourTextView = (TextView) findViewById(R.id.your_textview);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
outState.putString("YourTextViewTextIdentifier", yourTextView.getText().toString());
super.onSaveInstanceState(outState);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
yourTextView.setText(savedInstanceState.getString("YourTextViewTextIdentifier"));
}
Но наличие внутреннего класса, представляющего ваше состояние, будет намного приятнее, когда вы начнете сохранять много объектов при изменении ориентации.
Используя внутренний класс, это будет выглядеть так ниже. Вы можете вообразить, что у вас все больше и больше состояний для сохранения внутреннего класса, что делает его намного проще (менее грязным) для обработки.
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());
}
Вам нужно восстановить компоненты вашего представления с сохраненными значениями. заполните текстовое представление сохраненным значением.
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
a = savedInstanceState.getInt ("salavat-count");
tv.setText(""+a);
}
Забытая, но серьезная ошибка. Сначала вы должны передать данные в onSavedInstanceState() и вызвать onSavedInstanceState() . Если вы подумаете, то обнаружите, что бесполезно вызывать onSavedInstanceState перед передачей данных для сохранения. он не будет сохранять экземпляр действия, так как onSavedInstanceState() вызывается раньше.. Он должен быть следующим:
@Override
protected void onSaveInstanceState(Bundle SavedInstanceState)
{
SavedInstanceState.putInt("salavat-count", a);
super.onSaveInstanceState(SavedInstanceState);
}
Вы действительно хотите использовать эти методы?
Здесь вы найдете своеобразное решение вашей проблемы, просто поместите это в свой файл манифеста.
<activity android:name="package.subpackage.xptoactivity" android:configChanges="orientation"></activity>
Если вы сделаете это, ваша активность не будет перезагружать все виды, сбрасывая их значения при изменении ориентации