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çinMAINACTIVITY_EDITTEXT_NAME
isim girmek içinMAINACTIVITY_EDITTEXT_AGE
yaşı girmek için
- Butonlar
MAINACTIVITY_BUTTON_SAVE
onClick metodu : saveClickedProcMAINACTIVITY_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; }
}