Effect chart
train of thought: is to set the number of GridLayout first, and then put a certain number of custom Calendar button control, the last implementation of the calendar logic can be.
Steps:
First step: Customize the Calendar control (Preliminary)
Step Two: Implement custom single Date button controls
Step three: Add the control from the second step dynamically to the layout of the first step and implement the date logic
Fourth step: Write a single date click the Listener interface
First step: Customize the Calendar control (Preliminary)
<?xml version= "1.0" encoding= "Utf-8"?> <linearlayout xmlns:android= "http://schemas.android.com/apk/res/" Android "Android:layout_width=" Match_parent "android:layout_height=" match_parent "android:orientation=" "Vertical" &
Gt <linearlayout android:layout_width= "match_parent" android:layout_height= "Wrap_content" android:orientation= "Vertical" > <linearlayout android:layout_width= "match_parent" android:layout_height= "55DP" a ndroid:orientation= "vertical" android:background= "@color/lightgreen" > <relativelayout android: Layout_width= "Match_parent" android:layout_height= "match_parent" > <textview android:id= " @+id/textview1 "android:layout_width=" wrap_content "android:layout_height=" Wrap_content "and Roid:layout_centerhorizontal= ' true ' android:layout_centervertical= ' true ' android:textcolor= ' @color/whi TE "Android:textsiZe= "9pt" android:text= "October 2016"/> <imagebutton 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= "@drawa
Ble/back "/> <imagebutton android:id=" @+id/imagebutton2 "android:layout_width=" 20DP " android:layout_height= "20DP" android:layout_aligntop= "@+id/imagebutton1" Android:layout_center Vertical= "true" android:layout_marginright= "16DP" android:layout_toleftof= "@+id/textview1" a ndroid:background= "@drawable/pre"/> <imagebutton android:id= "@+id/imagebutton3" Androi D:layout_width= "18DP" android:layout_height= "18DP" android:layout_centervertical= "true" Andr Oid:layout_aligntop= "@+iD/textview1 "android:layout_marginleft=" 16DP "android:layout_torightof=" @+id/textview1 "Andr
oid:background= "@drawable/back11"/> </RelativeLayout> </LinearLayout> <linearlayout
Android:layout_width= "Match_parent" android:layout_height= "wrap_content" android:orientation= "vertical" android:layout_margintop= "10DP" > <gridlayout android:id= "@+id/gridlayout01" Android:layo Ut_width= "Match_parent" android:layout_height= "Match_parent" > <--! Custom Individual Calendar button controls are placed here--> </ gridlayout> </LinearLayout> <listview android:id= "@+id/listview1" android:layout_width= " Match_parent "android:layout_height=" wrap_content "> </ListView> </LinearLayout> </linearl
Ayout>
Package com. package name. 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;
TextView Tv_yearandmonth;
ImageButton Ib_pre;
ImageButton Ib_next;
ImageButton Ib_back;
GridLayout Gl_calendar;
View view;
Calendarbutton buttons[];
int sidelength;
String week[] = {"Day", "one", "two", "three", "four", "five", "six"};
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, AttributeSet attrs) {Super (context, attrs);
This.context = context;
TODO auto-generated Constructor stub init ();
Public MyCalendar {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);
}
}
Effect Picture: (Please disregard ListView)
Step Two: Customize a single date button control
<?xml version= "1.0" encoding= "Utf-8"?> <linearlayout xmlns:android= "http://schemas.android.com/apk/res/" Android "Android:layout_width=" Wrap_content "android:layout_height=" wrap_content "android:background=" @drawable Background01 "android:orientation=" vertical "> <linearlayout android:layout_width=" wrap_content "Androi"
D:id= "@+id/linearlayout01" android:layout_height= "wrap_content" android:background= "@color/calendarbackground" android:orientation= "vertical" android:layout_marginbottom= "1DP" > <framelayout android:layout_width
= "Match_parent" android:layout_height= "match_parent" > <imageview android:id= "@+id/imageview1" Android:layout_width= "Match_parent" android:layout_height= "match_parent" android:visibility= "Invis" Ible "android:src=" @drawable/selected_date "/> <linearlayout android:layout_width=" Match_pare NT "android:layout_height=" MaTch_parent "android:orientation=" vertical "android:gravity=" center "> <textview A
Ndroid:id= "@+id/textview1" android:layout_width= "wrap_content" android:layout_height= "Wrap_content" Android:textsize= "8pt" android:text= "/> <textview android:id=" @+id/textview 2 "android:layout_width=" Wrap_content "android:layout_height=" Wrap_content "android:layout_m argintop= "3DP" android:textcolor= "@color/blue" android:visibility= "Invisible" android:text= "
65.1 "/> </LinearLayout> </FrameLayout> </LinearLayout> </LinearLayout>
Package com. package name. 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;
TextView tv_date;
TextView Tv_data;
ImageView Iv_note;
LinearLayout Ll_container;
View view;
Date date;
Public Calendarbutton (context, AttributeSet attrs, int defstyle) {Super (context, attrs, Defstyle);
This.context = context;
TODO auto-generated Constructor stub init ();
Public Calendarbutton (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) {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);
}
}
}
Effect Chart:
Step Three: Add the control in the second step to the layout of the first step in Java code and add the relevant logic
Package com. package name. 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;
TextView Tv_yearandmonth;
ImageButton Ib_pre;
ImageButton Ib_next;
ImageButton Ib_back;
GridLayout Gl_calendar;
View view;
Calendarbutton buttons[];
int sidelength;
String week[] = {"Day", "one", "two", "three", "four", "five", "six"};
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, AttributeSet attrs) {Super (context, attrs);
This.context = context;
TODO auto-generated Constructor stub init ();
Public MyCalendar {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 ();
Initialize Calendar button layout initcalendarlayout ();
Initialize button click event 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];
////According to the calendar passed over, draw the month's calendars view private void Initcalendar (Calendar calendar) {int year = Calendar.get (calendar.year);
int month = (Calendar.get (calendar.month) +1);
int date = Calendar.get (calendar.date);
Set title String Todaystr = String.Format ("%04d year%02d Month", 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 ("Month", currentmonthdayssum+ "Day");
LOG.W ("Last month", Lastmonthdayssum + "days");
* * Set Date///set LOG.W for this month ("Currentmonthfirstdateinweek", currentmonthfirstdateinweek+ "");
LOG.W ("currentmonthfirstdateinweek%7111", currentmonthdayssum+currentmonthfirstdateinweek%7+ ""); For (i=currentmonthfirstdateinweek%7+7;i<= (currentmonthdayssum+currentmonthfirstdateinweek%7+7-1) &&i
<info.column_count*info.row_count;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));
}//set for one months for (i=7;i< (currentmonthfirstdateinweek%7+7) &&i<info.column_count*info.row_count;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);
//Set one month for (i =currentmonthdayssum+currentmonthfirstdateinweek%7+7;i<info.row_count*info.column_count;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); }//Set the day if (year==this.year&&month==this.month&&day==this.day) buttons[date+
Currentmonthfirstdateinweek%7+7-1].changetostate (info.state_today_norecored);
Initialize interface if (res!=0) initlayout (res);
private void Initcalendarlayout () {//Set number of rows, columns Gl_calendar.setrowcount (info.row_count);
Gl_calendar.setcolumncount (Info.column_count);
* * Add button to layout/int i;
int sum = Info.row_count*info.column_count; Set week for (i=0;i<info.column_count;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<sum;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 () According to the month setting;
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 ()) {//Previous one-month case r.id.
imagebutton2:{Calendar.roll (Calendar.month,-1);
Initcalendar (Calendar);
Break
}//Next one months 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;
}
}
Fourth Step: Write a single date click the Listener interface
Add a method in step three:
Set subscript is Index date button click event Listener public
void Setonclickbuttonlistener (Onclicklistener l,int index) {
Buttons[index ].setonclicklistener (l);
}
The above is the entire content of this article, I hope to help you learn, but also hope that we support the cloud habitat community.