Android开发中实现GridLayout自定义的日历控件
来源:爱站网时间:2021-04-15编辑:网友分享
我们在开发中最简单的空间,是日历的实现,而要将他们组合成我们需要的图像,其实操作起来是比较简单的,下面就由爱站技术频道具体介绍Android开发中实现GridLayout自定义的日历控件,一起进入下文参考吧。
我们在开发中最简单的空间,是日历的实现,而要将他们组合成我们需要的图像,其实操作起来是比较简单的,下面就由爱站技术频道具体介绍Android开发中实现GridLayout自定义的日历控件,一起进入下文参考吧。
效果图
思路:就是先设置Gridlayout的行列数,然后往里面放置一定数目的自定义日历按钮控件,最后实现日历逻辑就可以了。
步骤:
第一步:自定义日历控件(初步)
第二步:实现自定义单个日期按钮控件
第三步:将第二步得到的控件动态添加到第一步的布局中,并实现日期逻辑
第四步:编写单个日期点击监听器接口
第一步:自定义日历控件(初步)
package com.包名.myCalendarView; import java.util.Calendar; import java.util.Date; import android.content.Context; import android.graphics.Color; import android.util.AttributeSet; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.WindowManager; import android.widget.GridLayout; import android.widget.ImageButton; import android.widget.LinearLayout; import android.widget.TextView; import com.xuy849.utils.Info; import com.xuy849.weightapp.R; public class MyCalendar extends LinearLayout implements OnClickListener{ Context context; TextView tv_yearAndMonth; ImageButton ib_pre; ImageButton ib_next; ImageButton ib_back; GridLayout gl_calendar; View view; CalendarButton buttons[]; int sideLength; String week[] = {"日","一","二","三","四","五","六"}; Date date; Calendar calendar; int year,month,day; int res; public MyCalendar(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); this.context = context; // TODO Auto-generated constructor stub init(); } public MyCalendar(Context context, AttributeSet attrs) { super(context, attrs); this.context = context; // TODO Auto-generated constructor stub init(); } public MyCalendar(Context context) { super(context); this.context = context; // TODO Auto-generated constructor stub init(); } private void init(){ this.view = LayoutInflater.from(context).inflate(R.layout.my_calendar_view, this); } }
效果图:(请无视ListView)
第二步:自定义单个日期按钮控件
package com.包名.myCalendarView; import java.util.Date; import android.content.Context; import android.graphics.Color; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import com.xuy849.utils.Info; import com.xuy849.weightapp.R; class CalendarButton extends LinearLayout{ Context context; TextView tv_date; TextView tv_data; ImageView iv_note; LinearLayout ll_container; View view; Date date; public CalendarButton(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); this.context = context; // TODO Auto-generated constructor stub init(); } public CalendarButton(Context context, AttributeSet attrs) { super(context, attrs); this.context = context; // TODO Auto-generated constructor stub init(); } public void setTotalEnable(boolean b){ this.setEnabled(b); } public CalendarButton(Context context) { super(context); this.context = context; // TODO Auto-generated constructor stub init(); } public void setDate(Date date){ this.date = date; } public Date getDate(){ return this.date; } private void init(){ view = LayoutInflater.from(context).inflate(R.layout.date_button, this); //findViewById tv_date =(TextView)view.findViewById(R.id.textView1); tv_data = (TextView)view.findViewById(R.id.textView2); iv_note = (ImageView)view.findViewById(R.id.imageView1); ll_container = (LinearLayout)view.findViewById(R.id.linearLayout01); } public void setDateText(String text){ tv_date.setText(text); } public void setDateTextColor(int color){ tv_date.setTextColor(color); } } }
效果图:
第三步:将第二步得到的控件在java代码中添加到第一步的布局中,并添加相关逻辑
package com.包名.myCalendarView; import java.util.Calendar; import java.util.Date; import android.content.Context; import android.graphics.Color; import android.util.AttributeSet; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.WindowManager; import android.widget.GridLayout; import android.widget.ImageButton; import android.widget.LinearLayout; import android.widget.TextView; import com.xuy849.utils.Info; import com.xuy849.weightapp.R; public class MyCalendar extends LinearLayout implements OnClickListener{ Context context; TextView tv_yearAndMonth; ImageButton ib_pre; ImageButton ib_next; ImageButton ib_back; GridLayout gl_calendar; View view; CalendarButton buttons[]; int sideLength; String week[] = {"日","一","二","三","四","五","六"}; Date date; Calendar calendar; int year,month,day; int res; public MyCalendar(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); this.context = context; // TODO Auto-generated constructor stub init(); } public MyCalendar(Context context, AttributeSet attrs) { super(context, attrs); this.context = context; // TODO Auto-generated constructor stub init(); } public MyCalendar(Context context) { super(context); this.context = context; // TODO Auto-generated constructor stub init(); } private void init(){ this.view = LayoutInflater.from(context).inflate(R.layout.my_calendar_view, this); WindowManager ww = (WindowManager)getContext().getSystemService(Context.WINDOW_SERVICE); sideLength = ww.getDefaultDisplay().getWidth()/Info.COLUMN_COUNT; // myFindViewById(); //初始化日历按钮布局 initCalendarLayout(); //初始化按钮点击事件 initButton(); } private void initButton(){ ib_pre.setOnClickListener(this); ib_next.setOnClickListener(this); ib_back.setOnClickListener(this); } private void myFindViewById(){ tv_yearAndMonth = (TextView)view.findViewById(R.id.textView1); ib_pre = (ImageButton)view.findViewById(R.id.imageButton2); ib_next = (ImageButton)view.findViewById(R.id.imageButton3); ib_back = (ImageButton)view.findViewById(R.id.imageButton1); gl_calendar =(GridLayout)view.findViewById(R.id.gridLayout01); // buttons = new CalendarButton[Info.COLUMN_COUNT*Info.ROW_COUNT]; } //根据传递过来的calendar,绘制当月的日历视图 private void initCalendar(Calendar calendar){ int year = calendar.get(Calendar.YEAR); int month = (calendar.get(Calendar.MONTH)+1); int date = calendar.get(Calendar.DATE); //设置标题 String todayStr = String.format("%04d年%02d月", calendar.get(Calendar.YEAR),(calendar.get(Calendar.MONTH)+1)); tv_yearAndMonth.setText(todayStr); // calendar.set(Calendar.DAY_OF_MONTH, 1); int currentMonthFirstDateInWeek = calendar.get(Calendar.DAY_OF_WEEK)-1; calendar.set(Calendar.DAY_OF_MONTH, date); int currentMonthDaysSum = calendar.getActualMaximum(Calendar.DAY_OF_MONTH); calendar.roll(Calendar.MONTH, -1); int lastMonthDaysSum = calendar.getActualMaximum(Calendar.DAY_OF_MONTH); int i; calendar.roll(Calendar.MONTH, 1); Log.w("月", currentMonthDaysSum+"天"); Log.w("上月", lastMonthDaysSum +"天"); /* * 设置日期 */ //设置本月 Log.w("currentMonthFirstDateInWeek",currentMonthFirstDateInWeek+""); Log.w("currentMonthFirstDateInWeek%7111",currentMonthDaysSum+currentMonthFirstDateInWeek%7+""); for(i=currentMonthFirstDateInWeek%7+7;i
第四步:编写单个日期点击监听器接口
在第三步中添加方法:
//设置下标是index的日期按钮的点击事件监听器 public void setOnClickButtonListener(OnClickListener l,int index){ buttons[index].setOnClickListener(l); }
上述是爱站技术频道小编介绍的Android开发中实现GridLayout自定义的日历控件,我们只有对他们足够熟悉,才能顺利的提高项目的进步。