0

Ich schreibe ein Programm, wo ich mehrere Layouts auf der gleichen Aktivität aufrufen, aber dann bemerkte ich, dass wenn ich Layouts wechseln, die vor dem Wechsel vorgenommenen Änderungen nicht wiederhergestellt werden und onSavedInstanceState(Bundle outState) nicht aufgerufen wird. Ich habe versucht, die Methode manuell aufzurufen, aber ich kann das Bundle outState nicht abrufen.So rufen Sie onSaveInstanceState() manuell

Die Frage ist also wirklich: Wie bekomme und speichere ich den aktuellen Status einer Aktivität, die zu einem Zeitpunkt meiner Wahl abgerufen und/oder wiederhergestellt werden soll?

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_contact_view); 
// more code 
} 

@Override 
public void onBackPressed() { 
    if (layoutId == R.layout.activity_contact_view) exit(); 
    else if (layoutId == R.layout.main) { 
     Toast.makeText(NsdChatActivity.this, "Successful back button action", Toast.LENGTH_SHORT).show(); 
     setContentView(R.layout.activity_contact_view); 
     refreshContactList(); 
    } 
} 

Und dann von einer separaten Klasse

public void updateList(final int found) { 
    LinearLayout layxout = (LinearLayout) ((Activity)mContext).getWindow().getDecorView().findViewById(R.id.others); 
    TextView t = new TextView(mContext); 
    t.setClickable(true); 
    t.setText(found + ". " + activity.sNames.get(found)); 
    t.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); 
    t.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      //show chat view 
      activity.setContentView(R.layout.main); 
      TextView name = (TextView)activity.findViewById(R.id.clientName); 
      name.setText(activity.sNames.get(found).split(" \\(")[0]); 
      final ScrollView scroll = (ScrollView)activity.findViewById(R.id.scroll); 
      scroll.setOnFocusChangeListener(new View.OnFocusChangeListener() { 
       @Override 
       public void onFocusChange(View view, boolean b) { 
        scroll.fullScroll(View.FOCUS_DOWN); 
       } 
      }); 
     } 
    }); 
    layxout.addView(t); 
} 
+0

Führt das Wechseln des Layouts dazu, dass die Aktivität implizit neu erstellt wird? Wenn nicht, wird 'onSavedInstanceState (Bundle outState)' nicht aufgerufen. – Enzokie

+0

Verzeih mir, aber kannst du erklären, was du meinst, wenn du "implizit neu erschaffen" sagst? Ich benutze 'setContentView()', um zwischen den Layouts zu wechseln. – kbluue

+0

Ein gutes Beispiel wird sein: wenn Sie das Gerät drehen, wird die Aktivität zerstört und neu erstellt, so dass es sich um eine implizite Aktivitätserholung handelt, da Sie nie sagen, dass die Aktivität neu erstellt werden soll. – Enzokie

Antwort

0

sein kann man einen Blick auf Application Fundamentals

Android ruft onSaveInstanceState(), bevor die Aktivität anfällig wird durch die Zerstörung haben sollte System, aber es stört nicht, es aufzurufen, wenn die Instanz tatsächlich durch eine Benutzeraktion zerstört wird (z. B. durch Drücken der Taste ZURÜCK)

so Sie Aufruf mehrere Layouts auf der gleichen Aktivität kann nicht die oben genannte Situation verursachen. Für weitere Details können Sie sich auf die Frage Android: Saving a state during Android lifecycle beziehen. Ich hoffe, das hilft!

+0

War hilfreich, aber ich habe das schon überprüft. Was ich jetzt möchte, ist in der Lage zu sein, den aktuellen Stand meiner Tätigkeit aufzuzeichnen und zu speichern. – kbluue

+0

Bitte zeigen Sie Ihren Code. – duan

0

Ich könnte dafür zu spät kommen, aber was Sie tun könnten, ist Ihren Zustand als Mitglied der Klasse zu halten. Auf diese Weise können Sie den Status jederzeit wiederherstellen.

Bundle mState; 

@Override 
public void onSaveInstanceState(Bundle savedInstanceState) { 
    // Save the state 
    savedInstanceState = mState; 
    super.onSaveInstanceState(savedInstanceState); 
} 
@Overrite 
public void onRestoreInstanceState(Bundle savedInstance){ 
    mState = savedInstance; 
    Restore(); 
} 

public void Restore(){ 
    //access your state and restore 
} 

Auch sollten Sie setContentView nicht verwenden, um zwischen Ansichten zu wechseln, es ist teurer Weg, es zu tun. Vielleicht möchten Sie überprüfen, ViewSwitcher oder ViewFlipper oder irgendwie Fragmente zu implementieren.