非推奨メソッド等の掲載について

Similar documents
android2.indd


Hello, Android

2-2. TableLayout TableLayout は任意のビューを表形式で配置したい場合に利用する (HTML の Table に近いイメー ジ ) 2-3. FrameLayout ビューを重ねて表示するためのレイアウト 後から配置した部品が前面に来る仕様となっている 3. まとめ レイア

Android osの歴史 1.6から2.3まで携帯のみ 3.0 タブレットのみ 4.0 タブレットで培ったUIなど の技術を携帯でも 使えるとうにと APIなんかが統合された

補足資料 インテントによるアプリケーションとアクティビティの呼出し Android アプリのキモとなるインテントとは何? インテント ( 呼び出し要求 ) とは Android 独自の機能です 簡単にいえばアプリケーションや他のアクティビティを呼び出す機能ですが 他のアプリケーションを機能や扱えるデ

ファイルを直接編集する画面を切り替えることができる. 図 3 標準のレイアウトを削除する (2) グラフィカル レイアウト画面で LinearLayout(Vertical) を追加するパレットウィンドウの レイアウト の中にある LinearLayout(Vertical) をドラッグして, 編集

Microsoft Word - Android_SQLite講座_画面800×1280

Taro-korattsu.jtd

Prog2_6th

Prog2_2nd

Prog2_2nd

Prog2_6th

Prog2_5th

Microsoft Word - Android_DI講座_画面800×1280

Another Activity オブジェクトは生成されてもいないのである これは 後述の onpause メソッ ドの説明からも明らかである 翻訳 : A の onpause から返ってこない限り B は create されない ため ここで長い処理は行ってはならない 実際にトレースをおこなってみ

Prog2_10th

intra-mart Accel Platform — イベントナビゲータ 開発ガイド   初版  

Taro-twokansu3.jtd

mazec テクニカルガイド第5版(Android版)

Prog2_9th

補足資料 キーイベント処理サンプル package jp.co.keyevent; import android.app.activity; import android.os.bundle; import android.view.keyevent; import android.widget.t

Prog2_6th

「Android Studioではじめる 簡単Androidアプリ開発」正誤表

MasterDetailFlow SettingsActivity 2. Android Lint Checks 以前のバージョンよりコンパイルのチェックが厳しくなりました このような厳しいチェックを Android Lint Checks と言います Abdroid プログラミング Bible で

そして 取得した OutputStream インスタンスを使い 文字コードは UTF-8 として PrintWriter インスタンスを生成して あとは PrintWriter.append() で書き込みたい文字 列を渡して close() で保存する というだけです ファイルの読込み方法 それで

Microsoft Word - Android_DI講座_画面800×1280

1: Android 2 Android 2.1 Android 4 Activity Android Service ContentProvider BroadcastReceiver Activity ( ): Android 1 Android Service ( ): ContentProv

Prog2_10th

Microsoft Word - Android_DI講座_画面800×1280

第1章 ビジュアルプログラミング入門

日 力力 生 行行 入 入 力力 生 用 方

intra-mart Accel Platform — イベントナビゲータ 開発ガイド   初版   None

Android :

Microsoft Word - A05_AndroidプログラミングJUMP_画面800×1280

情報更新日 :2012/5/20 サンプルソースの文字化けについて [ トラブル事例 ] Eclipse に ダウンロードしたソースコードをインポートすると文字化けが起きる ( 関連箇所 : 0-1 はじめに ) [ 回答 ] 本書でその利用を前提としております Tech Fun Eclipse は

Microsoft Word - Android_SQLite講座_画面800×1280

intra-mart Accel Platform

プレポスト【問題】

ボタンイベントアプリイベント処理を含むアプリとして, ボタンをもち, ボタンを押すと文字列を表示するアプリを作る. このアプリは,HelloWorld アプリを改造して作成するため, アプリ作成の途中からの手順を示す. 1. ボタンの設置 (1) レイアウトにボタンを追加するパレットの フォーム ウ

