Androidのカスタムダイアログを作成する

最近、Androidアプリ作成に興味を持ったモノクロです。

Androidアプリでハマったのが、ダイアログの作成。レイアウトファイルを作成し、ダイアログにしてみた。

やりたかったこと

ある期間をダイアログを使って指定し、その開始日と終了日を取得する。

こんな感じ。

開始日と終了日をカレンダーで指定して、OKボタンをタップするとそれぞれの日付を取得する。みたいなことをやりたい。

レイアウトファイル記述内容

(content_span_dialog.xmlと名付けた)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical" >

            <TextView
                android:id="@+id/text"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="開始日" />

            <DatePicker
                android:id="@+id/dateFrom"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:datePickerMode="spinner"/>

            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="〜" />

            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="終了日" />

            <DatePicker
                android:id="@+id/dateTo"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:datePickerMode="spinner"/>
        </LinearLayout>
    </ScrollView>

</LinearLayout>

ダイアログ用実装用ソースコード

AppCompatDialogFragmentを継承したクラス(参考サイトを見た範囲では、DialogFragmentで充分?)を作成した。呼び出し元で、SpanDialog.OnOkListenerを実装すると、開始日と終了日を取得できるようにしてみた。

import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatDialogFragment;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.DatePicker;

public class SpanDialog extends AppCompatDialogFragment {
    private DatePicker dateFrom, dateTo;
    private OnOkListener listener;

    @Override
    public Dialog onCreateDialog(Bundle b){
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        LayoutInflater inflater = (LayoutInflater)getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View content = inflater.inflate(R.layout.content_span_dialog, null);
        builder.setView(content);
        dateFrom = (DatePicker)content.findViewById(R.id.dateFrom);
        dateTo = (DatePicker)content.findViewById(R.id.dateTo);
        builder.setMessage("期間を設定").setNegativeButton("キャンセル", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {

            }
        }).setPositiveButton("OK", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                if(listener != null){
                    listener.onClick(getDateString(dateFrom.getYear(), dateFrom.getMonth(), dateFrom.getDayOfMonth()),
                            getDateString(dateTo.getYear(), dateTo.getMonth(), dateTo.getDayOfMonth()));
                }
            }
        });
        return builder.create();
    }
    private String getDateString(int year, int month, int day){
        return year + "-" + String.format("%02d", month+1) + "-" + String.format("%02d", day);
    }
    public void setOnOkListener(SpanDialog.OnOkListener listen){
        listener = listen;
    }

    public interface OnOkListener{
        void onClick(String from, String to);
    }
}

ダイアログ呼び出し側ソースコード

SpanDialog dlg = new SpanDialog();
dlg.setOnOkListener(new SpanDialog.OnOkListener() {
    @Override
    public void onClick(String from, String to) {
        //ToDO: ここに処理内容を書く 
    }
});
dlg.show(getSupportFragmentManager(), null);