SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Android開発のためのJava SE再入門

Androidにおける日付処理の基本

Android開発のためのJavaSE再入門(7)

  • X ポスト
  • このエントリーをはてなブックマークに追加

DatePickerDialogのカスタマイズとカレンダーの表示

 今度は、DatePickerDialogを少しカスタマイズしてみましょう。DatePickerDialogの実態は、android.app.AlertDialogクラスに、ビューとしてandroid.widget.DatePickerを設定したものです。AlertDialog.Builderクラスを使って、同じようなコンポーネントを組み立てることができます。

 次のサンプルでは、年と日付を選択するダイアログを表示し、選択されると、該当の月のカレンダーを表示するものです。

図7 DatePickerDialogのカスタマイズ表示
図7 DatePickerDialogのカスタマイズ表示
図8 カレンダー表示
図8 カレンダー表示
リスト HelloAndroid.javaの一部
// 年と日を選択するダイアログの表示
public void sampleUI2() {

    // AlertDialog.Builderを生成
    AlertDialog.Builder builder = new AlertDialog.Builder(this);

    // DatePickerを生成(デフォルトで現在日時に設定される)
    final DatePicker datePicker = new DatePicker(this);

    // ViewにDatePickerを設定
    builder.setView(datePicker);

    // タイトルを設定
    builder.setTitle("年と月を選択してください");

    // 設定ボタンを設定 -----------------------------------------------(1)
    builder.setPositiveButton("カレンダー表示",
            new DatePickerDialog.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    printCalendar(datePicker.getYear(),
                            // カレンダーの表示
                            datePicker.getMonth());
                }
            });

    // AlertDialogを生成
    AlertDialog alertDialog = builder.create();

    // 日のパーツを非表示にする --------------------------------------(2)
    ViewGroup datePickerGroup = (ViewGroup) datePicker.getChildAt(0);
    datePickerGroup.getChildAt(2).setVisibility(View.GONE);

    // AlertDialogを表示
    alertDialog.show();
}

// カレンダーの表示
public void printCalendar(int y, int m) {

    printString(y + "年" + (m + 1) + "月のカレンダー");

    // 指定の月の初日を設定する
    Calendar cal = Calendar.getInstance();
    cal.set(y, m, 1);

    // 2桁で日を表示する
    SimpleDateFormat sdf = new SimpleDateFormat("dd ");

    // 月の最終日の取得 ---------------------------------------------(3)
    int max = cal.getActualMaximum(Calendar.DATE);
    // 月初の曜日の取得
    int w = cal.get(Calendar.DAY_OF_WEEK);

    String wstr = "";
    // 第1週の空白を出力する
    for (int i = 0; i < w - 1; i++) {
        wstr += "   ";
    }
    int last = 0;

    // 1週間の表示
    do {
        for (int i = 0; i < 8 - w; i++) {
            wstr += sdf.format(cal.getTime());

            // 月の最終日か?
            if (max == cal.get(Calendar.DATE)) {
                last++;
                break;
            }
            // 1日加算 ---------------------------------------------(4)
            cal.add(Calendar.DAY_OF_MONTH, 1); 
        }
        printString(wstr);
        w = 1;
        wstr = "";
    } while (last == 0);
}

 コメントを追えば処理の流れは理解できるでしょう。ここでは、ポイントをしぼって解説することにします。

 (1)では、ダイアログに表示されるボタンを設定しています。ボタンに表示される文字列と、ボタンがクリックされたときのイベントリスナーを指定します。選択された年と日は、DatePickerクラスのgetYear、getMonthメソッドで取得しています。

 (2)では、日を選択するパーツを非表示にしています。年と月だけを選択したいので、日の選択は不要なのですが、個別に設定できないため、setVisibilityメソッドを使って日を選択するビューを非表示にしています。

 DatePickerクラスには、このビューを特定するメソッドが見当たらないので、getChildAtメソッドで、3番目を指定しています。年、月、日とパーツが並ぶために、日にあたるgetChildAt(2)を指定しています。ただしこのパーツの並びは、SimpleDateFormatクラスのtoPatternメソッドで得られるデフォルトのパターンに従っています。そのため、例えば米国のロケールであれば、パターンは"M/d/yy"となり、日は2番目になります。つまりgetChildAt(1)とする必要があるのですが、今回のサンプルではそこまでは考慮していません。

 カレンダーを表示する部分の(3)では、指定の月の最終日(28、30、31など)と、その月の初日の曜日を取得しています(1週目の表示のため)。

 カレンダーの日の表示は、Calendarオブジェクトを1日ずつ進めて、その値を表示しています。(4)で、Calendarクラスのaddメソッドを利用し、1日を加算しています。

最後に

 Android開発のためのJava SE再入門も今回が最後となりました。このところのスマートフォンバブルは驚くばかりです。Androidアプリ開発者も忙しい日々をお送りのことかと思います。そんなアプリ開発にかかわる皆様に、この連載記事が少しでもお役に立つことができれば幸いです。

参考資料

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Android開発のためのJava SE再入門連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 高江 賢(タカエ ケン)

WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS Twitter: @yyamada(公式)、@yyamada/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/6343 2012/01/05 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング