Androidアプリのフラグメント(1) ~一つのAndroidアプリでタブレットとスマホに対応~
Android Studio 2で始めるアプリ開発入門 第9回
ダウンロード サンプルファイル (111.4 KB)
サンプルプロジェクト作成
では、今回使用するサンプルアプリを作成していきましょう。
プロジェクト情報
以下が今回使用するサンプルアプリのプロジェクト情報です。
| Application name | FragmentSample |
|---|---|
| Company Domain | android.wings.websarva.com |
| Package name | com.websarva.wings.android.fragmentsample |
| Project location | C:\…任意のワークフォルダ…\FragmentSample |
| Phone and Tablet Minimum SDK | API 15 |
| Add an activity | Empty Activity |
| Activity Name | MenuListActivity |
| Layout Name | activity_menu_list |
フラグメントの追加
まず、strings.xmlはダウンロードサンプルを参照してください。なお、ダウンロードサンプルは、次回の改造も含めたソースコードとなっているのでご了承ください。
先述のとおり、フラグメントはxmlファイルとJavaクラスのセットで成り立っているので、リスト用のフラグメントのセットを追加します。Fileメニューから「New」-「Fragment」-「Fragment(Blank)」を選択してください。以下のようなウィザード画面が表示されます。
以下の情報を入力し、「Finish」をクリックしてください。
| Fragment Name | MenuListFragment |
|---|---|
| Create layout XML? | チェックを入れる |
| Fragment Layout Name | fragment_menu_list |
| Include fragment factory methods? | チェックをいれない |
| Include interface callbacks? | チェックをいれない |
| Target Source Set | main |
すると、所定の位置にMenuListFragmentクラスとfragment_menu_list.xmlファイルが追加されています。
MenuListFragmentを見てください。クラス宣言のところが
public class MenuListFragment extends Fragment
となっています。フラグメントのJavaクラスは、その名のとおりFragmentクラスを継承して作ります。
フラグメントのライフサイクル
フラグメントを導入すると、画面構成と処理は、そのほとんどをフラグメントに記述することになります。まず、IntentSampleのactivity_menu_list.xmlの内容をそのままfragment_menu_list.xmlにコピーしてください。
次に、MenuListFragmentのonCreateView()メソッドに以下のソースコードを記述します(コンストラクタがあらかじめ記述されていますが、こちらは削除しても構いません)。
public class MenuListFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_menu_list, container, false); // (1)
ListView lvMenu = (ListView) view.findViewById(R.id.lvMenu); // (2)
return view; // (3)
}
}
フラグメントは、画面の一部をブロック化したものなので、アクティビティ同様にライフサイクルを持っています。さらに、それらはアクティビティと連動します。これを図にすると、下図のようになります。
この図を見て分かるとおり、リスト1でコードを記述したonCreateView()メソッドというのは、アクティビティのcreate()中の処理であり、フラグメントでは3番目に実行されるメソッドです。この段階で、このフラグメントが担当する画面構成が作られます。なので、まずしなければならない処理は、レイアウトxmlファイルから画面部品を生成することです。これがリスト1の(1)です。ここでは、onCreateView()メソッドの第1引数であるinflaterのメソッドinflate()を使って画面を生成します(infleteに関しては、前回のオプションメニューのところでも解説しています)。その際引数が3個必要です。
第1引数は、生成するフラグメントのxmlファイルのR値を渡します。
第2引数は、onCreateView()メソッドの第2引数containerを横流しします。
第3引数は通常falseとします。これは、inflateした画面ブロックのルートを第2引数とするかしないかを指定する引数です。
このinflate()メソッドの戻り値が、このフラグメント用の生成された画面ブロックなので、これをonCreateView()メソッドの最後にreturnします。これがリスト1の(3)です。
もし、生成された画面ブロックに何か動的に手を加えたい場合は、このinflate()とreturnの間に処理を記述します。その際、ブロック内の画面部品を取得する必要が出てきますが、画面部品を取得するのにActivityのように、そのままfindViewById()と記述してもコンパイルエラーとなります。これは、FragmentクラスにfindViewById()メソッドがないのが原因です。代わりとして、いまinflateされた画面ブロックであるviewのfindViewById()を使用します。これがリスト1の(2)です。ここでは、メニューリストを表示するListViewを取得しています。
この記事は参考になりましたか?
- Android Studio 2で始めるアプリ開発入門連載記事一覧
- この記事の著者
-
WINGSプロジェクト 齊藤 新三(サイトウ シンゾウ)
<WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書、記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook <個人紹介>WINGSプロジェクト所属のテクニカルライター。Web系製作会社のシステム部門、SI会社を経てフリーランスとして独立。屋号はSarva(サルヴァ)。HAL大阪の非常勤講師を兼務。
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
-
山田 祥寛(ヤマダ ヨシヒロ)
静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数。
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
この記事は参考になりましたか?
この記事をシェア
