Fragmentをレイアウトファイルに設置する

続いて、このFragmentを設置します。Activityで読み込むxmlのレイアウトファイルに以下のようにして、他のViewと同じようにFragmentを設置します。
<fragment class="com.wktk.fragmentomikuji.OmikujiFragment"
android:id="@+id/omikuji_Fragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
上記のxmlのclassについて説明しますと、classにてjavaのクラスを指定します。先ほど作ったOmikujiFragmentをアプリのパッケージ名も含めて指定しています。

以上でFragmentはActivityで動くようになりました。

Fragmentのレイアウトをする

続いてFragmentのパーツを組み立てていきましょう。Activityと同様にレイアウトはxmlファイルで行います。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<TextView
android:id="@+id/omikuji_result_textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/draw_omikuji"
android:layout_centerInParent="true"
android:layout_above="@+id/draw_omikuji_Button" />

<Button
android:id="@+id/draw_omikuji_Button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/draw"
android:layout_centerInParent="true" />
</RelativeLayout>
上記ではおみくじを引くButtonと、結果表示に利用するTextViewを配置しています。以下の画像のようなレイアウトになります。

おみくじのFragmentのレイアウト

おみくじのFragmentのレイアウト



Fragmentに機能を追加する

次に、先ほど作ったOmikujiFragmentクラスを拡張していきましょう。
TextView omikujiResultTextView;
public enum OmikujiResult{
大吉,
吉,
末吉,
凶,
大凶
};
上記のようにおみくじの結果を表示するTextViewのインスタンスを準備します。また列挙型(enum)でおみくじ結果を列挙しておきます。

続いて、FragmentのViewが描画される際のプログラムを実装します。
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_omikuji, container);
omikujiResultTextView = (TextView) v.findViewById(R.id.omikuji_result_textView);
Button drawOmikujiButton = (Button) v.findViewById(R.id.draw_omikuji_Button);
drawOmikujiButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
OmikujiResult result = drawOmikuji();
omikujiResultTextView.setText(result.toString());
if(result == OmikujiResult.大吉){
Toast.makeText(getActivity(), "おめでとうございます!!", Toast.LENGTH_SHORT).show();
}
if(result == OmikujiResult.吉){
Toast.makeText(getActivity(), "まあまあですね", Toast.LENGTH_SHORT).show();
}
if(result == OmikujiResult.末吉){
Toast.makeText(getActivity(), "まあ普通ですね", Toast.LENGTH_SHORT).show();
}
if(result == OmikujiResult.凶){
Toast.makeText(getActivity(), "先が思いやられますね", Toast.LENGTH_SHORT).show();
}
if(result == OmikujiResult.大凶){
Toast.makeText(getActivity(), "非常に残念です", Toast.LENGTH_SHORT).show();
}
}
});
return v;
}

private OmikujiResult drawOmikuji(){
Random rnd = new Random();
int ran = rnd.nextInt(10);
OmikujiResult result = OmikujiResult.大凶;
if(ran < 2){
result = OmikujiResult.大吉;
}else if(ran >= 2 && ran < 4){
result = OmikujiResult.吉;
}else if(ran >= 4 && ran < 6){
result = OmikujiResult.末吉;
}else if(ran >= 6 && ran < 8){
result = OmikujiResult.凶;
}
return result;
};
上記ではonCreateViewメソッドで利用するFragmentをレイアウトファイルから読み込み、パーツのIDを取得してボタンにおみくじを引くイベントを実装しています。drawOmikujiメソッドでは乱数を生成しておみくじ結果を返しています。

ここで重要なのは、onCreateViewメソッド内でToastを生成する際に利用しているgetActivityメソッドです。このメソッドを利用することで、現在起動しているActivityと連携することができ、Fragmentで発生したイベントをActivityに反映することができます。