OnSaveInstanceState & OnResoreInstanceState

Ekran döndürülürken activity için destroy metodu çağrıldığından bütün datalar yok edilir.Kaybolmasını istemediğimiz dataları önce kaydetmek gerekir.

Metodların Sırası

  • onCreate
  • onStart
  • onRestart - onRestoreInstanceState
  • onResume
  • onPause
  • onSaveInstanceState
  • onStop
  • onDestroy

Destroy edilmeden önce onSaveInstanceState metodu çağrılır. burada kaydedilecek olan datalar parametre olarak tanımlanan Bundle içerisine kaydedilir.

Kısayol olarak ; alt + instert >Override Methods >onRestoreInstanceState && onSaveInstanceState metodları seçilerek override edilir.

onSaveInstanceState Metodu

  • Bundlea kaydetme işlemleri

    • bundle.putInt("PEOPLESIZE", size);
    • bundle.putDouble("KEY" , 0.125);
    • bundle.putString("KEY" ,"DEGER");
    • bundle.putStringArray("KEY", strArray )
  • Bundle'a kaydedilen değerlerin key valuelerinin farklı olması gerekir.

  • Bir List,dizi kaydediliyorsa dizinin uzunluğu da kayıt edilmeli.

onRestoreInstanceState Metodu

  • bundle.get("KEY") ile Object geri döndürülür.
  • bundle.getInt("KEY") ile INT türünden değer alınır.
  • bundle.geStringArray("KEY") String dizisi döndürür.
  • bundle.getInt("KEY" , defaultVal); exception oluşmaması için KEY değeri içeride bulunamazsa defaultVal döner.

  • bundle.putStringArray("PERSON1" , personStr) diyerek person'un tuttuğu dataları önceden personStr String dizisine eklenir.Ve putStringArrayle "PERSON1" keyine atanmis olur. bundle.getStringArray("PERSON1") diyerek String[] elde edilir.


Örnek Kod

  • Person sınıfında TC Kimlik , isim , yaş bilgilieri tutuyo.
  • EditTextlere girilen datalar Kaydet butonuyla m_list içerisine kaydediliyo
  • Göster butonu m_list içerisindeki Personları ekrana basar.
  • EditTextler
    • MAINACTIVITY_EDITTEXT_CITIZENID tc kimlik no için
    • MAINACTIVITY_EDITTEXT_NAME isim girmek için
    • MAINACTIVITY_EDITTEXT_AGE yaşı girmek için
  • Butonlar
    • MAINACTIVITY_BUTTON_SAVE onClick metodu : saveClickedProc
    • MAINACTIVITY_BUTTON_SHOW onClick metodu : showClickedProc
  • onSaveInstanceState içerisinde
    • m_list.size bundle a yazıldı.Okuma sırasında kaç eleman okumak gerektiğini bilmek gerektiği için.
    • m_list içerisindeki her bir Persona ait datalar String dizisine kaydedilir.
    • Bu String dizisi de Person-1 Person-2 şeklindeki keylerle bundle a kaydedilir.
  • onRestoreInstanceState içerisinde
    • Size datasi LISTSIZE keyinden okunur.
    • Size kadar "Person-"+i keyleri okunur.String dizisi elde edilir.Her bir eleman sirasiyla citizen name ve age içerisine atılır.

activity_main.xml

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    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="org.csystem.mytestcode.MainActivity"
    android:orientation="vertical">


    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <EditText
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:id="@+id/MAINACTIVITY_EDITTEXT_CITIZENID"
            android:layout_weight="1"
            android:inputType="number"
            android:text="TC Kimlik"
            android:maxLength="11"/>

        <EditText
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:id="@+id/MAINACTIVITY_EDITTEXT_NAME"
            android:layout_weight="1"
            android:inputType="textAutoComplete"
            android:maxLength="10"
            android:text="Ad"/>

        <EditText
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:inputType="number"
            android:ems="10"
            android:text="Yas"
            android:id="@+id/MAINACTIVITY_EDITTEXT_AGE"
            android:layout_weight="1"/>

    </LinearLayout>

    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical">

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="KAYDET"
            android:id="@+id/MAINACTIVITY_BUTTON_SAVE"
            android:onClick="saveClickedProc"
            />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="GOSTER"
            android:id="@+id/MAINACTIVITY_BUTTON_SHOW"
            android:onClick="showClickedProc"
            />
    </LinearLayout>

</LinearLayout>

MainActivity.java

package org.csystem.mytestcode;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

import org.csystem.Person;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity
{

    private EditText m_edittextName , m_editTextAge , m_edittextCitizenID;

    private List<Person> m_list;


    private void init()
    {
        gatherViews();
        m_list = new ArrayList<>();
    }


    private void gatherViews()
    {
        m_editTextAge = (EditText) this.findViewById(R.id.MAINACTIVITY_EDITTEXT_AGE);
        m_edittextName = (EditText) this.findViewById(R.id.MAINACTIVITY_EDITTEXT_NAME);
        m_edittextCitizenID = (EditText) this.findViewById(R.id.MAINACTIVITY_EDITTEXT_CITIZENID);
    }


    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        this.init();

    }


    @Override
    protected void onSaveInstanceState(Bundle bundle)
    {
        super.onSaveInstanceState(bundle);

        int size = m_list.size();
        bundle.putInt("LISTSIZE", size);

        for(int i=0 ; i< size ;i++)
        {
            String[] personStr = new String[3];

            personStr[0] = m_list.get(i).getCitizenID();
            personStr[1] = m_list.get(i).getName();
            personStr[2] = String.valueOf(m_list.get(i).getAge());

            bundle.putStringArray("Person-" + i, personStr);
        }
    }


    @Override
    protected void onRestoreInstanceState(Bundle bundle)
    {
        super.onRestoreInstanceState(bundle);

        int size = bundle.getInt("LISTSIZE");
        for(int i=0 ; i< size ;i++)
        {
            String[] personStr =bundle.getStringArray("Person-"+i);
            m_list.add(new Person(personStr[0], personStr[1], Integer.parseInt(personStr[2])));
        }
    }



    public void saveClickedProc(View v )
    {
        String name = m_edittextName.getText().toString();
        String id = m_edittextCitizenID.getText().toString();
        int age = Integer.parseInt( m_editTextAge.getText().toString());

        m_list.add(new Person(id, name, age));
        Toast.makeText(this , String.format("[%s] %s-%d",id , name, age ) , Toast.LENGTH_SHORT).show();
    }


    public void showClickedProc(View v )
    {
        String toastmsg= "";
        for(Person p : m_list)
            toastmsg += p.toString()+'\n' ;

        Toast.makeText(this , toastmsg ,Toast.LENGTH_SHORT).show();
    }
}

Person.java

package org.csystem;

public class Person
{
    private String m_CitizenID;
    private String m_Name;
    private int m_Age;

    public Person(String citizenID , String name , int age)
    {
        m_CitizenID = citizenID;
        m_Name = name;
        m_Age = age;
    }

    @Override
    public String toString() 
    {
        return String.format("[%s] %s-%d",m_CitizenID , m_Name , m_Age);
    }

    public String getCitizenID(){ return m_CitizenID; }

    public void setCitizenID(String citizenID){ this.m_CitizenID = citizenID; }

    public String getName(){ return m_Name; }

    public void setName(String name){ this.m_Name = name; }

    public int getAge(){ return m_Age; }

    public void setAge(int age){ this.m_Age = age; }
}