[Android Studio] 日付型ダイアログを作る

どうも、tatsuです!

今日は、日付型ダイアログを作る方法を説明します。

※この記事で使用しているAndroid Studioのバージョンは2.3.3です。

日付型ダイアログを作る

ダイアログにカレンダーを表示して、クリックした日付を元画面に返すといったことをしたい場面があると思います。
今回は日付型ダイアログを作成し、クリックした項目を元画面に返す流れまでを実装しました。

CustomDialogFlagment.java

CustomDialogFlagment.javaは以下のようにします。

public class CustomDialogFlagment extends DialogFragment {

    // ダイアログが生成された時に呼ばれるメソッド ※必須
    public Dialog onCreateDialog(Bundle savedInstanceState){
        // 今日の日付のカレンダーインスタンスを取得
        final Calendar calendar = Calendar.getInstance();

        // ダイアログ生成  DatePickerDialogのBuilderクラスを指定してインスタンス化します
        DatePickerDialog dateBuilder = new DatePickerDialog(
                getActivity(),
                new DatePickerDialog.OnDateSetListener(){
                    @Override
                    public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
                        // 選択された年・月・日を整形 ※月は0-11なので+1している
                        String dateStr = year + "年" + (month + 1) + "月" + dayOfMonth + "日";

                        // MainActivityのインスタンスを取得
                        MainActivity mainActivity = (MainActivity) getActivity();
                        mainActivity.setTextView(dateStr);
                    }
                },
                calendar.get(Calendar.YEAR), // 初期選択年
                calendar.get(Calendar.MONTH), // 初期選択月
                calendar.get(Calendar.DAY_OF_MONTH) // 初期選択日
        );

        // dateBulderを返す
        return dateBuilder;
    }
}

activity_main.xml

activity_main.xmlは以下のようにします。

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

    <TextView
        android:id="@+id/text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="ここにダイアログから値が返ります"
        android:textSize="20sp"/>
    <Button
        android:id="@+id/dialogButton"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="ダイアログを表示する"/>

</LinearLayout>

MainActivity.java

MainActivity.javaは以下のようにします。

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // idがdialogButtonのButtonを取得
        Button dialogBtn = (Button) findViewById(R.id.dialogButton);
        // clickイベント追加
        dialogBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            // クリックしたらダイアログを表示する処理
            public void onClick(View v) {
                // ダイアログクラスをインスタンス化
                CustomDialogFlagment dialog = new CustomDialogFlagment();
                // 表示  getFagmentManager()は固定、sampleは識別タグ
                dialog.show(getFragmentManager(), "sample");
            }
        });
    }

    // ダイアログで入力した値をtextViewに入れる - ダイアログから呼び出される
    public void setTextView(String value){
        TextView textView = (TextView) findViewById(R.id.text);
        textView.setText(value);
    }
}

結果

↓ボタン押下前

↓ボタン押下後

↓OK押下後

6 件のコメント

  • こんにちは貴方の完成したメモ帳アプリにさらに日付型ダイアログの機能を追加したいと思ってるのですがどのような書けばいいのでしょうか?もしお時間があれば教えてほしいです。僕の描いてる理想でははメモ帳アプリの新規作成するのましたにカレンダーを表示するをクリックすると主さんが作ったダイアログカレンダーが表示されるという仕組みです(語彙力がなくて申し訳ございません)。

    • こんにちは。
      「新規作成ボタンの下に日付ボタンを作り、日付ボタンをクリックしてダイアログで選択した日付がメモとして登録されるようにしたい」という認識であっていますか?

      ボタンの配置とクリック時に日付ダイアログが開くのはこの記事とメモ帳アプリ記事を見ながらできるかと思いますが、少し考えるべきところは日付選択後にデータベースに登録するということでしょうか。

      アドバイスを差し上げるならば、メモ帳アプリのCreateMemoActivity.javaでの登録ボタン処理の中のデータINSERT部分を、日付ダイアログのCustomDialogFlagment.javaのonDateSetのmainActivity.setTextView部分の代わりに入れてあげればできるのではないでしょうか。

  • こんにちはほんとに基本的なものですが実は新規作成のましたにカレンダーを表示するとういうのは表示することはできたですがボタンを押してもカレンダーに飛びません今の段階ですとこの日付型ダイアログのCustomDialogFlagment.javaとMain.javaをsimplememoプロジェクトにEmptyActivityとして登録しました。
    そしてlist.xmlに

    を追加しただけです
    いろいろ試したのですがエラーがでたのでここまででしたもしよろしければ主さんの答えを教えていただけませんでしょうか?
    毎度ほんとに申し訳ございません。

    • 日付ダイアログのmainをメモ帳に新規で追加する必要はありません。
      おそらくファイルとファイルの関係や、どのファイルに何を書けば良いのか、理解されていないように思えます。

      私も実際に作って確かめたわけではないですし、コメントでのやりとりではあなたの作ったソースを見ることができないため、的確なアドバイスができません。

      よろしければ、teratailというプログラミング質問Webサービスがあるので、そこで作ったソースを全て載せて質問してもらえますか?

      私もteratailに登録しているため、teratailで私をフォローして頂いて回答依頼をもらえれば詳しくアドバイスしますよ。
      ※私のterataliアカウントはプロフィールに書いてあります

  • 現在teratailの登録を終えました。名前はnagahamaNというユーザ名です。先程フォローさせていただきましたよろしくお願いします。

    • ソースは大体把握しました。
      回答したいのですが、質問の仕方に少し問題があるため、以下のように修正してください。

      1.分割された質問を全て取り下げてください(自分で取り下げができなければ他の方の言う通り運営にお願いしてください)

      2.[https:high-programmer.comのサイトのメモ帳アプリにダイアログを追加したい] という内容で新しく質問してください
      ソースは、list.xmlをソースの書き方(他の方がやり方をあなたの質問に回答してくれてますよね)でのせてください。
      他のソースはのせなくていいです。

      3.作った質問の回答依頼を私に出してください
      ※そうしないと今回のように他の人が回答してしまうため

  • コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です