100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > Calendar类 自定义实现日历控件

Calendar类 自定义实现日历控件

时间:2019-08-09 17:46:48

相关推荐

Calendar类 自定义实现日历控件

文章目录

一、Calendar类1. 说明2. 使用二、自定义实现日历控件1. 布局3. 业务处理3. 定制UI4. 事件监听

一、Calendar类

1. 说明

Calendar是java util包下的一个工具类,提供了很方便的不同日期格式的处理。

2. 使用

Calendar calendar=new GregorianCalendar();System.out.println("当前系统时间"+calendar.getTime());System.out.println("年份为"+calendar.get(Calendar.YEAR));System.out.println("月份为"+calendar.get(Calendar.MONTH));System.out.println("日期为"+calendar.get(Calendar.DATE));System.out.println("这一天在这个月的第几天"+calendar.get(Calendar.DAY_OF_MONTH));System.out.println("这一天在这周的第几天"+calendar.get(Calendar.DAY_OF_WEEK));System.out.println("这一天所在的周是这个月的第几周"+calendar.get(Calendar.DAY_OF_WEEK_IN_MONTH));System.out.println("这一天在这年的第几天"+calendar.get(Calendar.DAY_OF_YEAR));System.out.println("12小时制下当前时"+calendar.get(Calendar.HOUR));System.out.println("24小时制下当前时"+calendar.get(Calendar.HOUR_OF_DAY));System.out.println("分为"+calendar.get(Calendar.MINUTE));System.out.println("秒为"+calendar.get(Calendar.SECOND));System.out.println("毫秒为"+calendar.get(Calendar.MILLISECOND));System.out.println("这一周为一月中的第几周"+calendar.get(Calendar.WEEK_OF_MONTH));System.out.println("这一周为一年中的第几周"+calendar.get(Calendar.WEEK_OF_YEAR));System.out.println("纪元为"+calendar.get(Calendar.ERA));System.out.println("zone为"+calendar.get(Calendar.ZONE_OFFSET));

二、自定义实现日历控件

1. 布局

创建calendar_layout.xml

<LinearLayout xmlns:android="/apk/res/android"android:padding="20sp"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><RelativeLayoutandroid:id="@+id/titleRl"android:layout_width="match_parent"android:layout_height="30dp"><TextViewandroid:id="@+id/lastTv"android:text="上一月"android:layout_alignParentLeft="true"android:gravity="center"android:layout_width="wrap_content"android:layout_height="30dp"></TextView><TextViewandroid:id="@+id/monthTv"android:text="十一月"android:gravity="center"android:layout_centerHorizontal="true"android:layout_width="wrap_content"android:layout_height="30dp"></TextView><TextViewandroid:id="@+id/nextTv"android:text="下一月"android:gravity="center"android:layout_alignParentRight="true"android:layout_width="wrap_content"android:layout_height="30dp"></TextView></RelativeLayout><LinearLayoutandroid:id="@+id/weekLl"android:orientation="horizontal"android:layout_width="match_parent"android:layout_height="wrap_content"><TextViewandroid:id="@+id/Tv7"android:text="日"android:gravity="center"android:layout_weight="1"android:layout_width="0dp"android:layout_height="30dp"></TextView><TextViewandroid:id="@+id/Tv1"android:text="一"android:gravity="center"android:layout_weight="1"android:layout_width="0dp"android:layout_height="30dp"></TextView><TextViewandroid:id="@+id/Tv2"android:text="二"android:gravity="center"android:layout_weight="1"android:layout_width="0dp"android:layout_height="30dp"></TextView><TextViewandroid:id="@+id/Tv3"android:text="三"android:gravity="center"android:layout_weight="1"android:layout_width="0dp"android:layout_height="30dp"></TextView><TextViewandroid:id="@+id/Tv4"android:text="四"android:gravity="center"android:layout_weight="1"android:layout_width="0dp"android:layout_height="30dp"></TextView><TextViewandroid:id="@+id/Tv5"android:text="五"android:gravity="center"android:layout_weight="1"android:layout_width="0dp"android:layout_height="30dp"></TextView><TextViewandroid:id="@+id/Tv6"android:text="六"android:gravity="center"android:layout_weight="1"android:layout_width="0dp"android:layout_height="30dp"></TextView></LinearLayout><GridViewandroid:id="@+id/calendarCv"android:numColumns="7"android:layout_width="match_parent"android:layout_height="match_parent"></GridView></LinearLayout>

创建item_layout.xml

<LinearLayout xmlns:android="/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><TextViewandroid:id="@+id/itemTv"android:gravity="center"android:layout_width="match_parent"android:layout_height="match_parent"></TextView></LinearLayout>