テーブルの確認 sqlite>.tables.tables コマンドでデータベース内のテーブル一覧を表示する テーブルスキーマの表示 sqlite>.schema mytable.schema コマンドで指定のテーブルのスキーマを表示できる テーブル出力の整形.explain コマンドを使うと テー


Android Layout SDK プログラミング マニュアル

intra-mart Accel Platform — IM-共通マスタ スマートフォン拡張プログラミングガイド   初版  

Android でサービスしよう! 日本 Android の会 2 月 21 日大阪セミナ- 有山圭二 ( 有限会社シーリス )

プログラミング基礎I(再)

Microsoft PowerPoint ppt

プロジェクト毎に名前を指定する ( ここでは AndroidTest) 動作可能な最低バージョン メインターゲットのバージョン すべて設定してクリック チェックを外す クリック

2 // TODO Auto-generated method stub float x = event.getx(); float y = event.gety(); String action = ""; switch(event.getaction()) { case MotionEvent.

PowerPoint プレゼンテーション

スライド 1

Prog2_5th

プログラミング入門1

JavaプログラミングⅠ

About me! 足立昌彦 / +Masahiko.Adachi )! バイドゥ株式会社技術顧問 (Simeji)! 株式会社カブク Co-Founder! Google Developer Expert (Android)

玉転がしタブレット端末の特徴の一つとして, センサを使った動作や, 指による画面操作がある. それらを活用して, 図形を動かすアプリの例を示す. 1. プロジェクトを作る Tama アプリケーションを作る,Tama プロジェクトを作る. 図 1 プロジェクト作成 プロジェクトの構成を設定する. 図

26 editor.putint(pref_count_key, executecount); 27 // 変更した Preference を確定させる 28 editor.commit(); 29 } (c) 実行の様子実装して実行した様子を図 1 と図 2 に示す. 一度実行するごとに, カウン

た場合クラスを用いて 以下のように書くことが出来る ( 教科書 p.270) プログラム例 2( ソースファイル名 :Chap08/AccountTester.java) // 銀行口座クラスとそれをテストするクラス第 1 版 // 銀行口座クラス class Account String name

Microsoft Word - _Intent.doc

GEC-Java

Javaプログラムの実行手順

1: Preference Display 1 package sample. pref ; 2 3 import android. app. Activity ; 4 import android. content. Intent ; 5 import android. content. Shar

PowerPoint プレゼンテーション

android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content"> <Button android:text="go"

Microsoft PowerPoint - chap10_OOP.ppt

更新履歴 No 更新箇所版数日付 1 第一版作成 /12/28 2 一部画像差し替え 誤字修正 /02/09 2

スマートにプログラミング Android 入門編第 2 版 SDK4/2.3 対応 よくあるご質問 (FAQ) ここでは 読者の皆様から寄せられた質問の中で 比較的多く見受けられたトラブル事例とその解決策を集め掲載致しました お困りの際の解決のヒントとしてご利用下さい なお スマートにプログラミング

HCI プログラミング 8 回目ボタン チェックボックス ラジオボタン 今日の講義で学ぶ内容 ボタンとアクションイベント ボタンのカスタマイズ チェックボックスとラジオボタン ボタンとアクションイベント 1 ボタンを配置してみましょう ボタンは ラベルと同じようにフォントやその色 画像の貼り付けなど

Java講座

基本情報STEP UP演習Java対策

android2.indd

BizBrowser SmartDevice Android開発用スタートアップガイド

Prog1_6th

2

1. はじめに本手順書は インテリジェントウェイブ社 ( 以下 IWI 社 ) の株主のお客様が IWI 社から株主優待として配布された Doctor Web 社のアンチウイルス製品 ( 以下 Dr.Web Anti-Virus) のバージョン のいずれかをご利用中で 同製品のバー

Prog2_12th

Microsoft PowerPoint - prog03.ppt

V8.1新規機能紹介記事

第1章 ビジュアルプログラミング入門

