Androidアプリのフラグメント(1) ~一つのAndroidアプリでタブレットとスマホに対応~
Android Studio 2で始めるアプリ開発入門 第9回
ダウンロード サンプルファイル (111.4 KB)
コンテキスト
ところで、Androidでは「コンテキスト」という考え方がいろいろなところで登場することは、この連載中に紹介してきています。その際、「…Activity.this」とアクティビティオブジェクトを指定しました。
では、フラグメント中ではどのように記述すればいいのでしょうか。注意すべきは、フラグメントはコンテキストにはなりえないという点です(FragmentクラスはContextクラスを継承していないからです)。そこで、現在のフラグメントが所属しているアクティビティを取得して使います。これは、FragmentクラスのgetActivity()メソッドを使用します。この処理を追記してみましょう。
MenuListFragmentに以下のようにフィールドとonCreate()メソッドを追加しましょう。
public class MenuListFragment extends Fragment {
private Activity _parentActivity; // (1)
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
_parentActivity = getActivity(); // (2)
}
~省略~
}
コンテキストは頻繁に使用される可能性があるので、MenuListFragmentのフィールドとして定義します。それがリスト2の(1)です。そのフィールドの中身を用意しているのがリスト2の(2)です。この所属先Activityの取得処理をどのメソッドに記述するかですが、図5のフラグメントのライフサイクルから考えて、Activityの関連付けが終了したonAttach()以降のメソッドになりますが、一方でonCreateView()以降のメソッドはフラグメントの状態に応じて何度か呼び出される可能性があります。となると、onAttach()かonCreate()メソッドがよいでしょう。ここでは一般的な初期化処理に使われるonCreate()に記述します。
さて、ついでに、リストデータの生成処理をにonCreateView()に追記しましょう。リスト1の(2)と(3)の間に以下のソースコードを追加してください。といっても、IntentSampleとほぼ同じ内容なのでそのままコピーしてください。「~menuListデータ生成処理~」部分に関しても同様です。
ただし、1点だけ変更があります。それが(4)です。SimpleAdapterをnewするときの第1引数としてコンテキストを指定しますが、ここで、フィールドに設定した_parentActivityを使います。
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)
List<Map<String, String>> menuList = new ArrayList<Map<String, String>>();
~menuListデータ生成処理~
String[] from = {"name", "price"};
int[] to = {android.R.id.text1, android.R.id.text2};
SimpleAdapter adapter = new SimpleAdapter(_parentActivity, menuList, android.R.layout.simple_list_item_2, from, to); // (4)
lvMenu.setAdapter(adapter);
return view; // (3)
}
}
これで、フラグメント部分は一応完成です。
アクティビティへの埋め込み
といっても、このままでは画面は起動しません。起動はあくまでアクティビティ単位だからです。なので、アクティビティにフラグメントを組み込む必要があります。これは、レイアウトxmlに記述します。activity_menu_list.xmlを以下の内容に書き換えてください。
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<fragment
android:id="@+id/fragmentMenuList"
android:name="com.websarva.wings.android.fragmentsample.MenuListFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</FrameLayout>
入力できた段階で、一度アプリをスマホサイズのAVDで起動してみてください。IntentSampleと同じリスト画面が表示されるはずです。
フラグメントをアクティビティに組み込むには<fragment>タグを使用します。その際、android:name属性として、組み込むFragmentクラスの完全修飾名を指定します。これだけで、アクティビティにフラグメントが組み込まれます。
この記事は参考になりましたか?
- 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編 」他、著書多数。
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
この記事は参考になりましたか?
この記事をシェア
