it-swarm.com.de

Wie verwende ich onSaveInstanceState () und onRestoreInstanceState ()?

Ich versuche, Daten über Ausrichtungsänderungen hinweg zu speichern. Wie im folgenden Code gezeigt, verwende ich onSaveInstanceState() und onRestoreInstanceState(). Ich versuche, den gespeicherten Wert abzurufen und überprüfe, ob es sich um den richtigen Wert in onRestoreInstanceState() handelt. Aber wenn ich versuche, den neuen Wert in onCreate() zu verwenden, habe ich nicht den neuen Wert, sondern den alten.

protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putString("TEXT", user);

    }
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    savedUser = savedInstanceState.getString("TEXT");
    Log.d("enregistred value", savedUser);

}



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

        int display_mode = getResources().getConfiguration().orientation;

        if (display_mode == 1) {

            setContentView(R.layout.main_grid);
            mGrid = (GridView) findViewById(R.id.gridview);
            mGrid.setColumnWidth(95);
            mGrid.setVisibility(0x00000000);
            // mGrid.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);

        } else {
            setContentView(R.layout.main_grid_land);
            mGrid = (GridView) findViewById(R.id.gridview);
            mGrid.setColumnWidth(95);
            Log.d("Mode", "land");
            // mGrid.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);

        }
        Log.d("savedUser", savedUser);
        if (savedUser.equals("admin")) { //value 0
            adapter.setApps(appManager.getApplications());
        } else if (savedUser.equals("prof")) { //value 1
            adapter.setApps(appManager.getTeacherApplications());
        } else {// default value
            appManager = new ApplicationManager(this, getPackageManager());
            appManager.loadApplications(true);
            bindApplications();
        }
}
47
Zizou

Wenn Ihre Aktivität wiederhergestellt wird, nachdem sie zuvor zerstört wurde, können Sie Ihren gespeicherten Status aus dem Bundle wiederherstellen, das das System für Ihre Aktivität übergeben hat. Sowohl die Rückrufmethode onCreate () als auch die Rückrufmethode onRestoreInstanceState () erhalten dasselbe Bundle, das die Instanzstatusinformationen enthält.

Da die onCreate () -Methode aufgerufen wird, ob das System eine neue Instanz Ihrer Aktivität erstellt oder eine vorherige neu erstellt, müssen Sie überprüfen, ob das Statusbündel null ist, bevor Sie versuchen, es zu lesen. Wenn der Wert null ist, erstellt das System eine neue Instanz der Aktivität, anstatt eine zuvor zerstörte Instanz wiederherzustellen.

static final String STATE_USER = "user";
private String mUser;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // Check whether we're recreating a previously destroyed instance
    if (savedInstanceState != null) {
        // Restore value of members from saved state
        mUser = savedInstanceState.getString(STATE_USER);
    } else {
        // Probably initialize members with default values for a new instance
        mUser = "NewUser";
    }
}

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    savedInstanceState.putString(STATE_USER, mUser);
    // Always call the superclass so it can save the view hierarchy state
    super.onSaveInstanceState(savedInstanceState);
}

http://developer.Android.com/training/basics/activity-lifecycle/recreating.html

43
Arvis
  • onSaveInstanceState() ist eine Methode zum Speichern von Daten vor dem Anhalten der Aktivität.

Beschreibung: Haken, mit dem eine Ansicht eine Darstellung ihres internen Status generieren kann, die später zum Erstellen einer neuen Instanz mit demselben Status verwendet werden kann. Dieser Status sollte nur Informationen enthalten, die nicht dauerhaft sind oder später nicht wiederhergestellt werden können. Beispielsweise werden Sie Ihre aktuelle Position niemals auf dem Bildschirm speichern, da dies erneut berechnet wird, wenn eine neue Instanz der Ansicht in ihrer Ansichtshierarchie platziert wird.

  • onRestoreInstanceState() ist eine Methode zum Zurückholen dieser Daten.

Beschreibung: Diese Methode wird nach onStart () aufgerufen, wenn die Aktivität aus einem zuvor gespeicherten Zustand, der hier in savedInstanceState angegeben ist, neu initialisiert wird. Die meisten Implementierungen verwenden einfach onCreate (Bundle), um ihren Status wiederherzustellen. Manchmal ist es jedoch zweckmäßig, dies hier zu tun, nachdem die gesamte Initialisierung abgeschlossen wurde, oder Unterklassen zu erlauben, zu entscheiden, ob Sie Ihre Standardimplementierung verwenden möchten. Die Standardimplementierung dieser Methode führt eine Wiederherstellung aller Ansichtszustände durch, die zuvor von onSaveInstanceState (Bundle) eingefroren wurden.

Betrachten Sie dieses Beispiel hier:
Ihre App verfügt über 3 Bearbeitungsfelder, in die der Benutzer einige Informationen eingegeben hat. Er erhält jedoch einen Anruf. Wenn Sie die oben genannten Methoden nicht verwendet haben, geht alles, was er eingegeben hat, verloren.
Speichern Sie also immer die aktuellen Daten in onPause() Aktivitätsmethode als Bündel & in onResume() Methode rufen Sie die onRestoreInstanceState() Methode auf.

Bitte sehen Sie:

Wie verwende ich das Beispiel onSavedInstanceState?

http://www.how-to-develop-Android-apps.com/tag/onrestoreinstancestate/

17
Shreyos Adikari

Dies geschieht, weil Sie savedValue in der onCreate() -Methode verwenden. Das savedValue wird in der onRestoreInstanceState() -Methode aktualisiert, aber onRestoreInstanceState() wird nach der onCreate() -Methode aufgerufen. Du kannst entweder:

  1. Aktualisieren Sie die Methode savedValue in onCreate() oder
  2. Verschieben Sie den Code, der die neue Methode savedValue in onRestoreInstanceState() verwendet.

Ich empfehle Ihnen jedoch, den ersten Ansatz zu verwenden und den Code so zu gestalten:

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

    int display_mode = getResources().getConfiguration().orientation;

    if (display_mode == 1) {

        setContentView(R.layout.main_grid);
        mGrid = (GridView) findViewById(R.id.gridview);
        mGrid.setColumnWidth(95);
        mGrid.setVisibility(0x00000000);
        // mGrid.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);

    } else {
        setContentView(R.layout.main_grid_land);
        mGrid = (GridView) findViewById(R.id.gridview);
        mGrid.setColumnWidth(95);
        Log.d("Mode", "land");
        // mGrid.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);

    }
    if (savedInstanceState != null) {
        savedUser = savedInstanceState.getString("TEXT");
    } else {
        savedUser = ""
    }
    Log.d("savedUser", savedUser);
    if (savedUser.equals("admin")) { //value 0
        adapter.setApps(appManager.getApplications());
    } else if (savedUser.equals("prof")) { //value 1
        adapter.setApps(appManager.getTeacherApplications());
    } else {// default value
        appManager = new ApplicationManager(this, getPackageManager());
        appManager.loadApplications(true);
        bindApplications();
    }
}
9
Eric Wu