Android实现一个简单的课程表
课程表要做复杂要考虑的东西很多,这里只说实现界面的一个简单的思路:ScrollView嵌套七个(一周七天)LinearLayout, 而每个LinearLayout又能封装成一个课程表View的ViewItem,都继承自FrameLayout。下面上代码:
首先是课程表每一天的item,现在默认一天是7节课,后面可设置成可拓展用代码实现,这里现在xml里写死:
<?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="wrap_content" android:orientation="vertical" > <TextView android:id="@+id/tv_school_timetable_item_day" android:layout_width="match_parent" android:layout_height="40dp" android:text="Mon" android:textColor="@color/white" android:background="@color/black" android:gravity="center" android:textSize="20sp" /> <TextView android:id="@+id/tv_school_timetable_item_class1" android:layout_width="match_parent" android:layout_height="60dp" android:text="语文" android:textColor="@color/black" android:background="@color/white" android:gravity="center" android:textSize="18sp" /> <TextView android:id="@+id/tv_school_timetable_item_class2" android:layout_width="match_parent" android:layout_height="60dp" android:text="语文" android:textColor="@color/black" android:background="@color/white" android:gravity="center" android:textSize="18sp" android:layout_marginTop="1dp" /> <TextView android:id="@+id/tv_school_timetable_item_class3" android:layout_width="match_parent" android:layout_height="60dp" android:text="语文" android:textColor="@color/black" android:background="@color/white" android:gravity="center" android:textSize="18sp" android:layout_marginTop="1dp" /> <TextView android:id="@+id/tv_school_timetable_item_class4" android:layout_width="match_parent" android:layout_height="60dp" android:text="语文" android:textColor="@color/black" android:background="@color/white" android:gravity="center" android:textSize="18sp" android:layout_marginTop="1dp" /> <TextView android:id="@+id/tv_school_timetable_item_class5" android:layout_width="match_parent" android:layout_height="60dp" android:text="语文" android:textColor="@color/black" android:background="@color/white" android:gravity="center" android:textSize="18sp" android:layout_marginTop="1dp" /> <TextView android:id="@+id/tv_school_timetable_item_class6" android:layout_width="match_parent" android:layout_height="60dp" android:text="语文" android:textColor="@color/black" android:background="@color/white" android:gravity="center" android:textSize="18sp" android:layout_marginTop="1dp" /> <TextView android:id="@+id/tv_school_timetable_item_class7" android:layout_width="match_parent" android:layout_height="60dp" android:text="语文" android:textColor="@color/black" android:background="@color/white" android:gravity="center" android:textSize="18sp" android:layout_marginTop="1dp" /> </LinearLayout>就是竖着排8个TextView,第一个text用来显示星期几,后面的就是显示课程名称,如果复杂,可以把TextView换成一个包含多个View的Layout,尺寸大小都可以通过代码来控制,这里不展开。然后是item控件的代码:
package com.amuro.timetable; import com.amuro.schooltimetabletest.R; import android.content.Context; import android.util.AttributeSet; import android.view.LayoutInflater; import android.widget.FrameLayout; import android.widget.TextView; public class SchoolTimetableItem extends FrameLayout { private TextView textViewDay; private TextView textViewClass1; private TextView textViewClass2; private TextView textViewClass3; private TextView textViewClass4; private TextView textViewClass5; private TextView textViewClass6; private TextView textViewClass7; public SchoolTimetableItem(Context context, AttributeSet attrs) { super(context, attrs); LayoutInflater.from(context).inflate(R.layout.school_timetable_item_layout, this); initView(); } private void initView() { textViewDay = (TextView)findViewById(R.id.tv_school_timetable_item_day); textViewClass1 = (TextView)findViewById(R.id.tv_school_timetable_item_class1); textViewClass2 = (TextView)findViewById(R.id.tv_school_timetable_item_class2); textViewClass3 = (TextView)findViewById(R.id.tv_school_timetable_item_class3); textViewClass4 = (TextView)findViewById(R.id.tv_school_timetable_item_class4); textViewClass5 = (TextView)findViewById(R.id.tv_school_timetable_item_class5); textViewClass6 = (TextView)findViewById(R.id.tv_school_timetable_item_class6); textViewClass7 = (TextView)findViewById(R.id.tv_school_timetable_item_class7); } public void setDay(String day) { textViewDay.setText(day); } public void setClasses(String[] classes) { textViewClass1.setText(classes[0]); textViewClass2.setText(classes[1]); textViewClass3.setText(classes[2]); textViewClass4.setText(classes[3]); textViewClass5.setText(classes[4]); textViewClass6.setText(classes[5]); textViewClass7.setText(classes[6]); } }代码有点low,可以用list来简化,不要在意这些细节。
下一步就是封装成课程表控件,上代码和布局文件:
package com.amuro.timetable; import android.content.Context; import android.util.AttributeSet; import android.view.LayoutInflater; import android.widget.FrameLayout; import com.amuro.schooltimetabletest.R; public class SchoolTimetable extends FrameLayout { private String[] days = {"Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"}; private String[][] classes = { {"语", "", "数", "", "", "英", ""}, {"物", "", "", "英", "", "", "数"}, {"", "", "化", "", "", "", ""}, {"生", "", "", "", "语", "", "数"}, {"", "物", "", "英", "", "", ""}, {"", "语", "化", "", "", "", ""}, {"数", "", "", "英", "", "", ""}}; public SchoolTimetable(Context context, AttributeSet attrs) { super(context, attrs); LayoutInflater.from(context).inflate(R.layout.school_timetable_layout, this); initView(); } private void initView() { int startId = R.id.sti_school_timetable_1; for(int i = 0;i < 7;i++) { SchoolTimetableItem sti = (SchoolTimetableItem)findViewById(startId + i); sti.setDay(days[i]); sti.setClasses(classes[i]); } } }
<?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <com.amuro.timetable.SchoolTimetableItem android:id="@+id/sti_school_timetable_1" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" /> <com.amuro.timetable.SchoolTimetableItem android:id="@+id/sti_school_timetable_2" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:layout_marginLeft="1dp" /> <com.amuro.timetable.SchoolTimetableItem android:id="@+id/sti_school_timetable_3" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:layout_marginLeft="1dp" /> <com.amuro.timetable.SchoolTimetableItem android:id="@+id/sti_school_timetable_4" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:layout_marginLeft="1dp" /> <com.amuro.timetable.SchoolTimetableItem android:id="@+id/sti_school_timetable_5" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:layout_marginLeft="1dp" /> <com.amuro.timetable.SchoolTimetableItem android:id="@+id/sti_school_timetable_6" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:layout_marginLeft="1dp" /> <com.amuro.timetable.SchoolTimetableItem android:id="@+id/sti_school_timetable_7" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:layout_marginLeft="1dp" /> </LinearLayout> </ScrollView>
把课程表和课程表item分离是为了两边可以分别拓展功能,做好解耦,熟悉偶的朋友都知道这是偶的强迫症。
最后,很多朋友肯定会说:
既然你们都这么说了,那我就不上了,谢谢大家,逃~
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。