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"/>