Android
 Computer >> コンピューター >  >> プログラミング >> Android

【Android開発】DatePickerダイアログで日付を設定・表示する方法を徹底解説

AndroidのDatePickerダイアログで日付を設定する方法

この記事では、AndroidアプリでDatePicker(日付選択)ダイアログを使って日付を設定し、選択した日付を画面に表示する方法を手順ごとに解説します。ボタンをタップするとカレンダーダイアログが開き、ユーザーが選んだ日付がTextViewに反映される、実用的なサンプルコードを紹介します。

ステップ1:新規プロジェクトを作成する

まずはAndroid Studioで新しいプロジェクトを作成しましょう。メニューから「File」→「New Project」を選択し、必要な項目を入力してプロジェクトを作成してください。

ステップ2:activity_main.xmlにコードを追加する

次に、res/layout/activity_main.xmlに以下のコードを追加します。中央にボタンとTextViewを配置したシンプルなレイアウトです。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://schemas.android.com/tools"
    android:id="@+id/rl"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="10dp"
    tools:context=".MainActivity"
    android:background="#f2f6f4">
    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Date"
        android:layout_above="@id/button"
        android:textSize="30dp"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="28dp"
        android:fontFamily="sans-serif-condensed"/>
    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Set Date"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true"/>
</RelativeLayout>

ステップ3:DatePickerFragment.javaを作成する

パッケージ名を右クリックし、「New」→「Java Class」を選択して、DatePickerFragmentという名前の新しいJavaクラスを作成します。このクラスはDialogFragmentを継承し、現在の日付を初期値としたDatePickerDialogのインスタンスを生成して返す役割を担います。以下のコードを追加してください。

import android.app.DatePickerDialog;
import android.app.Dialog;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.DialogFragment;
import java.util.Calendar;

public class DatePickerFragment extends DialogFragment {
    @NonNull
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        Calendar c = Calendar.getInstance();
        int year = c.get(Calendar.YEAR);
        int month = c.get(Calendar.MONTH);
        int day = c.get(Calendar.DAY_OF_MONTH);
        return new DatePickerDialog(getActivity(), (DatePickerDialog.OnDateSetListener)getActivity(), year, month, day);
    }
}

ステップ4:MainActivity.javaにコードを追加する

src/MainActivity.javaに以下のコードを追加します。ボタンのクリックイベントでDatePickerFragmentを表示し、onDateSet()コールバックで受け取った年月日を整形してTextViewにセットしています。

import android.app.DatePickerDialog;
import android.support.v4.app.DialogFragment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.TextView;
import java.text.DateFormat;
import java.util.Calendar;

public class MainActivity extends AppCompatActivity implements DatePickerDialog.OnDateSetListener {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                DialogFragment datePicker = new DatePickerFragment();
                datePicker.show(getSupportFragmentManager(), "date picker");
            }
        });
    }

    public void onDateSet(DatePicker view, int year, int month, int dayOfMonth){
        Calendar c = Calendar.getInstance();
        c.set(Calendar.YEAR,year);
        c.set(Calendar.MONTH,month);
        c.set(Calendar.DAY_OF_MONTH,dayOfMonth);
        String currentDateString = DateFormat.getDateInstance(DateFormat.FULL).format(c.getTime());
        TextView textView = (TextView) findViewById(R.id.textView);
        textView.setText(currentDateString);
    }
}

補足:本記事のコードは旧Support Libraryを使用しています。最新のAndroid Studio環境では、androidxライブラリ(androidx.appcompat.app.AppCompatActivity や androidx.fragment.app.DialogFragment など)に読み替えて実装してください。

ステップ5:AndroidManifest.xmlにコードを追加する

最後に、androidManifest.xmlに以下のコードを追加します。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android" package="app.com.sample">
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

アプリを実行して動作を確認しよう

それでは、実際にアプリを実行してみましょう。ここでは、実機のAndroid端末がパソコンに接続されているものとして説明を進めます。Android Studioでプロジェクト内のアクティビティファイルを開き、ツールバーの「Run」アイコンをクリックしてください。デバイスの選択画面が表示されたら、接続済みのモバイル端末を選びます。端末上には以下のようなデフォルト画面が表示されます。

【Android開発】DatePickerダイアログで日付を設定・表示する方法を徹底解説

【Android開発】DatePickerダイアログで日付を設定・表示する方法を徹底解説


【Android開発】DatePickerダイアログで日付を設定・表示する方法を徹底解説

まとめ

DialogFragmentを活用すれば、DatePickerDialogを簡単に実装できることがお分かりいただけたかと思います。全体の処理の流れは「ボタンタップ → ダイアログ表示 → onDateSet()で選択結果を受け取る → TextViewに日付を表示」というシンプルな構成です。日付の入力が必要な予約管理アプリやスケジュールアプリなど、幅広い場面で応用できるテクニックなので、ぜひ自分のプロジェクトにも取り入れてみてください。

  1. 【Android開発】TextViewのSpan(文字列の一部)に色を設定する方法を解説

    この記事では、AndroidアプリでTextView内の特定の文字列(Span)に色を設定する方法を、実際のサンプルコードとともに解説します。SpannableStringとForegroundColorSpanを組み合わせれば、1つのTextViewの中でも部分的にテキストの色を変更できます。手順1:Android Studioで新規プロジェクトを作成Android Studioを起動し、メニューから「File」→「New Project」を選択します。必要な項目を入力して、新しいプロジェクトを作成してください。手順2:レイアウトファイル(activity_main.xml)を編集するres

  2. SDカードのフォルダ・ファイルにAndroidの書き込み権限を設定する方法【サンプルコード付き】

    本記事では、AndroidアプリからSDカード(外部ストレージ)上のフォルダやファイルに対して書き込みを行うために必要なアクセス許可(パーミッション)の設定方法を、サンプルコード付きで解説します。「テキストを入力して外部ストレージに保存し、あとで読み出す」というシンプルなアプリを題材に、レイアウト・Javaコード・マニフェストの実装手順を順番に見ていきましょう。 実装の全体像 外部ストレージへの読み書きを実現するには、主に次の3つの要素が必要です。 マニフェストでの権限宣言:READ_EXTERNAL_STORAGE と WRITE_EXTERNAL_STORAGE を宣言する ストレージ