注文完了画面のフラグメント化
次に、注文完了画面をフラグメント化していきます。
ファイルの追加
まず、ファイルを追加します。アクティビティが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にソースを記述していきましょう。以下のように記述してください。
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)の間に、注文完了内容を表示する処理を記述します。以下のソースコードを追加してください。
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()に追記します。
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のように左右に分割した画面となるように改造していきます。
