戻る
Android備忘録(画面遷移-2)
ボタンをクリックすると画面遷移が発生する
Android備忘録
アクティビティーにデータを渡すアプリケーション
画面遷移をするアプリは非常に一般的である。今回の備忘録は画面遷移をしながら、データをも相互に渡すという方法である。
またAndroidManifest.xmlはAndroid備忘録(画面遷移-1)と同じなので省略する。
画面がTextViewとButtonで構成されている二つの画面レイアウト(main.xmlとsub.xml)を作る。
main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/TextView01"
android:text="第一画面です。"
android:textSize="24sp"
android:gravity="center_horizontal"/>
<EditText android:id="@+id/EditText01"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:hint="第二画面用表示文字"/>
<Button android:id="@+id/Button01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="第二画面に移行"
android:gravity="center"/>
</LinearLayout>
sub.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="24sp"
android:text="第二画面です。"
android:gravity="center_horizontal" android:id="@+id/TextView02"/>
<EditText
android:layout_height="wrap_content"
android:id="@+id/EditText02"
android:hint="第一画面用表示文字列"
android:layout_width="fill_parent"/>
<Button
android:id="@+id/Button02"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="第一画面に戻る"/>
</LinearLayout>
解説
拡張データの登録
インテントというのはメッセージのオブジェクトですので、それに対してさまざまなデータを
登録することができる。
インテントが持っているputExtra というメソッドを呼び出すことによって、「拡張データ」(extended data) と呼ばれるデータをそのインテントに登録することが出来る。
拡張データは、キーと値のペアという形のデータだ。インテントを受け取ったオブジェクト
は、キーを指定することによって、それに対応づけられている値を取得することができる。
キーとしては、アプリケーションのパッケージ名を接頭辞として持つ文字列を使うとよい。たと
えば、
testintent.syakazuka.com
インテントの取得
インテントが持っているデータをインテントから取得するためには、その前に、そのイ
ンテント自体を取得する必要がある。
アクティビティーは、
Intent getIntent()
というメソッドを持っている。このメソッドは、アクティビティーが受け取ったインテントを
戻り値として返す。
アクティビティーの起動
複数の画面を扱うAndroid アプリケーションを作るためには、それぞれの画面ごとに、それ
を生成するアクティビティーを作る必要がある。
Android アプリケーションは、画面を現在のものから別のものに切り替えるとき、その画面を
生成するアクティビティーを起動する。
アクティビティーからアクティビティーを起動したいときは、通常、アクティビティーが持っ
ている、
拡張データのマップの取得
インテントから、そこに登録されている拡張データの値を取得するためには、拡張データの
マップ( Bundle クラスのオブジェクト)をインテントから取得して、そのマップから拡張デー
タの値を取得する、という2 段階の処理をしなければならない。
拡張データのマップは、インテントが持っている、
Bundle getExtras()
というメソッドを呼び出すことによって取得することができる。このメソッドは、拡張データ
のマップをインテントから取得して、それを戻り値として返す。インテントに拡張データが
登録されていない場合は、null を返す。
拡張データの値の取得
拡張データの値は、拡張データのマップが持っている以下のようなメソッドを使うことによって
取得することが出来る。
- boolean getBoolean(String key)
- int getInt(String key)
- String getString(String key)
- boolean[] getBooleanArray(String key)
- int[] getIntArray(String key)
- String[] getStringArray(String key)
これらのメソッドは、拡張データのキーを引数として受け取って、そのキーに対応する値を戻
り値として返す。
(注意)今回は重要ポイントとその対応を緑青赤で色分けした。
TestIntentActivity.java
package testintent.syakazuka.com;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class TestIntentActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
String ttl="";
final TextView textview1=(TextView) findViewById(R.id.TextView01);
Bundle extras=getIntent().getExtras();
if(extras !=null ){
ttl=extras.getString("testintent.syakazuka.com.ttl");//SubActivityで渡されたキーのデータを取得する
}
if(ttl.trim().length() == 0) ttl="第一画面です。";
textview1.setText(ttl);
final Button bt1 = (Button) findViewById(R.id.Button01);
bt1.setOnClickListener(new OnClickListener(){
public void onClick(View v){
startSubActivity();
}
});
}
private void startSubActivity(){
final EditText inputText=(EditText) findViewById(R.id.EditText01);
String ttl=inputText.getText().toString();
Intent intent=new Intent(this,SubActivity.class);
intent.putExtra("testintent.syakazuka.com.ttl", ttl);//赤字はキー
startActivityForResult(intent,0);
}
}
SubActivity.java
package testintent.syakazuka.com;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class SubActivity extends Activity {
private EditText inputText;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
String ttl="";
setContentView(R.layout.sub);
final TextView textview2=(TextView) findViewById(R.id.TextView02);
Bundle extras=getIntent().getExtras();
if(extras !=null ){
ttl=extras.getString("testintent.syakazuka.com.ttl");//TestIntentActivityで渡されたキーのデータを取得する
}
if(ttl.trim().length() == 0){ ttl="第二画面です。";}
textview2.setText(ttl);
inputText=(EditText) findViewById(R.id.EditText02);
inputText.selectAll();
final Button bt2=(Button) findViewById(R.id.Button02);
bt2.setOnClickListener(new OnClickListener(){
public void onClick(View v){
startTestIntentActivity();
}
});
}
public void startTestIntentActivity(){
final EditText inputText=(EditText) findViewById(R.id.EditText02);
String ttl=inputText.getText().toString();
Intent intent=new Intent(this,TestIntentActivity.class);
intent.putExtra("testintent.syakazuka.com.ttl", ttl);//赤字はキー
startActivityForResult(intent,0);
}
}
|