Как использовать пример onSavedInstanceState пожалуйста

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

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);
    }
}

Ответ 1

Bundle - это контейнер для всей информации, которую вы хотите сохранить. Вы используете функции put * для вставки в нее данных. Здесь короткий список (есть больше) функций 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();
    }
}

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

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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

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

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    // Save the user 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);
}

Ответ 5

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

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

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

Ответ 6

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

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

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

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

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

Ответ 7

Если данные не загружены из 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
    }
}