Androidアプリ開発

DatePickerをDialogFragmentで実装する

この記事は約12分で読めます。
記事内に広告が含まれています。
スポンサーリンク

こんにちは、まっさん(@Tera_Msaki)です。

この記事は Androidスマホ用のアプリ開発の中で、
今後の開発で再使用性が高いと思われるコーディングをまとめたものです。
Java での開発経験、XML構文規則、Android のアプリ開発経験がある方を対象としています。
Android のアプリ開発でお役にたててれば、嬉しいです。
(これから Android のアプリ開発や Java での開発を始めたい方への案内は、記事の最後で紹介します)

この記事のテーマ


 日付入力をDatePickerDialogで実装する

下記の動画は、お買い物リストアプリ(Stocker)のストック入力画面でストック確認日を指定している動画です。
日付をタップするとことで、DatePickerDialog を表示して、日付を指定します。

DatePickerDialog を表示している状態で、画面の自動回転が動作するとアプリが異常終了します。
対応方法を追記しました。

ストック管理ができるお買い物リストアプリ Stocker はこちらからダウンロードできます↓↓↓

DatePickerDialog

◎ポイント
日付指定を DatePickerDialog で実装する際、設定した日付を受け取るには、少し工夫が必要です。

◎DatePickerDialogに指定した日付をハンドリングする
DatePickerDialog OnDateSetListener をもつ、DialogFragment を継承したクラスを作成します。
DatePickerDialog に初期表示する日付の引渡し、DatePickerDialog で設定した日付を返却するインタフェースを実装します。
terminate は、画面の自動回転が発生した時にダイアログ画面を閉じるのに使用します、

public class DialogDatePicker
        extends DialogFragment
        implements DatePickerDialog.OnDateSetListener {
    public static SimpleDateFormat  simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd", Locale.US);
    private final Context           context;
    private OnSelectedDateListener  onSelectedDateListener;
    // インタフェース //
    public interface OnSelectedDateListener {
        void selected(Integer year, Integer month, Integer day);
    }
    // コンテキスト //
    public DialogDatePicker(Context context) {
        this.context = context;
    }
    // リスナー設定 //
    public void setOnSelectedDateListener(DialogDatePicker.OnSelectedDateListener onSelectedDateListener){
        this.onSelectedDateListener = (OnSelectedDateListener) onSelectedDateListener;
    }
    // Date変換 //
    public static Date toDate(String ymd) {
        Date toDate = null;
        try {
            toDate = simpleDateFormat.parse(ymd);
        } catch (java.text.ParseException e) {
            e.printStackTrace();
            toDate = new Date();
        }
        return toDate;
    }
    @Override
    @NonNull
    public DatePickerDialog onCreateDialog(Bundle savedInstanceState) {
        String ymd = requireArguments().getString("DATE");
        final Calendar calendar = Calendar.getInstance();
        calendar.setTime(toDate(ymd));
        int year = calendar.get(Calendar.YEAR);
        int month = calendar.get(Calendar.MONTH);
        int day = calendar.get(Calendar.DAY_OF_MONTH);
        return new DatePickerDialog (context,
                this,
                year, month, day);
    }
    @Override
    public void onDateSet(android.widget.DatePicker view, int year, int month, int day) {
        onSelectedDateListener.selected(year, month + 1, day);
    }

    // 強制終了
    public void terminate() {
        dismiss();
    }
}

DatePickerDialog で設定した日付の月( month )は、0~11の範囲で返却されます。
このため、
DatePickerDialog の戻り値( month )に 1 加えた値をインタフェースにセットします。

日付入力をDatePickerDialogで実装する
Fragment に先ほどの DialogDatePicker のインタフェースをインプリメントします。
TextView( procDate )のタップで DataPicker を表示し、DataPicker で指定した日付を TextView にセットします。
DataPicker で指定した日付は、DialogDatePicker のインタフェース経由( selected )で受け取ります。
画面の自動回転が発生すると
onPause が発生するので、DatePickerDialog を強制的に閉じます。

public class StockFragment
        extends StockerUtilities
        implements Keyboard.OnVisibilityListener, DialogDatePicker.OnSelectedDateListener {
	  :
    private final SimpleDateFormat simpleDateFormat = new android.icu.text.SimpleDateFormat("yyyy/MM/dd", Locale.US);
    private DialogDatePicker dialogDatePicker;
	  :
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.fragment_stock, container, false);
	      :
        procDate = view.findViewById(R.id.procDate);
        procDate.setOnClickListener(v -> {
            dialogDatePicker = new DialogDatePicker(getActivity());
            Bundle bundle = new Bundle();
            bundle.putString("DATE", procDate.getText().toString());
            dialogDatePicker.setOnSelectedDateListener((year, month, day) -> {
                procDate.setText(HtmlCompat.fromHtml(String.format(Locale.US, "<u>%d/%d/%d</u>", year, month, day), FROM_HTML_MODE_COMPACT));
            });
            dialogDatePicker.setArguments(bundle);
            dialogDatePicker.show(getParentFragmentManager() ,context.getString(R.string.stock_procDate));
        });
	      :
        return view;
    :
    @Override
    public void onPause() {
        if (dialogDatePicker != null) dialogDatePicker.terminate();
        :
        super.onPause();
    }
}

今回は、ここまでです。

ゲームのボイスチャットから、Web会議までOKです♪
ヘッドセットは絶対に無線がいいです♪

誤字脱字、意味不明でわかりづらい、
もっと詳しく知りたいなどのご意見は、
このページの最後にある
コメントか、
こちら
から、お願いいたします♪

ポチッとして頂けると、
次のコンテンツを作成する励みになります♪

ブログランキング・にほんブログ村へ

これからAndroidのアプリ開発やJavaでの開発を始めたい方へ

アプリケーション開発経験がない方や、アプリケーション開発経験がある方でも、Java や C# などのオブジェクト指向言語が初めての方は、Android のアプリ開発ができるようになるには、かなりの時間がかかります。オンラインスクールでの習得を、強くおススメします。

副業でアプリケーション開発と考えているなら、おススメです。
無料説明会に参加して、話を聞くだけでもためになるよ♪

未経験者からシステムエンジニアを目指すのに最適かと、
まずは無料相談から♪

未経験者からプログラマーを目指すのに最適かと、
まずは無料カウンセリングから♪

カリキュラムとサポートがしっかりしています、
お得なキャンペーンとかいろいろやっています♪

ゲーム系に強いスクール、UnityやUnrealEngineを習得するのに最適かと、
まずは無料オンライン相談から♪

参考になったら、💛をポッチとしてね♪