Я был по большей части после наивысшего наивысшего проголосовавшего ответа Here и немного от некоторых других ответов на SO. Я пытаюсь обработать изменение конфигурации или что-нибудь, что вызвало бы onSaveInstanceState()
/onRestoreInstanceState()
. До сих пор я могу восстановить TextViews (правильно?), Но у меня возникают проблемы с динамически добавленными элементами ui, такими как ImageButtons, в моем примере кнопки не восстанавливаются. Это, наверное, что-то глупое, но я избегал просить о помощи достаточно долго. Я видел где-то упоминание о спасении объектов для связывания ... но это казалось более прямым. Благодарен за любые предложения.Восстановление динамических элементов пользовательского интерфейса в android
ой и я только тестирование на эмуляторе, вращающийся между пейзаж/портрет
EDIT: обновляется рабочий пример и предложение от @ 18446744073709551615. Спасибо всем за помощь, похоже, что сохранение целых объектов может быть лучшим подходом для более сложного кода.
Базовая схема XML:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/LinearLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="set"
android:text="Button" />
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="add"
android:text="Button" />
</LinearLayout>
Это лишь слегка изменённая пустым активность:
package com.example.savestate;
import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.TextView;
public class MainActivity extends Activity {
private static final String TAG = "MainActivity";
int btnId = 0;
int myBtns;
LinearLayout panel;
TextView textView;
String myString;
ImageButton[] btnArray;
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.d(TAG, "begin of creation, myString is " + myString);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.textView1);
Log.d(TAG, "end of creation, myString is: " + myString);
}
@Override
protected void onResume() {
super.onResume();
textView.setText(myString);
restoreBtns();
}
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
super.onSaveInstanceState(savedInstanceState);
savedInstanceState.putString("MyString", "Welcome back");
savedInstanceState.putInt("MyBtns", btnId);
Log.d(TAG, "on save, myString is: " + myString);
}
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
myString = savedInstanceState.getString("MyString");
myBtns = savedInstanceState.getInt("MyBtns");
Log.d(TAG, "on restore, myBtns is: " + myBtns);
Log.d(TAG, "on restore, myString is: " + myString);
}
public void restoreBtns() {
if(myBtns > 0) {
panel = (LinearLayout) findViewById(R.id.LinearLayout1);
btnArray = new ImageButton[myBtns];
for (int i = 0; i < myBtns; i++){
btnId++;
btnArray[i] = new ImageButton(this);
btnArray[i].setImageResource(R.drawable.ic_launcher);
btnArray[i].setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
btnArray[i].setId(btnId);
panel.addView(btnArray[i]);
}
}
}
public void add(View view) {
btnId++;
panel = (LinearLayout) findViewById(R.id.LinearLayout1);
ImageButton imgBtn = new ImageButton(this);
imgBtn.setImageResource(R.drawable.ic_launcher);
imgBtn.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
imgBtn.setId(btnId);
panel.addView(imgBtn);
}
public void set(View view) {
textView.setText("Goodbye");
Log.d(TAG, "on set(), myString is " + myString);
}
}
Какая проблема? Сбой приложения? Правильно ли отрегулированы кнопки? –
извините, кнопки не восстанавливаются – ziondreamt
Вы знаете, что вы не устанавливаете какие-либо местоположения правильно? Попробуйте отладить приложение, в частности метод restoreBtns(). Если вы полностью сохраните ImageButton (как объект), я думаю, что вы получите лучшие результаты. –