Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

夜子まま塾講義10(画面の呼び出し)

1,194 views

Published on

新しい画面を作成し、画面から画面を呼び出す方法を解説します

Published in: Technology
  • Be the first to comment

夜子まま塾講義10(画面の呼び出し)

  1. 1. Now Loading. Please Wait ... Twitter @yokmama Androidの別の画面の呼び出し① 夜子まま塾 講義10(画面連携 Intentによる呼び出し) Re:Kayo-System Co.,Ltd.Wednesday, March 7, 2012
  2. 2. 自己紹介 氏名   :寺園聖文(てらぞの まさふみ) 肩書   :株式会社Re:Kayo-System 代表取締役社長 活動拠点 :神戸近郊∼日本→海外行きたい 著書   :「10日でおぼえるAndroidアプリ開発入門教室」著(翔泳社)       「HTML5によるAndroidアプリ開発入門」監修(日経BP) アプリ  :「JUST PLAYER」「Skip Memo」「ふりがなオートマチック」等 好きなもの:アニメ、決して萌えじゃない、見てるけど、あくまで研究の一環 嫌いなもの:とくになし 最近のテーマ:電子工作、運動すること、英語 Re:Kayo-System Co.,Ltd.Wednesday, March 7, 2012
  3. 3. 新しい画面を作る ここまでは、HelloWorldで自動的に生成さ れた画面を修正してきましたが。 ここでは新規に画面を作成する手順を紹介 します。 Re:Kayo-System Co.,Ltd.Wednesday, March 7, 2012
  4. 4. 新規レイアウト作成 File→Android XML File layoutのフォルダ上で右クリックメニュー からでも同じ事ができます。 Re:Kayo-System Co.,Ltd.Wednesday, March 7, 2012
  5. 5. レイアウト情報入力 ① Resouce TypeでLayoutを選択 ② File名に submain.xmlを入力 ③ RelativeLayoutを選択 ④ 最後にFinishをクリック Re:Kayo-System Co.,Ltd.Wednesday, March 7, 2012
  6. 6. 作成されたレイアウト Graphical Layout XML <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/ android" android:layout_width="match_parent" android:layout_height="match_parent" > </RelativeLayout> このレイアウトにボタンとテキストを配置します。 Re:Kayo-System Co.,Ltd.Wednesday, March 7, 2012
  7. 7. レイアウトを編集 <?xml version="1.0" encoding="utf-8"?> ② 縦横がmatch_parentに <RelativeLayout なっていることを確認 xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/textView1" ③android_centerInParentに android:layout_width="wrap_content" android:layout_height="wrap_content" true を設定 android:text="Medium Text" android:layout_centerInParent="true" android:textAppearance="?android:attr/textAppearanceMedium" /> <Button ④幅をfill_parentにする android:id="@+id/button1" android:layout_width="fill_parent" android:layout_height="wrap_content" ⑤android:layout_margin android:layout_margin="5dip" android:layout_alignParentBottom="true" に5dipを設定 android:text="Back" /> </RelativeLayout> ⑥android:layout_alignParentBottom ①MediumTextとButtonを追加 にtrueを設定 ⑦android:text属に Back を設定 ※余計な属性が設定されている場合は削除してください。 Re:Kayo-System Co.,Ltd.Wednesday, March 7, 2012
  8. 8. 画面の説明 前の画面からもらった 文字列を表示 前の画面に戻るボタン Re:Kayo-System Co.,Ltd.Wednesday, March 7, 2012
  9. 9. 新規Javaクラス作成 File→Android XML File ykmjuku.android.sample007.appのパッケージ上 で右クリックメニューからでも同じ事ができます。 Re:Kayo-System Co.,Ltd.Wednesday, March 7, 2012
  10. 10. クラス情報入力 ①NameにSubMainと入力 ②Browseボタンをクリック ③Activityを入力 ④OKボタンをクリック ⑤最後にFinishをクリック Re:Kayo-System Co.,Ltd.Wednesday, March 7, 2012
  11. 11. 作成されたクラス package ykmjuku.android.sample007.app; import android.app.Activity; public class SubMain extends Activity { } このクラスに作成したレイアウトを表示する ように実装します。 Re:Kayo-System Co.,Ltd.Wednesday, March 7, 2012
  12. 12. Overrideメソッドの追加 ActivityのonCreateを Overrideします。 ①コードを挿入したい箇所に カーソルを移動し、右クリッ クメニューを呼び出す。 ②メニューからSource→Override/ Implement Methodsを選択 Re:Kayo-System Co.,Ltd.Wednesday, March 7, 2012
  13. 13. OnCreateメソッドの追加 package ykmjuku.android.sample007.app; import android.app.Activity; import android.os.Bundle; public class SubMain extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); } } ①ListからonCreateを選択する ② 追加を確認しCtrl+Sで保存する Re:Kayo-System Co.,Ltd.Wednesday, March 7, 2012
  14. 14. レイアウトの設定 ②setContentView(int layoutResID): void - Activityを選択 ①super.onCreateの下の行でsetまで 入力しctrl+spaceで入力補完を行う Re:Kayo-System Co.,Ltd.Wednesday, March 7, 2012
  15. 15. レイアウトの設定 ③同様にR.layoutまで入力し入力補 完ダイアログを表示する ④submain: int - R.layoutを選択 完成! Re:Kayo-System Co.,Ltd.Wednesday, March 7, 2012
  16. 16. 現在の状況 SubMain package ykmjuku.android.sample007.app; import android.app.Activity; import android.os.Bundle; public class SubMain extends Activity { @Override Android  ? protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.submain); } Framwork } 存在を知らない Re:Kayo-System Co.,Ltd.Wednesday, March 7, 2012
  17. 17. AndroidManifest.xmlを 開く ダブルクリック <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="ykmjuku.android.sample007.app" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="4" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <activity android:name=".Ykmjuku007Activity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> AndroidManifest.xmlタブを選択 Re:Kayo-System Co.,Ltd.Wednesday, March 7, 2012
  18. 18. Activityの宣言を追加 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="ykmjuku.android.sample007.app" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="4" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <activity android:name=".Ykmjuku007Activity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".SubMain" 追加 android:label="@string/app_name"> </activity> </application> </manifest> Re:Kayo-System Co.,Ltd.Wednesday, March 7, 2012
  19. 19. AndroidManifest.xmlに ついて AndroidManifest.xmlはAndroidアプリを作る上で必ず 一つ必要で、プロジェクトのトップ階層に置かなければ なりません。 このファイルには、ActivityやServiceといったアプリ内 の各画面やサービスの宣言や、動作可能なOSのバージョ ン、ハードウェアの種類、必要なパーミッションなどを 記述しています。 Re:Kayo-System Co.,Ltd.Wednesday, March 7, 2012
  20. 20. HelloWorldに見る AndroidManifest.xml ①必須タグです。またルートタ <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" グになります。アプリのバー package="ykmjuku.android.helloworld.app" android:versionCode="1" ジョンやパッケージを記述しま android:versionName="1.0" > す。 <uses-sdk android:minSdkVersion="14" /> <application ②動作可能なOSのバージョンで android:icon="@drawable/ic_launcher" android:label="@string/app_name" > す <activity android:name=".Ykmjuku003Activity" android:label="@string/app_name" > ③必須タグです。アプリ内に含 <intent-filter> <action android:name="android.intent.action.MAIN" /> まれるActivityやServiceなどを <category android:name="android.intent.category.LAUNCHER" 定義します。 /> </intent-filter> </activity> </application> ④作成したActivityクラスの宣 </manifest> 言です Re:Kayo-System Co.,Ltd.Wednesday, March 7, 2012
  21. 21. activity要素 android:name 実装されたJavaクラス名です。 manifestで指定したpackageからの相対パスあるいは絶対パスで指定します。 packageの直下のクラスの場合頭に . を付けなければなりません。 android:label Activityの名称です。タイトルバーに表示されます。 intent-filter 他のアプリとの連携の設定です。 後で説明します。 Re:Kayo-System Co.,Ltd.Wednesday, March 7, 2012
  22. 22. 追加したactivity要素 <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="ykmjuku.android.sample007.app" android:versionCode="1" android:versionName="1.0" > <省略> <activity android:name=".SubMain" android:label="@string/app_name"> </activity> package指定から ykmjuku.android.sample007.app.SubMain を指しています。 Re:Kayo-System Co.,Ltd.Wednesday, March 7, 2012
  23. 23. Activityの呼び出し 呼び出すクラスの情報をIntentに設定し、 startActivityを使って呼び出します。 Intentのコンストラクタ Intent(Context packageContext, Class<?> cls) 使用例 Intent intent = new Intent(this, SubMain.class); startActivity(intent); Re:Kayo-System Co.,Ltd.Wednesday, March 7, 2012
  24. 24. 呼び出しボタン追加 shift+ctrl+Rから、main.xmlを入力し同ファイルを開く <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView ボタンを追加 android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button" /> </LinearLayout> Re:Kayo-System Co.,Ltd.Wednesday, March 7, 2012
  25. 25. 呼び出し処理を実装 shift+ctrl+Tから、Ykmujuku007Activityを入力し同ファイルファイルを開く package ykmjuku.android.sample007.app; 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; public class Ykmjuku007Activity extends Activity { 追加 /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button btn = (Button)findViewById(R.id.button1); btn.setOnClickListener(new OnClickListener() { public void onClick(View v) { Intent intent = new Intent(Ykmjuku007Activity.this, SubMain.class); startActivity(intent); } }); } } Re:Kayo-System Co.,Ltd.Wednesday, March 7, 2012
  26. 26. プログラムを実行 クリック Re:Kayo-System Co.,Ltd.Wednesday, March 7, 2012
  27. 27. Intentとは Intentはアプリの情報を記述したクラスです。 設定されたIntentを使ってアプリを起動した り、アプリにメッセージを送ったりすること ができます。 Re:Kayo-System Co.,Ltd.Wednesday, March 7, 2012
  28. 28. パラメータを渡す Intentには、アプリの情報の他にパラメータ も設定できます。設定されたパラメータは、 呼び出された側で取得することができます。 Re:Kayo-System Co.,Ltd.Wednesday, March 7, 2012
  29. 29. Intentに設定 Intent putExtra(<キーの名前>, <設定する値>) でIntentに値を設定できます。 例) Intent intent = new Intent(Ykmjuku007Activity.this, SubMain.class); intent.putExtra("name", "夜子まま"); startActivity(intent); nameというキーで 夜子まま という値を設定している。 Re:Kayo-System Co.,Ltd.Wednesday, March 7, 2012
  30. 30. 呼び出し側の実装 package ykmjuku.android.sample007.app; 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; public class Ykmjuku007Activity extends Activity { private int mCount=0; 追加 /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button btn = (Button)findViewById(R.id.button1); btn.setOnClickListener(new OnClickListener() { public void onClick(View v) { Intent intent = new Intent(Ykmjuku007Activity.this, SubMain.class); intent.putExtra("label", "Ykmjuku007が呼び出した数:"+(++mCount)); startActivity(intent); } }); } } Re:Kayo-System Co.,Ltd.Wednesday, March 7, 2012
  31. 31. パラメータの取得 Intentに設定されたパラメータを取得す るにはActivityのもつgetIntentという メソッドを使って、呼び出しに使われた Intentを取得し設定されたパラメータを 取得することができます。 Re:Kayo-System Co.,Ltd.Wednesday, March 7, 2012
  32. 32. Intentから取得 String intent.getStringExtra(<キーの名前>) 取得する値に型によって変わる、int型 の場合は getIntExtraを使う 例 Intent intent = getIntent(); String name = intent.getStringExtra("name") nameというキーで設定された値を取得 Re:Kayo-System Co.,Ltd.Wednesday, March 7, 2012
  33. 33. 取得処理の実装 package ykmjuku.android.sample007.app; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; public class SubMain extends Activity { labelで設定された値を取得し @Override TextView1に設定 protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.submain); TextView textview = (TextView)findViewById(R.id.textView1); textview.setText(getIntent().getStringExtra("label")); Button btn = (Button)findViewById(R.id.button1); btn.setOnClickListener(new OnClickListener() { public void onClick(View v) { finish(); } おまけ、 }); } 戻るボタンの実装 finishでアプリ } を閉じることができます。 Re:Kayo-System Co.,Ltd.Wednesday, March 7, 2012
  34. 34. プログラムの実行 クリック 呼び出すとどんどん数字 が増える。 Re:Kayo-System Co.,Ltd.Wednesday, March 7, 2012
  35. 35. 戻り値の取得 呼び出したアプリから戻り値を取得する場 合もIntentを使います。 また戻り値を取得する場合は専用のメソッ ドで呼び出し、かつ、専用のメソッドで受 け取る必要があります。 Re:Kayo-System Co.,Ltd.Wednesday, March 7, 2012
  36. 36. 戻り値付きの呼び出し void startActivityForResult(Intent, <リクエストID>) リクエストIDはInt型の数値です。値を取得する際 に誰に呼び出されたかを判断する際に使います。 例 startActivityForResult(intent, 0); リクエストIDを0で呼び出す ※その場で結果が取得できないところがポイントです。 Re:Kayo-System Co.,Ltd.Wednesday, March 7, 2012
  37. 37. 戻り値の設定 戻り値はActivityが終了剃る前に専用 のメソッド設定します。 void setResult(<戻り値のID>、Intent) Activityに準備されている成功時に使う定数。この 他にもRESULT_CANCELDなどがある。 第三者のアプリからも呼ばれることを考える場合、 例 デフォルトの定数を使うのが望ましい Intent intent = new Intent(); intent.putExtra("result", textview.getText()); setResult(RESULT_OK, intent); Re:Kayo-System Co.,Ltd.Wednesday, March 7, 2012
  38. 38. 戻り値の取得 ActivityのもつonActivityResultに結 果が帰ってくるので、このメソッドを Overrideして結果を取得します。 protected void onActivityResult (int requestCode, int resultCode, Intent data) 例 呼び出すときに設定した値 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if(requestCode == 100){ //処理 } 戻ってきた値 } Re:Kayo-System Co.,Ltd.Wednesday, March 7, 2012
  39. 39. 呼び出し側の実装 package ykmjuku.android.sample007.app; <省略> public class Ykmjuku007Activity extends Activity { private final int REQUEST_ID = 0; private int mCount=0; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); 追加 setContentView(R.layout.main); Button btn = (Button)findViewById(R.id.button1); btn.setOnClickListener(new OnClickListener() { public void onClick(View v) { Intent intent = new Intent(Ykmjuku007Activity.this, SubMain.class); intent.putExtra("label", "Ykmjuku007が呼び出した数:"+(++mCount)); startActivityForResult(intent, REQUEST_ID); } } }); 変更 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if(requestCode == REQUEST_ID){ Button btn = (Button)findViewById(R.id.button2); if(resultCode == RESULT_OK){ btn.setText("OK:"+data.getStringExtra("result")); } else{ btn.setText("ERROR:"+data.getStringExtra("result")); } } } } Re:Kayo-System Co.,Ltd.Wednesday, March 7, 2012
  40. 40. 呼び出された側の実装 package ykmjuku.android.sample007.app; <省略> public class SubMain extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.submain); TextView textview = (TextView)findViewById(R.id.textView1); textview.setText(getIntent().getStringExtra("label")); Button btn = (Button)findViewById(R.id.button1); btn.setOnClickListener(new OnClickListener() { public void onClick(View v) { 追加 TextView textview = (TextView)findViewById(R.id.textView1); Intent intent = new Intent(); intent.putExtra("result", textview.getText()); setResult(RESULT_OK, intent); finish(); } }); } } Re:Kayo-System Co.,Ltd.Wednesday, March 7, 2012
  41. 41. ここまでのコードの サンプル プロジェクト名:ykmjuku007 http://bit.ly/zJfDY0 Re:Kayo-System Co.,Ltd.Wednesday, March 7, 2012
  42. 42. 中級向け 問題 これまで作った電卓プログラムと 新しい画面を連携させてみよう。 前回作った電卓 計算 1 1 1 1 1 1 1 1 1 1 1 1 計算結果を返し、テキストボッ ykmjuku008 クスに設定する http://bit.ly/x4rOm5 Re:Kayo-System Co.,Ltd.Wednesday, March 7, 2012
  43. 43. ダイアログは? 続きは夜子まま塾オンライン(無料)にて 毎週水曜日夜10:30∼11:00 (都合によりない場合もあります) 夜子まま塾 http://bit.ly/wTjjix GoogleID:101190223376062765723 上記アカウントをサークルに追加していると、 ハングアウトのお誘いが届きます。 是非ご参加ください。 Re:Kayo-System Co.,Ltd.Wednesday, March 7, 2012

×