Как использовать пример onSavedInstanceState, пожалуйста - PullRequest
101 голосов
/ 29 июня 2011

Я в замешательстве, когда дело доходит до сохранения состояния.Итак, я знаю, что onSaveInstanceState(Bundle) вызывается, когда действие должно быть уничтожено.Но как вы храните в нем свою информацию и возвращаете ее в исходное состояние в onCreate(Bundle savedInstanceState)?Я не понимаю, как этот пакет будет восстанавливать информацию.Было бы полезно, если кто-то может привести пример.Руководство для разработчиков не очень хорошо объясняет это.

public class Conversation extends Activity {
    private ProgressDialog progDialog;
    int typeBar;
    TextView text1;
    EditText edit;
    Button respond;
    private String name;
    private String textAtView;
    private String savedName;

    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);

        setContentView(R.layout.dorothydialog);
        text1 = (TextView)findViewById(R.id.dialog);
        edit = (EditText)findViewById(R.id.repsond);
        respond = (Button)findViewById(R.id.button01);

        if(savedInstanceState != null){
            savedInstanceState.get(savedName);
            text1.setText(savedName);
        }
        else{
            text1.setText("Hello! What is your name?");
            respond.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View v) {
                    name = edit.getText().toString();
                    text1.setText("Nice to meet you "+ name);
                }   
            });
        }
    }

    @Override
    public void onSaveInstanceState(Bundle outState){
        super.onSaveInstanceState(outState);
        outState.putString(savedName, name);
    }
}

Ответы [ 7 ]

178 голосов
/ 29 июня 2011

Bundle - это контейнер для всей информации, которую вы хотите сохранить.Вы используете функции put * для вставки данных в него.Вот краткий список (есть еще) функций пут, которые вы можете использовать для хранения данных в Bundle.

putString
putBoolean
putByte
putChar
putFloat
putLong
putShort
putParcelable (used for objects but they must implement Parcelable)

В вашей функции onCreate эта Bundle возвращается в программу,Лучший способ проверить, перезагружается ли приложение или запускается впервые:

if (savedInstanceState != null) {
    // Then the application is being reloaded
}

Чтобы вернуть данные, используйте функции get * так же, как функции put *.Данные хранятся в виде пары имя-значение.Это похоже на хэш-карту.Вы предоставляете ключ и значение, затем, когда вы хотите вернуть значение, вы даете ключ, и функция получает значение.Вот краткий пример.

@Override
public void onSaveInstanceState(Bundle outState) {
   outState.putString("message", "This is my message to be reloaded");
   super.onSaveInstanceState(outState);
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (savedInstanceState != null) {
        String message = savedInstanceState.getString("message");
        Toast.makeText(this, message, Toast.LENGTH_LONG).show();
    }
}

Ваше сохраненное сообщение будет отображаться на экране.Надеюсь, это поможет.

32 голосов
/ 29 июня 2011

Одно важное замечание, которое должны знать все новые разработчики Android, заключается в том, что любая информация в виджетах (TextView, Buttons и т. Д.) Будет автоматически сохраняться Android, пока вы назначаете им идентификатор.Таким образом, это означает, что большая часть состояния пользовательского интерфейса позаботилась без проблем.Только когда вам нужно сохранить другие данные, это становится проблемой.

Из Документов Android :

Единственное, что вам требуется - предоставитьИдентификатор (с атрибутом android: id) для каждого виджета, для которого вы хотите сохранить его состояние.Если у виджета нет идентификатора, он не может сохранить свое состояние

5 голосов
/ 20 марта 2015

Хорошая информация: вам не нужно проверять, является ли объект Bundle нулевым, в методе onCreate (). Используйте метод onRestoreInstanceState (), который система вызывает после метода onStart (). Система вызывает onRestoreInstanceState (), только если существует сохраненное состояние для восстановления, поэтому вам не нужно проверять, является ли Bundle нулевым

3 голосов
/ 14 декабря 2016

Информация о магазине:

static final String PLAYER_SCORE = "playerScore";
static final String PLAYER_LEVEL = "playerLevel";

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    // Save the user's current game state
    savedInstanceState.putInt(PLAYER_SCORE, mCurrentScore);
    savedInstanceState.putInt(PLAYER_LEVEL, mCurrentLevel);

// Always call the superclass so it can save the view hierarchy state
super.onSaveInstanceState(savedInstanceState);
}

Если вы не хотите восстанавливать информацию в вашем методе onCreate:

Вот примеры: Воссоздание действия

Вместо восстановления состояния во время onCreate () вы можете выбрать реализацию onRestoreInstanceState (), которую система вызывает после метода onStart ().Система вызывает onRestoreInstanceState (), только если существует сохраненное состояние для восстановления, поэтому вам не нужно проверять, является ли Bundle нулевым

public void onRestoreInstanceState(Bundle savedInstanceState) {
// Always call the superclass so it can restore the view hierarchy
super.onRestoreInstanceState(savedInstanceState);

// Restore state members from saved instance
mCurrentScore = savedInstanceState.getInt(PLAYER_SCORE);
mCurrentLevel = savedInstanceState.getInt(PLAYER_LEVEL);
}
0 голосов
/ 18 августа 2016

Если данные не загружаются из savedInstanceState, используйте следующий код.
Проблема в том, что URL-вызов не завершается полностью, поэтому проверьте, загружены ли данные, чтобы показать значение instanceState.

//suppose data is not Loaded to savedInstanceState at 1st swipe
if (savedInstanceState == null && !mAlreadyLoaded){
    mAlreadyLoaded = true;
    GetStoryData();//Url Call
} else {
    if (listArray != null) {  //Data Array From JsonArray(ListArray)
        System.out.println("LocalData  " + listArray);
        view.findViewById(R.id.progressBar).setVisibility(View.GONE);
    }else{
        GetStoryData();//Url Call
    }
}
0 голосов
/ 04 февраля 2014

Это для дополнительной информации.

Представьте себе этот сценарий

  1. ActivityA запускает ActivityB.
  2. ActivityB запускает новый ActivityAPrime от

    Intent intent = new Intent(getApplicationContext(), ActivityA.class);
    startActivity(intent);
    
  3. ActivityAPrime не имеет отношения к ActivityA.
    В этом случае Bundle в ActivityAPrime.onCreate () будет нулевым.

Если ActivityA и ActivityAPrime должны быть одним и тем же действием вместо разных действий, ActivityB должен вызывать finish (), чем использовать startActivity ().

0 голосов
/ 29 июня 2011

В основном onSaveInstanceState (Bundle outBundle) даст вам пакет.Когда вы посмотрите на класс Bundle, вы увидите, что вы можете поместить в него много разных вещей.При следующем вызове onCreate () вы просто возвращаете этот Bundle в качестве аргумента.Затем вы можете снова прочитать свои значения и восстановить активность.

Допустим, у вас есть действие с EditText.Пользователь написал текст внутри него.После этого система вызывает ваш onSaveInstanceState ().Вы читаете текст из EditText и записываете его в Bundle через Bundle.putString ("edit_text_value", theValue).

Теперь вызывается onCreate.Вы проверяете, является ли поставляемый комплект не нулевым.Если это так, вы можете восстановить свое значение с помощью Bundle.getString ("edit_text_value") и вернуть его обратно в свой EditText.

...