SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Android Studio 2で始めるアプリ開発入門

Androidアプリのフラグメント(1) ~一つのAndroidアプリでタブレットとスマホに対応~

Android Studio 2で始めるアプリ開発入門 第9回


コンテキスト

 ところで、Androidでは「コンテキスト」という考え方がいろいろなところで登場することは、この連載中に紹介してきています。その際、「…Activity.this」とアクティビティオブジェクトを指定しました。

 では、フラグメント中ではどのように記述すればいいのでしょうか。注意すべきは、フラグメントはコンテキストにはなりえないという点です(FragmentクラスはContextクラスを継承していないからです)。そこで、現在のフラグメントが所属しているアクティビティを取得して使います。これは、FragmentクラスのgetActivity()メソッドを使用します。この処理を追記してみましょう。

 MenuListFragmentに以下のようにフィールドとonCreate()メソッドを追加しましょう。

リスト2 MenuListFragmentにコンテキスト取得を追加
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を使います。

リスト3 MenuListFragmentにリストデータ生成処理コードを追加
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を以下の内容に書き換えてください。

リスト4 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編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/9595 2018/05/23 15:36

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー