2013年12月9日

Bundleとは

Bundle

画面の回転や他アプリが前面起動した際に変数が初期化されてしまう為、

事前に値を保存、それを取り出すときに使用します。

しかし筆者は上記保存機能は使用していません。

あたかも初期設定かのように決まり文句でついてきます。

public class MainActivity extends Activity{

@Override
protected void onCreate(Bundle savedInstanceState) {//ここです。
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}

通常何も設定しない場合savedInstanceStateにはnullが返ってくるようです。

でも、画面回転等で回避したい場合が出てきます。

では実際にBundleを使って保存、取り出しをしてみます。


  • void onSaveInstanceState(Bundle outState) //保存する
  • void onRestoreInstanceState(Bundle savedInstanceState) //復帰する


下記ソースでは"Hello World!"を"こんにちわ世界!"に切り替えてます。

図1 縦:初期画面
図2 縦:ボタンクリック後
さてここまでは普通です。

この画面(図2)を回転させます。エミュレータではCTRL+F11で画面回転します。

図3 画面回転後
と、通常ならば、せっかく日本語をセットした変数が初期化され"Hell World!"に戻ります。

これを回避するソースは以下。

図4 実行結果
MainAcitivity.java
public class MainActivity extends Activity implements OnClickListener{

private TextView textview1;

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

textview1 = (TextView)findViewById(R.id.textView1);

Button button1 = (Button)findViewById(R.id.button1);
button1.setOnClickListener(this);

}

@Override
protected void onSaveInstanceState(Bundle outState) {//Bundleに保存する
super.onSaveInstanceState(outState);

outState.putString("key", textview1.getText().toString() );//値を保存

}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) { //Bundleより復帰する
super.onRestoreInstanceState(savedInstanceState);

String _text = savedInstanceState.getString("key");//値を取り出す

textview1.setText("Bundle保存値:" + _text);//分かりやすいように保存値と追記します

}

@Override
public void onClick(View arg0) {
// TODO 自動生成されたメソッド・スタブ

textview1.setText("こんにちわ世界!");
   }
}

res/layout/activity_main.xml
<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:orientation="vertical"
    android:gravity="center" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20sp"
        android:text="@string/hello_world"
        />

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="日本語化" />


</LinearLayout>

0 件のコメント:

コメントを投稿