android程序日历layout,Android使用GridLayout绘制自定义日历控件
效果图
思路:就是先设置Gridlayout的行列数,然后往里面放置一定数目的自定义日历按钮控件,最后实现日历逻辑就可以了。
步骤:
第一步:自定义日历控件(初步)
第二步:实现自定义单个日期按钮控件
第三步:将第二步得到的控件动态添加到第一步的布局中,并实现日期逻辑
第四步:编写单个日期点击监听器接口
第一步:自定义日历控件(初步)
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
android:layout_width="match_parent"
android:layout_height="55dp"
android:orientation="vertical"
android:background="@color/lightGreen" >
android:layout_width="match_parent"
android:layout_height="match_parent" >
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:textColor="@color/white"
android:textSize="9pt"
android:text="2016年10月" />
android:id="@+id/imageButton1"
android:layout_width="30dp"
android:layout_height="20dp"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:layout_marginLeft="16dp"
android:background="@drawable/back" />
android:id="@+id/imageButton2"
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_alignTop="@+id/imageButton1"
android:layout_centerVertical="true"
android:layout_marginRight="16dp"
android:layout_toLeftOf="@+id/textView1"
android:background="@drawable/pre" />
android:id="@+id/imageButton3"
android:layout_width="18dp"
android:layout_height="18dp"
android:layout_centerVertical="true"
android:layout_alignTop="@+id/textView1"
android:layout_marginLeft="16dp"
android:layout_toRightOf="@+id/textView1"
android:background="@drawable/back11" />
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_marginTop="10dp" >
android:id="@+id/gridLayout01"
android:layout_width="match_parent"
android:layout_height="match_parent" >
android:id="@+id/listView1"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
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)
第二步:自定义单个日期按钮控件
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/background01"
android:orientation="vertical" >
android:layout_width="wrap_content"
android:id="@+id/linearLayout01"
android:layout_height="wrap_content"
android:background="@color/calendarBackground"
android:orientation="vertical"
android:layout_marginBottom="1dp">
android:layout_width="match_parent"
android:layout_height="match_parent" >
android:id="@+id/imageView1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="invisible"
android:src="@drawable/selected_date" />
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center">
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="8pt"
android:text="20" />
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="3dp"
android:textColor="@color/blue"
android:visibility="invisible"
android:text="65.1" />
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<=(currentMonthDaysSum+currentMonthFirstDateInWeek%7+7-1)&&i
buttons[i].changeToState(Info.STATE_NORMAL_NORECORED);
buttons[i].setDateText((i-currentMonthFirstDateInWeek%7-7+1)+"");
buttons[i].setDateTextColor(Color.BLACK);
buttons[i].setEnabled(true);
buttons[i].setDate(new Date(year,month,i-(currentMonthFirstDateInWeek%7+7)+1));
}
//设置上一个月
for(i=7;i
buttons[i].changeToState(Info.STATE_NORMAL_NORECORED);
buttons[i].setDateTextColor(Color.GRAY);
buttons[i].setDateText(lastMonthDaysSum-(currentMonthFirstDateInWeek%7-i%7)+1+"");
buttons[i].setEnabled(false);
}
//设置下一个月
for(i =currentMonthDaysSum+currentMonthFirstDateInWeek%7+7;i
buttons[i].changeToState(Info.STATE_NORMAL_NORECORED);
buttons[i].setDateTextColor(Color.GRAY);
buttons[i].setDateText((i-(currentMonthDaysSum+currentMonthFirstDateInWeek%7+7)+1)+"");
buttons[i].setEnabled(false);
}
//设置当天
if(year==this.year&&month==this.month&&day==this.day)
buttons[date+currentMonthFirstDateInWeek%7+7-1].changeToState(Info.STATE_TODAY_NORECORED);
//初始化界面
if(res!=0)
initLayout(res);
}
private void initCalendarLayout(){
//设置行数,列数
gl_calendar.setRowCount(Info.ROW_COUNT);
gl_calendar.setColumnCount(Info.COLUMN_COUNT);
/*
* 添加按钮到布局
*/
int i;
int sum = Info.ROW_COUNT*Info.COLUMN_COUNT;
//设置星期
for(i=0;i
buttons[i] = new CalendarButton(context);
buttons[i].setDateText(week[i]);
buttons[i].setLayoutParams(new LayoutParams(sideLength, sideLength));
gl_calendar.addView(buttons[i], i);
buttons[i].setEnabled(false);
}
for(i = Info.COLUMN_COUNT;i
buttons[i] = new CalendarButton(context);
buttons[i].setDateText("55");
buttons[i].setLayoutParams(new LayoutParams(sideLength, sideLength));
gl_calendar.addView(buttons[i], i);
}
//根据当月设置情况
calendar = Calendar.getInstance();
year = calendar.get(Calendar.YEAR);
month = calendar.get(Calendar.MONTH)+1;
day = calendar.get(Calendar.DATE);
initCalendar(calendar);
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch(v.getId()){
//上一个月
case R.id.imageButton2:{
calendar.roll(Calendar.MONTH, -1);
initCalendar(calendar);
break;
}
//下一个月
case R.id.imageButton3:{
calendar.roll(Calendar.MONTH, 1);
initCalendar(calendar);
break;
}
}
}
public void setOnClickButtonListener(OnClickListener l,int index){
buttons[index].setOnClickListener(l);
}
public Date getDate(int index){
return buttons[index].getDate();
}
public void setData(float f,int index){
buttons[index].tv_data.setText(String.format("%.1f", f));
buttons[index].tv_data.setVisibility(TextView.VISIBLE);
}
public void initLayout(int res){
switch(res){
case Info.VIEW_WEIHT:{
break;
}
default:{
break;
}
}
}
public void setRes(int res){
this.res = res;
}
}
第四步:编写单个日期点击监听器接口
在第三步中添加方法:
//设置下标是index的日期按钮的点击事件监听器
public void setOnClickButtonListener(OnClickListener l,int index){
buttons[index].setOnClickListener(l);
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
android程序日历layout,Android使用GridLayout绘制自定义日历控件相关推荐
- Android自定义组合控件--EditText和Button组合成带有清空EditText内容功能的复合控件
目标:实现EditText和Button组合成带有清空EditText内容功能的复合控件,可以通过代码设置自定义控件的相关属性. 实现效果为: (1)在res/layout目录下编写自定义组合控件的布 ...
- java写一个android程序_【Android开发笔记】3.编写第一个Android程序
前言 上一节我们通过一个Demo熟悉了Eclipse的基本使用.如何在模拟器和手机中运行以及如何打包成APK,但没具体编写代码,相信很多同学已经按耐不住了吧,这一节我们会动手编写代码来熟悉Androi ...
- android 加载layout,Android自定义View加载视图之LoadingLayout
介绍 上一篇博文写了一个通用的加载view,这篇在加载view的基础在包裹一层就是LoadingLayout了,主要的目的是免去每次加载时要隐藏主内容布局,然后加载成功之后显示主内容布局这些繁琐操作. ...
- Android自定义控件之3D上下翻页效果的倒计时控件
这是一个自定义的倒计时控件,具有3D上下翻页翻转效果.最近项目中需要做一个倒计时控件,需要和iOS端的效果保持一样.大致效果是这样的,如下图所示: 由于暂时还不会怎么样制作gif动态图,所以想看具体效 ...
- Android开发详解:第4章《UI 控件》
Android开发详解:第4章<UI 控件> 控件是Android程序设计的基本组成单位,通过使用控件可以高效地开发Android应用程序.所以熟练掌握控件的使用是合理.有效地进行Andr ...
- Android View体系(十)自定义组合控件
相关文章 Android View体系(一)视图坐标系 Android View体系(二)实现View滑动的六种方法 Android View体系(三)属性动画 Android View体系(四)从源 ...
- Android中通过自定义签名控件实现手写签名
场景 实现手写签名并获取签名照片 注: 博客: BADAO_LIUMANG_QIZHI的博客_霸道流氓气质_CSDN博客-C#,SpringBoot,架构之路领域博主 关注公众号 霸道的程序猿 获取编 ...
- Android插件化开发指南——实践之仿酷狗音乐首页(自定义ImageView控件)
文章目录 1. 前言 2. 基础环境--实现RecyclerView的网格布局 3. 自定义ImageView 3. 后记 1. 前言 拟定实现效果部分为下图的歌单列表部分,也就是图中红线框出来的部分 ...
- Android 手机卫士--自定义组合控件构件布局结构
由于设置中心条目中的布局都很类似,所以可以考虑使用自定义组合控件来简化实现 本文地址:http://www.cnblogs.com/wuyudong/p/5909043.html,转载请注明源地址. ...
最新文章
- 基于深度学习和机器学习的心电图智能分析参赛总结
- Hazelcast集群服务(2)——Hazelcast基本配置
- 【渝粤题库】广东开放大学 劳动关系理论与实务 形成性考核
- javaweb可部署目录结构
- Bootstrap页面布局14 - BS按钮群组
- 第13届年度Webby奖采用Silverlight / 13th Annual Webby Awards powered by Silverlight
- 微信又上线了新功能,聊天再也不会发错群了?
- Python基础语法案例(Fibonacci):选择结构、循环结构、异常处理结构、代码优化
- Scala确实是门好语言
- day69-oracle 22-DBCA
- Oracle10g安装教程、配置实例、监听、客户端程序详解_Windows篇
- 水晶报表教程:手把手教你制作基本报表
- 2019年2月10日训练日记
- php相亲段子,个个都是老司机!NPC段子手们经典语录
- 阿里云邮箱域名解析设置要求
- mfc键盘控制移动鼠标光标_如何在Windows中使用键盘控制鼠标光标
- matlab 莫比乌斯带,教师数学论文,关于高等数学教学中运用多媒体手段相关参考文献资料-免费论文范文...
- 别再稀里糊涂的使用ls命令了,带你重新认识linux查看文件信息的ls【内涵长文,非命令参数罗列】
- Xcode一键发布到AppStore
- 计算机应用基础精品课程申报表,计算机应用基础精品课程申报书.doc
热门文章
- python测试udp端口_Linux系统的ECS实例中TCP/UDP端口测试及验证方法说明
- ldap基本dn_2020年,手把手教你如何在CentOS7上一步一步搭建LDAP服务器的最新教程...
- linux mysql安装 读写分离_linux下安装mysql-proxy 配置读写分离
- LGOJ P3919【模板】可持久化数组(可持久化线段树/平衡树)
- CentOS7 LVM磁盘扩容
- react+redux使用static mapStoreToProps
- 【Linux】——搭建redis
- 在WIN7系统的笔记本上建立WIFI热点
- [原]逆向iOS SDK -- +[UIImage imageNamed:] 的实现
- 转载:由图片SEO想起