解答上の注意 1 解答は 解答 紙の問題番号に対応した解答欄にマークしなさい 2 選択肢は 問ごとに 意されています 問 1の選択肢は 問 2で使 しません 3 選択肢は量が多いため 探しやすさの観点よりグループ分けされています グループ分けに合わせて解答欄が区切られていますが 横 1 列で問題 1

1.SqlCtl クラスリファレンス SqlCtl クラスのリファレンスを以下に示します メソッドの実行中にエラーが発生した場合は標準エラー出力にメッセージを出力します (1)Connect() メソッド データベースへ connect 要求を行います boolean Connect(String

PowerPoint プレゼンテーション

2-1 KeyEvent 概要 KeyEvent クラスはアンドロイド端末のキーに対するイベントの定数 基本メソッドを提供するオブジェクトです クラス図は次のようになっています java.lang.object android.view.keyevent 2-2 KeyEvent.Callback

HCI プログラミング 10 回目テキストフィールドとキーイベント 今日の講義で学ぶ内容 テキストフィールドの利用 キーイベントの処理 テキストフィールドの利用 1 テキストフィールドを配置してみましょう テキストフィールドを用いることにより 数値や文字列などのデータ入力が可能になります ソースファ

第1章 ビジュアルプログラミング入門

JAVA入門

Microsoft Word - 第七週Java講座.docx

WebOTXマニュアル

メソッドのまとめ

Microsoft PowerPoint - OOP.pptx

オブジェクト指向プログラミング・同演習 5月21日演習課題

Java知識テスト問題

Eclipse 操作方法 (Servlet/JSP 入門補助テキスト)

JavaプログラミングⅠ

文字列操作と正規表現

Microsoft PowerPoint Java基本技術PrintOut.ppt [互換モード]

Microsoft PowerPoint - prog09.ppt

JAVA とテンプレート

Microsoft PowerPoint - prog09.ppt

Java - Visual Editor

Transcription:

非推奨メソッド等の掲載について スマートにプログラミング Android 入門編第 2 版 SDK 4/2.3 対応 (2012 年 6 月 11 日発行第 2 版第 1 刷 ) において 一部現在では非推奨となったレイアウト及びメソッドの利用が掲載されておりました お詫びと共に補足 訂正させて頂きます 下記にその対応について示します 株式会社リックテレコム書籍出版部 ( 情報更新日 :2012.8.14) 非推奨レイアウト コマンド掲載箇所推奨レイアウト コマンド 1 FrameLayout あるいは AbsoluteLayout onstart メソッド managedquery メソッド TabActivity Chapter 4 レイアウトとビュー (132 頁 ) Chapter 7 サービス 263 頁以降数カ所 Chapter 9 コンテントプロバイダ 380 頁以降数カ所 Chapter 10 ダイアログ メニュー タブ 10-3 タブ 全体 RelativeLayout といった 自分でカスタマイズしたレイアウトを代わりに使用するよう推奨されています onstartcommand メソッドが推奨されています 二つのメソッドの比較についてはこちらをご参照下さい ( 本文の訂正版 PDF は現在作成中です 詳しくは book-q@ric.co.jp までお問い合わせ下さい ) ContentResolver の query メソッドが推奨されています ( 本文の訂正版 PDF は現在作成中です 詳しくは book-q@ric.co.jp までお問い合わせ下さい ) Action Bar 及び Fragment という機能を使用するよう推奨されています ( 追加となる参照 PDF はこち 1 2012 年 7 月時点の推奨です Copyrights 2003-2012 RIC TELECOM All Rights Reserved. 1

らです ) Copyrights 2003-2012 RIC TELECOM All Rights Reserved. 2

Service クラスの onstart()/onstartcommand() メソッド 1. 二つのメソッド サービスは アクティビティなどから startservice() メソッドで起動されます 対象のサービスが起動していない場合 oncreate() メソッドが呼び出されます その後に onstart() メソッド または onstartcommand() メソッドが呼び出されます 前者の onstart() メソッドは Android 1.6(API レベル 4) までで使用されていたメソッドで API レベル 5 以降は非推奨となり 代わりに onstartcommand() メソッドを使用するように推奨されました したがって API レベル 5 以降を対象とする場合は onstart() メソッドではなく onstartcommand() メソッドを使用するようにしましょう 開発対象が API レベル 5 以降の場合 onstart() がオーバライドされていて onstartcommand() がオーバライドされていない場合 onstart() メソッドが呼び出されます onstart() と onstartcommand() の両方がオーバライドされている場合 onstartcommand() メソッドのみが呼び出されます API レベル 4 までを対象とする場合 onstart() メソッドと onstartcommand() メソッドの両方を実装します **** onstart メソッド : void onstart(intent intent, int startid) onstartcommand() メソッド : int onstartcommand(intent intent, int flags, int startid) **** 2.onStartCommand() メソッドの戻り値 onstart() メソッドには 戻り値がありませんでしたが onstartcommand() メソッドには int 型の戻り値があります onstartcommand() メソッドをオーバライドするときに 以下の定数のうちどれかを return することでサービスが強制終了されたあとのサービスの動作を指定できます START_NOT_STICKY サービスが強制終了した場合 サービスは再起動しません 不必要にサービスの再起動がされないため サービスを安全に制御できます START_STICKY サービスが強制終了した場合 サービスが再起動されます onstartcommand() メソッ Copyrights 2003-2012 RIC TELECOM All Rights Reserved. 3

ドが再度呼び出されますが 引数の Intent には null が渡されます サービスの停止をし ない限りは サービスの実行を終了したくない音楽再生などの処理に使用します START_REDELIVER_INTENT サービスが強制終了した場合 サービスが再起動されます onstartcommand() メソッドが再度呼び出されて 引数の Intent には直前に動作していたサービスに引き渡された Intent が渡されます 直前の処理を再開したいファイルダウンロードのような処理に使用します 以下は START_STICKY を使用した場合の例です **** public class SampleService extends Service { ( 省略 ) @Override public int onstartcommand(intent intent, int flags, int startid) { ( 省略 ) return START_STICKY; **** なお onstart() メソッドは START_STICKY と同様の動作となります onstart() メソッドを使用した場合 または onstartcommand() メソッドで START_STICKY を return した場合 サービスが再起動したときに引数の Intent が null になります そのため onstart() メソッド もしくは onstartcommand() メソッドの処理で Intent を使用する処理がある場合 Intent が null か否かの判定処理を記述したほうが良いでしょう 3.onStartCommand() メソッドの引数 onstartcommand() メソッドの第 1 引数には Intent が渡されます これは onstart() メソッドの第 1 引数と同様です 第 2 引数には そのサービスが通常起動か 再起動されたのかなどを示す以下の整数が引き渡されます ( 表 1) Copyrights 2003-2012 RIC TELECOM All Rights Reserved. 4

表 1 第 2 引数の値 状態 0 通常起動したとき 1 2 onstartcommand() メソッドの戻り値が START_REDELIVER_INTENT で サービスが強制終了後の再起動したとき onstartcommand() メソッドから正しく return がなかった場合に サービスの再呼び出しをしたとき Service には これらの判定用に以下の定数が用意されており onstartcommand() メソッド の処理内で使用することが可能です START_FLAG_REDELIVERY 定数値は 1 で START_REDELIVER_INTENT で サービスが強制終了後の再起動した のかの判定に使用 START_FLAG_RETRY 定数値は 2 で サービスの再呼び出しをしたときの判定に使用 第 3 引数は onstart() メソッドの第 2 引数と同様で サービスを開始するリクエストを一意 に判別するための ID で stopselfresult() メソッドの引数に指定することで 該当のサービス を停止することができます Copyrights 2003-2012 RIC TELECOM All Rights Reserved. 5

Chapter 10 ダイアログ メニュー タブ 10-4 タブ (Android3.0 以降の場合 ) 本書の 10-3 タブ のサンプルアプリケーションで使用した TabActivity は 2012 年 7 月現在では非推奨となっています Android 3.0(API レベル 11) 以降を対象とする場合 TabActivity の代わりにアクションバー (Action Bar) とフラグメント (Fragment) という機能を使用するよう推奨されています アクションバーは 画面上部に表示されるバーでオプションメニューやタブ機能を提供します フラグメントは 画面レイアウトを分割する機能で タブレットのような画面の大きい端末に有効です 1つのアクティビティが管理するレイアウトを複数のフラグメントに分割することにより より複雑な画面構成および画面制御を実現できるようになります 1 サンプルアプリケーションの作成 それでは 3-3 タブ で説明したサンプルアプリケーションを アクションバーとフラ グメントを使用して再度作成しましょう ( 図 10.4.1) 図 10.4.1 TabSample1 最初に TabSample1 プロジェクトを次の設定で作成します ( 表 10.4.1) Build Target は Android 4.0(Android 3.0 以降 ) で設定します 表 10.4.1 TabSample1 プロジェクトの設定 入力項目名 入力内容 Project name: TabSample1 Build Target: Android 4.0 Copyrights 2003-2012 RIC TELECOM All Rights Reserved. 6

Application name: Package name: Create Activity: TabSample1 example.android.tabsample1 TabSample1Activity 次にレイアウトとビューの設定ファイル tabsample1.xml を作成します ( リスト 10.4.1) レイアウトは LinearLayout を選択します リスト 10.4.1 tabsample1.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:id="@+id/tabsample1" > </LinearLayout> レイアウトとビューの設定ファイルと同じ layout フォルダに レイアウト設定ファイルを作成するときと同じ手順 3 つのフラグメント設定ファイルを作成します ( リスト 10.4.2 10.4.3 10.4.4) レイアウトは FrameLayout を選択します これらの設定ファイルが 各タブが選択されたときに表示する画面になります リスト 10.4.2 fragment1.xml <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:textsize="18sp" android:inputtype="text"/> </FrameLayout> リスト 10.4.3 fragment2.xml <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:layout_width="wrap_content" Copyrights 2003-2012 RIC TELECOM All Rights Reserved. 7

android:layout_height="wrap_content" android:text="@string/tab2" /> </FrameLayout> リスト 10.4.4 fragment3.xml <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/tab3" /> </FrameLayout> 文字列定義ファイルに タブ 2 とタブ 3 が選択されたときに表示する文字列を定義しま す ( リスト 10.4.5) リスト 10.4.5 strings.xml <?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">hello World, TabSample1Activity!</string> <string name="app_name">tabsample1</string> <string name="tab2"> タブ 2</string> <string name="tab3"> タブ 3</string> </resources> アクティビティクラスは 次の通りに記述します ( リスト 10.4.6) リスト 10.4.6 TabSample1Activity.java package example.android.tabsample1; import android.app.actionbar; import android.app.actionbar.tab; import android.app.activity; import android.app.fragment; import android.app.fragmenttransaction; import android.os.bundle; public class TabSample1Activity extends Activity { // oncreate メソッド ( 画面初期表示イベントハンドラ ) @Override Copyrights 2003-2012 RIC TELECOM All Rights Reserved. 8

public void oncreate(bundle savedinstancestate) { // スーパークラスの oncreate メソッド呼び出し super.oncreate(savedinstancestate); // レイアウト設定ファイルの指定 setcontentview(r.layout.tabsample1); // ActionBar にタブ表示モード設定 getactionbar().setnavigationmode(actionbar.navigation_mode_tabs); // タブ 1 の設定 ActionBar.Tab tab1 = getactionbar().newtab(); tab1.settext(" タブ 1"); tab1.settablistener(new TabListener1(new Fragment1())); // タブ 2 の設定 ActionBar.Tab tab2 = getactionbar().newtab(); tab2.settext(" タブ 2"); tab2.seticon(android.r.drawable.ic_menu_edit); tab2.settablistener(new TabListener1(new Fragment2())); // タブ 3 の設定 ActionBar.Tab tab3 = getactionbar().newtab(); tab3.settext(" タブ 3"); tab3.seticon(android.r.drawable.ic_menu_search); tab3.settablistener(new TabListener1(new Fragment3())); // 各タブを ActionBar に設定 getactionbar().addtab(tab1); getactionbar().addtab(tab2); getactionbar().addtab(tab3); // タブ選択リスナー定義 private class TabListener1 implements ActionBar.TabListener { private Fragment fragment; // コンストラクタ定義 public TabListener1(Fragment fragment) { // 対象フラグメント取得 this.fragment = fragment; // ontabreselected メソッド ( タブ再選択時イベントハンドラ ) public void ontabreselected(tab tab, FragmentTransaction ft) { // ontabselected メソッド ( タブ選択時イベントハンドラ ) public void ontabselected(tab tab, FragmentTransaction ft) { // 対象フラグメント追加 ft.add(r.id.tabsample1, fragment); Copyrights 2003-2012 RIC TELECOM All Rights Reserved. 9

// ontabunselected メソッド ( タブ選択解除時イベントハンドラ ) public void ontabunselected(tab tab, FragmentTransaction ft) { // 対象フラグメント除去 ft.remove(fragment); アクティビティクラスと同じパッケージに 各フラグメントの画面を制御する 3 つのフ ラグメントクラスを 次の通りに記述します ( リスト 10.4.7 10.4.8 10.4.9) リスト 10.4.7 Fragment1.java package example.android.tabsample1; import android.app.fragment; import android.os.bundle; import android.view.layoutinflater; import android.view.view; import android.view.viewgroup; public class Fragment1 extends Fragment { // oncreateview メソッド ( フラグメント初期表示イベントハンドラ ) @Override public View oncreateview(layoutinflater inflater, ViewGroup container, Bundle savedinstancestate) { // レイアウト設定ファイルからビューオブジェクト取得 return inflater.inflate(r.layout.fragment1, container, false); リスト 10.4.8 Fragment2.java package example.android.tabsample1; import android.app.fragment; import android.graphics.color; import android.os.bundle; import android.view.layoutinflater; import android.view.view; import android.view.viewgroup; public class Fragment2 extends Fragment { // oncreateview メソッド ( フラグメント初期表示イベントハンドラ ) @Override public View oncreateview(layoutinflater inflater, ViewGroup container, Bundle savedinstancestate) { Copyrights 2003-2012 RIC TELECOM All Rights Reserved. 10

// レイアウト設定ファイルからビューオブジェクト取得 View view = inflater.inflate(r.layout.fragment2, container, false); // ビューに背景色を設定 view.setbackgroundcolor(color.green); return view; リスト 10.4.9 Fragment3.java package example.android.tabsample1; import android.app.fragment; import android.graphics.color; import android.os.bundle; import android.view.layoutinflater; import android.view.view; import android.view.viewgroup; public class Fragment3 extends Fragment { // oncreateview メソッド ( フラグメント初期表示イベントハンドラ ) @Override public View oncreateview(layoutinflater inflater, ViewGroup container, Bundle savedinstancestate) { // レイアウト設定ファイルからビューオブジェクト取得 View view = inflater.inflate(r.layout.fragment2, container, false); // ビューに背景色を設定 view.setbackgroundcolor(color.blue); return view; これで設定とプログラミングについては一通り完了です 一度実行し 先ほどの画面が 表示され 想定どおりに処理が行われるか確認しておきましょう 次項では このサンプルアプリケーションを参考にアクションバーとフラグメントを使 用したタブについて解説します 2 アクションバーのタブ アクションバーにタブを表示するには 最初にアクションバーをタブ表示モードに設定 します ( リスト 10.4.10) リスト 10.4.10 public class TabSample1Activity extends Activity { // oncreate メソッド ( 画面初期表示イベントハンドラ ) @Override public void oncreate(bundle savedinstancestate) { // スーパークラスの oncreate メソッド呼び出し Copyrights 2003-2012 RIC TELECOM All Rights Reserved. 11

super.oncreate(savedinstancestate); // レイアウト設定ファイルの指定 setcontentview(r.layout.tabsample1); // ActionBar にタブ表示モード設定 getactionbar().setnavigationmode(actionbar.navigation_mode_tabs); Activity クラスの getactionbar メソッドで ActionBar クラスのインスタンスを取得し setnavigationmode メソッドで表示モードを設定します タブを表示するモードを指定する場合は ActionBar クラスの定数 NAVIGATION_MODE_TABS を引数にします 各タブの設定のための記述をリスト 10.4.11 に示します ActionBar.Tab クラスのインスタンスを取得して タブに表示する文言や画像 タブが選択されたときに呼ばれるリスナーなどを設定していきます リスト 10.4.11 // タブ 1 の設定 ActionBar.Tab tab1 = getactionbar().newtab(); tab1.settext(" タブ 1"); tab1.settablistener(new TabListener1(new Fragment1())); // タブ 2 の設定 ActionBar.Tab tab2 = getactionbar().newtab(); tab2.settext(" タブ 2"); tab2.seticon(android.r.drawable.ic_menu_edit); tab2.settablistener(new TabListener1(new Fragment2())); // タブ 3 の設定 ActionBar.Tab tab3 = getactionbar().newtab(); tab3.settext(" タブ 3"); tab3.seticon(android.r.drawable.ic_menu_search); tab3.settablistener(new TabListener1(new Fragment3())); ActionBar の newtab メソッドで ActionBar.Tab オブジェクトを生成します また ActionBar.Tab の settext メソッドでタブに表示する文言 seticon メソッドでタブに表示 するアイコン画像を設定します また settablistener メソッドでタブが選択されたとき のリスナーを関連付けます 各タブの設定が完了したら ActionBar.Tab オブジェクトを ActionBar に addtab メソ ッドで設定します ( リスト 10.4.12) リスト 10.4.12 // 各タブを ActionBar に設定 getactionbar().addtab(tab1); getactionbar().addtab(tab2); getactionbar().addtab(tab3); Copyrights 2003-2012 RIC TELECOM All Rights Reserved. 12

タブが選択されたときのイベントをハンドリングする ActionBar.TabListener を実装したリスナークラスの定義です ( リスト 10.4.13) この ActionBar.TabListener を使用した場合 タブが選択された場合に呼ばれる ontabselected メソッド タブが再選択された場合に呼ばれる ontabreselected メソッド タブの選択が外れた場合に呼ばれる ontabunselected メソッドを実装します リスト 10.4.13 // タブ選択リスナー定義 private class TabListener1 implements ActionBar.TabListener { private Fragment fragment; // コンストラクタ定義 public TabListener1(Fragment fragment) { // 対象フラグメント取得 this.fragment = fragment; // ontabreselected メソッド ( タブ再選択時イベントハンドラ ) public void ontabreselected(tab tab, FragmentTransaction ft) { // ontabselected メソッド ( タブ選択時イベントハンドラ ) public void ontabselected(tab tab, FragmentTransaction ft) { // 対象フラグメント追加 ft.add(r.id.tabsample1, fragment); // ontabunselected メソッド ( タブ選択解除時イベントハンドラ ) public void ontabunselected(tab tab, FragmentTransaction ft) { // 対象フラグメント削除 ft.remove(fragment); 3 フラグメント 各タブが選択されたときに表示する画面は フラグメントを使用して定義します フラグメントの画面は 通常のレイアウトとビューの設定ファイルと同様に設定することができます また これらの画面を制御するフラグメントクラスを Fragment クラス またはそのサブクラスを継承して作成します フラグメントクラスは アクティビティクラスと同じように画面を制御する機能を持ち oncreate メソッド onstart メソッド onpause メソッ Copyrights 2003-2012 RIC TELECOM All Rights Reserved. 13

ドなどのコールバックメソッドがあります リスト 10.4.14 が タブ 1 が選択されたときに表示する画面を制御するフラグメントクラ スの定義です リスト 10.4.14 public class Fragment1 extends Fragment { // oncreateview メソッド ( フラグメント初期表示イベントハンドラ ) @Override public View oncreateview(layoutinflater inflater, ViewGroup container, Bundle savedinstancestate) { // レイアウト設定ファイルからビューオブジェクト取得 return inflater.inflate(r.layout.fragment1, container, false); oncreateview メソッドは フラグメントの画面が最初に表示されたときに呼ばれます サンプルでは 第 1 引数に引き渡された LayoutInflater を使用して レイアウト設定ファ イルをビューオブジェクトとして取得し これを戻り値としています この戻り値となっ たビューオブジェクトが フラグメントを追加する画面で表示されます タブ 2 とタブ 3 のフラグメントクラスも同様に レイアウト設定ファイルをビューオブ ジェクトとして取得し 戻り値としています タブ 2 とタブ 3 のフラグメントクラスでは View クラスの setbackgroundcolor メソッドで背景色も設定しています フラグメントの定義ができたら アクティビティにフラグメントを追加します フラグ メントをアクティビティに追加する方法は 2 通りあります 1 つ目は アクティビティが制御しているレイアウト設定ファイルに fragment タグを使 用してフラグメントをビューのように設定する方法です レイアウト設定ファイルにフラ グメントを定義した例です ( リスト 10.4.15) リスト 10.4.15 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:id="@+id/tabsample1" > <fragment android:name="example.android.tabsample1.fragment1" android:id="@+id/fragment1" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_weight="1" /> Copyrights 2003-2012 RIC TELECOM All Rights Reserved. 14

</LinearLayout> 2 つ目は アクティビティでフラグメントを追加する処理を行う方法です タブを使用し たときには タブを選択するたびに動的に表示するフラグメントを切り換える必要があり ますので サンプルではこの方法で実装しています アクティビティでフラグメントを追加したり 置き換えたり 除去するには FragmentTransaction クラスを使用します FragmentTransaction の add メソッドで追加 remove メソッドで除去 replace メソッドで置き換えができます サンプルでは アクティビティのタブ選択リスナークラスの ontabselected メソッドと ontabunselected メソッドの引数に FragmentTransaction のインスタンスが引き渡されま すので これらのメソッド内でフラグメントの追加および除去を行っています ( リスト 10.4.16) リスト 10.4.16 // ontabselected メソッド ( タブ選択時イベントハンドラ ) public void ontabselected(tab tab, FragmentTransaction ft) { // 対象フラグメント追加 ft.add(r.id.tabsample1, fragment); // ontabunselected メソッド ( タブ選択解除時イベントハンドラ ) public void ontabunselected(tab tab, FragmentTransaction ft) { // 対象フラグメント除去 ft.remove(fragment); ontabselected メソッドや ontabunselected メソッドのように FragmentTransaction が引数として引き渡されていない場合 FragmentManager クラスのインスタンスを Activity の getfragmentmanager メソッドで取得し FragmentTransaction のインスタン スを FragmentManager の begintransaction メソッドで取得します また フラグメント の追加や除去の後に FragmentTransaction の commit メソッドで変更を確定します ( リ スト 10.4.17) リスト 10.4.17 // FragmentManager インスタンス取得 FragmentManager fm= getfragmentmanager(); // FragmentTransaction インスタンス取得 FragmentTransaction ft = fm.begintransaction(); // 対象フラグメント追加 Copyrights 2003-2012 RIC TELECOM All Rights Reserved. 15

ft.add(r.id. tabsample1, fragment); // コミット ft.commit(); ontabselected メソッドや ontabunselected メソッドでは FragmentTransaction の commit メソッドの実行は必要ありません Copyrights 2003-2012 RIC TELECOM All Rights Reserved. 16