Android日历视图
在本教程中,我们将使用Android应用程序中的CalendarView类讨论Calendar Widget。
Android日历视图
顾名思义,日历视图用于显示和选择日历的日期。
要在XML布局中添加CalendarView,请执行以下操作:
<CalendarView android:id="@+id/calendarView" android:layout_width="wrap_content" android:layout_height="wrap_content"
这是在"布局设计"编辑器中的外观:
当您在设备上运行上述应用程序时,它将显示当前日期。
默认情况下,日历显示1970年1月1日。
android:maxDate和android:minDate用于在日历上设置自定义范围。
指定的日期格式为MM/dd/yyyy。
为了在Java中做同样的事情,我们使用了setMaxDate()和setMinDate()方法来传递long实例。
吸气方法同样适用。
要设置当前日期,我们在CalendarView实例上执行setDate(long date)。
setDate方法具有另一种形式:setDate(长日期,布尔动画,布尔中心)。
默认情况下,第二个和第三个参数为true。
当您选择一个新日期时,它会动画显示。
要更改日期和星期文本样式,我们使用以下属性:android:dateTextAppearance和android:weekTextAppearance或者它们在Java中的等效setter。
CalendarView由以下侦听器组成:
calendarView.setOnDateChangeListener(new CalendarView.OnDateChangeListener() { @Override public void onSelectedDayChange(@NonNull CalendarView calendarView, int i, int i1, int i2) { } });
每当用户更改日期时,都会触发此事件。
- i =年
- i1 =月
- i2 =天
在下一节中,我们将创建一个具有自定义主题的android应用程序,并在CalendarView上添加自定义范围,并显示动画和非动画日期更改之间的差异。
代码
在styles.xml文件中,添加以下三种样式:
<style name="CalenderViewCustom" parent="Theme.AppCompat"> <item name="colorAccent">@android:color/holo_blue_dark</item> <item name="colorPrimary">@android:color/darker_gray</item> <item name="android:textColorPrimary">@color/colorPrimary</item> </style> <style name="CalenderViewDateCustomText" parent="android:TextAppearance.DeviceDefault.Small"> <item name="android:textColor">@android:color/holo_orange_dark</item> </style> <style name="CalenderViewWeekCustomText" parent="android:TextAppearance.DeviceDefault.Small"> <item name="android:textColor">@android:color/holo_green_dark</item> </style>
android:textColorPrimary默认为白色。
该颜色设置在月份日期以及左右指示符上。
下面给出了activity_main.xml的代码:
<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="https://schemas.android.com/apk/res/android" xmlns:app="https://schemas.android.com/apk/res-auto" xmlns:tools="https://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <CalendarView android:id="@+id/calendarView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:dateTextAppearance="@style/CalenderViewDateCustomText" android:theme="@style/CalenderViewCustom" android:weekDayTextAppearance="@style/CalenderViewWeekCustomText" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" <Button android:id="@+id/btnWithAnim" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="16dp" android:text="With\nAnim" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@+id/btnWithoutAnim" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toEndOf="@+id/btnRange" <Button android:id="@+id/btnWithoutAnim" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Without\nAnim" app:layout_constraintBaseline_toBaselineOf="@+id/btnWithAnim" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toEndOf="@+id/btnWithAnim" <Button android:id="@+id/btnRange" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Custom\nRange" app:layout_constraintEnd_toStartOf="@+id/btnWithAnim" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintHorizontal_chainStyle="spread" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="@+id/btnWithAnim" </android.support.constraint.ConstraintLayout>
我们在上面的布局中添加了所有自定义样式。
三个按钮链接在约束布局中。
MainActivity.java的代码如下:
package com.theitroad.androidcalendarview; import android.support.annotation.NonNull; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.CalendarView; import android.widget.Toast; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; public class MainActivity extends AppCompatActivity implements View.OnClickListener { Calendar calendar; CalendarView calendarView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); calendar = Calendar.getInstance(); calendar.set(Calendar.MONTH, Calendar.NOVEMBER); calendar.set(Calendar.DAY_OF_MONTH, 9); calendar.set(Calendar.YEAR, 2012); calendar.add(Calendar.DAY_OF_MONTH, 1); calendar.add(Calendar.YEAR, 1); calendarView = findViewById(R.id.calendarView); Button btnRange = findViewById(R.id.btnRange); btnRange.setOnClickListener(this); Button btnWithoutAnim = findViewById(R.id.btnWithoutAnim); btnWithoutAnim.setOnClickListener(this); Button btnWithAnim = findViewById(R.id.btnWithAnim); btnWithAnim.setOnClickListener(this); calendarView.setOnDateChangeListener(new CalendarView.OnDateChangeListener() { @Override public void onSelectedDayChange(@NonNull CalendarView calendarView, int i, int i1, int i2) { String msg = "Selected date Day: " + i2 + " Month : " + (i1 + 1) + " Year " + i; Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_SHORT).show(); } }); } @Override public void onClick(View view) { switch (view.getId()) { case R.id.btnWithAnim: calendarView.setDate(calendar.getTimeInMillis(), true, true); break; case R.id.btnWithoutAnim: calendar.set(Calendar.DAY_OF_MONTH, 12); calendar.set(Calendar.YEAR, 2015); calendar.add(Calendar.MONTH, Calendar.MARCH); calendarView.setDate(calendar.getTimeInMillis(), false, false); break; case R.id.btnRange: Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.DATE, calendar.getActualMaximum(Calendar.DATE)); long endOfMonth = calendar.getTimeInMillis(); calendar = Calendar.getInstance(); calendar.set(Calendar.DATE, 1); calendar.set(Calendar.HOUR_OF_DAY, 0); long startOfMonth = calendar.getTimeInMillis(); calendarView.setMaxDate(endOfMonth); calendarView.setMinDate(startOfMonth); String minDateString = new SimpleDateFormat("MM/dd/yyyy").format(new Date(calendarView.getMinDate())); String maxDateString = new SimpleDateFormat("MM/dd/yyyy").format(new Date(calendarView.getMaxDate())); Toast.makeText(getApplicationContext(), "MMDDYYYY Min date - " + minDateString + " Max Date is " + maxDateString, Toast.LENGTH_LONG).show(); break; } } }
calendar.getActualMaximum(Calendar.DATE)获取当前日期的月底。
我们已经使用" SimpleDateFormat"将日期转换为自定义格式。