在activity_main.xml中

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="/apk/res/android"xmlns:app="/apk/res-auto"xmlns:tools="/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><com.aye.newcalendar.NewCalendarandroid:id="@+id/calendarNc"android:gravity="center"android:layout_width="match_parent"android:layout_height="match_parent"></com.aye.newcalendar.NewCalendar></androidx.constraintlayout.widget.ConstraintLayout>

3. 业务处理

创建NewCalendar类,继承LinearLayout

public class NewCalendar extends LinearLayout {private TextView lastTv,nextTv,dateTv;private GridView calendarGv;private Calendar calendar=Calendar.getInstance(); //日历控件初始化//重写三个构造方法public NewCalendar(Context context) {super(context);}public NewCalendar(Context context, @Nullable AttributeSet attrs) {super(context, attrs);initControl(context); //绑定控件}public NewCalendar(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);initControl(context); //绑定控件}private void initControl(Context context){bindControl(context); //绑定控件bindControlEvent(); //绑定控件事件}//绑定控件事件方法private void bindControlEvent() {renderCalendar();//“下一月”点击事件nextTv.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {calendar.add(Calendar.MONTH,+1); //月份+1renderCalendar();}});//“上一个”点击事件lastTv.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {calendar.add(Calendar.MONTH,-1); //月份-1renderCalendar();}});}private void renderCalendar() {SimpleDateFormat sdf = new SimpleDateFormat("MMM yyy"); //日期格式化dateTv.setText(sdf.format(calendar.getTime())); //设置月份ArrayList<Date> cells = new ArrayList<>();Calendar calendar1 = (Calendar) calendar.clone(); //克隆日历对象calendar1.set(Calendar.DAY_OF_MONTH, 1); //置于当月第一天;int prevDays = calendar1.get(Calendar.DAY_OF_WEEK) - 1; //获取上个月最后一天是星期几calendar1.add(Calendar.DAY_OF_MONTH, -prevDays); //第一天int maxCount = 6 * 7; //设置每个月最大天数//循环存入集合中while (cells.size() < maxCount) {cells.add(calendar1.getTime());calendar1.add(Calendar.DAY_OF_MONTH, 1); //日期+1}//设置适配器calendarGv.setAdapter(new CalendarAdapter(getContext(),cells));}//适配器private class CalendarAdapter extends ArrayAdapter<Date>{LayoutInflater layoutInflater;public CalendarAdapter(@NonNull Context context,ArrayList<Date> days) {super(context, R.layout.item_layout,days);layoutInflater=LayoutInflater.from(context);}@NonNull@Overridepublic View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {Date date=getItem(position);ViewHolder viewHolder;if (convertView==null){//初始化绑定convertView=layoutInflater.inflate(R.layout.item_layout,parent,false);viewHolder=new ViewHolder();viewHolder.itemTv=convertView.findViewById(R.id.itemTv);convertView.setTag(viewHolder);}viewHolder= (ViewHolder) convertView.getTag();int day=date.getDate();viewHolder.itemTv.setText(String.valueOf(day)); //赋值return convertView;}class ViewHolder{TextView itemTv;}}private void bindControl(Context context) {LayoutInflater inflater=LayoutInflater.from(context);inflater.inflate(R.layout.calendar_layout,this);lastTv=findViewById(R.id.lastTv);nextTv=findViewById(R.id.nextTv);dateTv=findViewById(R.id.dateTv);calendarGv=findViewById(R.id.calendarGv);}}

3. 定制UI

在适配器getView()方法中,个性化日历界面

Date now=new Date();Boolean isTheSameMonth=false; //是否与当前月份相同//判断显示的日期月份与当前月份相同if (date.getMonth()==now.getMonth()) {//月份相同isTheSameMonth = true;}//若显示的日期月份与当前月份相同,则设置字体颜色是黑色if (isTheSameMonth) {viewHolder.itemTv.setTextColor(Color.parseColor("#000000"));}//设置当前日期字体为红色if (now.getDate()==date.getDate()&&now.getMonth()==date.getMonth()&&now.getYear()==date.getYear()){viewHolder.itemTv.setTextColor(Color.parseColor("#ff0000"));}

4. 事件监听

在NewCalendar中,首先编写长按事件的接口,然后设置适配器点击事件

//长按事件接口public interface NewCalendarListener{void onItemClick(Date date);}//适配器长按事件calendarGv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {@Overridepublic boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {if (listener==null){return false;}else {//获取长按的位置,传入onItemClick方法中listener.onItemClick((Date) parent.getItemAtPosition(position));return true;}}});

在MainActivity中,实现长按事件接口并重写方法,实现长按某个日期弹出Toast显示当前长按日期。

@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);NewCalendar calendar=findViewById(R.id.calendarNc);calendar.listener=this;}//MainActivity实现长按事件接口@Overridepublic void onItemClick(Date date) {DateFormat df= SimpleDateFormat.getDateInstance();Toast.makeText(this,df.format(date),Toast.LENGTH_SHORT).show();}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。