Android日历视图

时间:2020-02-23 14:28:48  来源:igfitidea点击:

在本教程中,我们将使用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"将日期转换为自定义格式。