2013-11-18 4 views
0

Я был по большей части после наивысшего наивысшего проголосовавшего ответа 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); 

} 

} 
+0

Какая проблема? Сбой приложения? Правильно ли отрегулированы кнопки? –

+0

извините, кнопки не восстанавливаются – ziondreamt

+1

Вы знаете, что вы не устанавливаете какие-либо местоположения правильно? Попробуйте отладить приложение, в частности метод restoreBtns(). Если вы полностью сохраните ImageButton (как объект), я думаю, что вы получите лучшие результаты. –

ответ

1

Когда OnCreate() исполняет, myBtns равно 0. В связи с оператором if, restoreBtns() - это не-операционная система. Затем вызывается onStart(), и после этого onRestoreInstanceState() называется: Этот метод вызывается после onStart(). Таким образом, myBtns инициализируется только после его использования.

Предложение: переместите материал кнопки на onResume().

+0

Я заснул вскоре после того, как я разместил вопрос, я попробую это предложение, а также отредактирую свой вопрос, чтобы сделать его менее бесполезным. – ziondreamt

+0

ok, onResume() работает и выглядит как чистый способ справиться с этим, есть ли способ передать пакет, чтобы я мог сделать что-то вроде: 'if (savedInstanceState!= null) { restoreBtns(); textView.setText (myString); } ' – ziondreamt

+0

BTW, обратите внимание на аргумент: _onCreate (_ *** Bundle savedInstanceState *** _) _. Если значение null, это связка из предыдущего «воплощения». – 18446744073709551615

0

Попробуйте этот способ

<activity 
      android:name="com.yourpackage.YourActivity" 
      android:configChanges="keyboardHidden|orientation|screenSize" /> 
+1

Это не приведет к ошибкам, связанным с жизненным циклом уйдите, это только затруднит их упоминание и размножение. – 18446744073709551615

+0

Я использовал это в прошлом, но я не думаю, что это хорошее универсальное решение (хотя я мог ошибаться). – ziondreamt

Смежные вопросы