SHOEISHA iD

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

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

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

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

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

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


注文完了画面のフラグメント化

 次に、注文完了画面をフラグメント化していきます。

ファイルの追加

 まず、ファイルを追加します。アクティビティが1セット、フラグメントが1セット、計4ファイルが必要なので、それぞれ追加していきます。アクティビティの追加に関しては説明済みなので、手順通り、MenuThanksActivity/activity_menu_thanks.xmlを追加してください。

 次に、フラグメントを追加します。「フラグメントの追加」で説明したとおりの方法で、MenuThanksFragment/fragment_menu_thanks.xmlを追加してください。

xmlファイルへの記述

 生成されたファイルのうち、まず、xmlファイルを記述していきましょう。

 リストのフラグメントと同様に、IntentSampleのactivity_menu_thanks.xmlの内容をそのままfragment_menu_thanks.xmlにコピーしてください。ただし、その際、<Button>タグのandroid:onClick属性は削除し、代わりに、

android:id="@+id/btBackButton"

を追加してください。こちらに関しては後述します。

 次に、activity_menu_thanks.xmlを記述します。これは、activity_menu_list.xml同様に、フラグメントの組み込みを行います。ソースコードに関しては、ダウンロードサンプルを参照してください。

MenuThanksFragmentへの記述

 それでは、MenuThanksFragmentにソースを記述していきましょう。以下のように記述してください。

リスト5 MenuThanksFragmentにソースコードを記述
public class MenuThanksFragment extends Fragment {
    private Activity _parentActivity;  // (1)

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        _parentActivity = getActivity();  // (2)
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_menu_thanks, container, false);  // (3)
        return view;  // (4)
    }
}

 (1)(2)(3)(4)すべて、MenuListFragmentと同様の処理です。

 この(3)(4)の間に、注文完了内容を表示する処理を記述します。以下のソースコードを追加してください。

リスト6 MenuThanksFragmentのonCreateView()メソッドにソースコードを追加
public class MenuThanksFragment extends Fragment {

      ~省略~

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_menu_thanks, container, false);  // (3)
        
        Intent intent = _parentActivity.getIntent();  // (5)
        String menuName = intent.getStringExtra("menuName");
        String menuPrice = intent.getStringExtra("menuPrice");
        TextView tvMenuName = (TextView) view.findViewById(R.id.tvMenuName);  // (6)
        TextView tvMenuPrice = (TextView) view.findViewById(R.id.tvMenuPrice);  // (6)
        tvMenuName.setText(menuName);
        tvMenuPrice.setText(menuPrice);
        
        return view;  // (4)
    }
}

 基本部分はIntentSampleと同じなので、IntentSampleのMenuThanksActivityのonCreate()メソッド中に記述されたソースコードをコピーすればいいのですが、違いが(5)(6)です。

 (6)はフラグメントのライフサイクルの項で解説済みです。

 (5)に関しても同じです。getIntent()もFragment内では使用できません。IntentはActivityと結びついた考え方なので、Activity経由で取得します。ここでも、onCreate()で用意したフィールド_parentActivityを利用します。

戻るボタン処理

 MenuThanksFragmentへの記述の最後として、戻るボタンの処理を記述します。

 IntentSampleのMenuThanksActivityではandroid:onClick属性を使用して、戻るボタンの処理を記述していました。ところが、このandroid:onClick属性というのは、対象メソッドをActivityに記述しなければなりません。Fragmentではこの方法はとれません。

 そこで、従来通り、リスナ登録を行います。MenuThanksFragmentに、以下のようにリスナクラスとそれを登録する処理をonCreateView()に追記します。

リスト7 MenuThanksFragmentにリスナクラスとその登録ソースコードを追加
public class MenuThanksFragment extends Fragment {

      ~省略~

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

      ~省略~

        Button btBackButton = (Button) view.findViewById(R.id.btBackButton);
        btBackButton.setOnClickListener(new ButtonClickListener());

        return view;
    }
    
    private class ButtonClickListener implements View.OnClickListener {
        @Override
        public void onClick(View view) {
            _parentActivity.finish();  // (7)
        }
    }
}

 ここで、注意すべきは(7)です。戻るボタンで終了するのはFragmentではなくActivityです。従って、単にfinish()ではなく、_parentActivity.finish()と記述します。

メニューリストから注文完了画面への処理

 最後に、メニューリストをタップしたら注文完了画面が起動する処理を記述します。といっても、これも、IntentSampleと同じです。IntentSampleのMenuListActivityのメンバリスナクラスListItemClickListenerをそのままMenuListFragmentにコピーしてください。すると、Intentをnewするところで、コンパイルエラーとなるはずです。そこを、以下のように書き換えてください。

Intent intent = new Intent(_parentActivity, MenuThanksActivity.class);

 Intentをnewするときの第1引数はコンテキストです。Fragment内では_parentActivityを使用します。

 このメンバリスナクラスをListViewに登録します。onCreateView()メソッドのreturnの直前に以下の1行を追加してください。

lvMenu.setOnItemClickListener(new ListItemClickListener());

 これで、アプリを再起動してください。無事、IntentSampleと同じ動きが確認できれば成功です。

まとめ

 今回は、フラグメントとは何か、フラグメントの組み込み方の初歩を解説しました。ところが、今のままでは、10インチタブレットで表示しても図1と同じ画面になってしまいます。次回はこの続きとして、10インチでは図2のように左右に分割した画面となるように改造していきます。

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

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
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」など、さまざまなカンファレンスを企画・運営しています。

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

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

メールバックナンバー