Androidカレンダーピッカーの実装とカスタマイズ:CalendarListviewの実践ガイド

CalendarListviewは、Androidアプリケーションに垂直スクロール可能なカレンダー選択機能を提供する軽量ライブラリです。このコンポーネントは、1ヶ月を1行としてListViewで実装されており、Android 2.3 (APIレベル10)以降をサポートしています。MITライセンスで公開され、数千の実アプリで採用されています。

基本実装手順

プロジェクトにライブラリを統合するには、以下の手順に従います。

Gradle設定

モジュールレベルのbuild.gradleに依存関係を追加します。

dependencies {
    implementation 'com.github.traex.calendarlistview:library:1.2.3'
}

レイアウト定義

XMLレイアウトファイルにカレンダービューを宣言します。

<com.andexert.calendarlistview.library.DayPickerView
    android:id="@+id/calendar_picker"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:calendarHeight="260dp"
    app:currentDaySelected="true"
    app:colorSelectedDayBackground="#FF5252"
    app:colorSelectedDayText="#FFFFFF"/>

コントローラ実装

ActivityでDatePickerControllerインタフェースを実装します。

public class BookingActivity extends AppCompatActivity implements DatePickerController {
    private DayPickerView datePicker;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_booking);
        datePicker = findViewById(R.id.calendar_picker);
        datePicker.setController(this);
    }

    @Override
    public int getMaxYear() {
        return 2035;
    }

    @Override
    public void onDayOfMonthSelected(int year, int month, int day) {
        Log.i("DatePicker", "予約日: " + year + "/" + (month + 1) + "/" + day);
    }

    @Override
    public void onDateRangeSelected(SelectedDays<CalendarDay> range) {
        if (range.isValid()) {
            CalendarDay start = range.getFirst();
            CalendarDay end = range.getLast();
            Log.i("DateRange", "期間: " + start.toString() + " ~ " + end.toString());
        }
    }
}

実装後、以下のレイアウトが表示されます。

+------------------------+
|       2024年1月        |
+------------------------+
| 日 月 火 水 木 金 土  |
+------------------------+
|          1  2  3  4   |
|  5  6  7  8  9 10 11  |
| 12 13 14 15 16 17 18  |
| 19 20 21 22 23 24 25  |
| 26 27 28 29 30 31     |
+------------------------+
|       2024年2月        |
+------------------------+
| ...                    |

カスタマイズ属性の活用

XML属性またはコードで外観と動作を調整できます。

外観設定

属性 説明 デフォルト値
textSizeDay 日付フォントサイズ 16sp
colorMonthName 月タイトル色 #FF333333
selectedDayRadius 選択日付の半径 16dip

コンパクト表示の例:

<com.andexert.calendarlistview.library.DayPickerView
    app:calendarHeight="220dip"
    app:textSizeDay="14sp"
    app:headerMonthHeight="45dip"/>

動作制御

選択範囲を制限するコード例:

// 本日から3か月後の範囲を設定
Calendar minDate = Calendar.getInstance();
Calendar maxDate = Calendar.getInstance();
maxDate.add(Calendar.MONTH, 3);

datePicker.setMinimumDate(new CalendarDay(minDate));
datePicker.setMaximumDate(new CalendarDay(maxDate));

トラブルシューティング

日付選択イベントが発火しない場合

以下の点を確認してください:

  • setController()メソッドでコントローラを正しく設定
  • enablePreviousDay属性が過去日選択を許可しているか
  • onDayOfMonthSelected実装でnullチェックを実施

言語設定のカスタマイズ

中国語表示が必要な場合のコード例:

String[] chineseMonths = {"1月", "2月", "3月", "4月", "5月", "6月",
                         "7月", "8月", "9月", "10月", "11月", "12月"};
String[] chineseDays = {"日", "一", "二", "三", "四", "五", "六"};

SimpleMonthAdapter adapter = new SimpleMonthAdapter(
    datePicker.getController(), 
    chineseMonths, 
    chineseDays
);
datePicker.setAdapter(adapter);

パフォーマンス最適化

スクロール時のパフォーマンス向上には:

// ビューの再利用を最適化
datePicker.setVisibleMonthCount(5);

// ハードウェアアクセラレーションを有効化
getWindow().setFlags(
    WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
    WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED
);

ディープモード対応には、colors.xmlにテーマ別色定義を追加し、レイアウトで参照します。

<com.andexert.calendarlistview.library.DayPickerView
    app:colorMonthName="@color/month_text_color"
    app:colorDayName="@color/weekday_text_color"/>

タグ: Android CalendarListview DatePicker CustomView ListView

6月14日 23:42 投稿