《Concise课程表》开发过程总结

<<Concise课程表>>这个APP离最后一个版本1.2.1发布也快一个月了,为了给Android小组的同窗了分享一下我在作这个APP期间遇到的问题极其解决办法,和这个APP中一些关键点,特意整理了一下。 html

首先作这个APP的目的很明确,就是但愿作一个简单明了的课程表,能像学校发的纸质课表同样–一目了然。
一、主界面的布局
最开始我就想到了用Table来作,可是立刻我发现这不太适合课表,由于课程时间每每是从1-4节,5-6节这样来的,所以咱们须要合并,而这个操做对于TableLayout这个布局好像不是很好操做。因而我决定本身来设计这个界面。
1)首先,利用一个主LinearLayout填满界面,将其的背景颜色设置为Black
2)而后,在这个LinearLayout里面填充一列一列的子LinearLayout
3) 最后,在这些子LinearLayout中,添加TextView,个数根据配置属性的一天多少节课来肯定(classPerDay)。设置这些TextView上下之间一个间隔值MARGIN_TOP,这样底部背景Black就显示出来了,这样“表格”就构造好了
接下来就是填充课程数据。
这里咱们就须要一个AbsoluteLayout,固然这个布局我将其嵌套在主LinearLayout外面。
取出的数据有星期几(weekIndex),从第几节到第几节(start,end)。因而能够根据weekIndex拿到第weekIndex位置上的子LinearLayout(ll)利用ll.getLeft()获取其相对于主LinearLayout左边的长度,将其记着坐标x,根据start拿到这个子LinearLayout内的第start位置的TextView(tv)利用tv.getTop()
获取其相对于子LinearLayout顶边的长度,记着坐标y。而后新建一个TextView,设置坐标为(x,y),宽为tv.getWidth(),高为(tv.getHeight() + MARGIN_TOP) * (end – start + 1)- MARGIN_TOP。而后在这个新建的TextView中就能够填写课程信息了。主界面设计图 java

须要注意的问题是
咱们先得绘制完组件才能获取组件属性信息,而后才能设置相关的组件(TextView)的文本信息为咱们要填充的课程信息。
在onCreate()函数中逻辑上就须要调用 android

1
2
3
4
//绘制主界面
 showDesktop();
//填充数据
 loadClasstable();

但事实上这不行,由于在调用loadClasstable()的时候,在showDesktop()执行组件的绘制,调用loadClasstable()时,事实上组件还未绘制完成,因此loadClasstable()方法中没法获取组件的width,height信息。因而这里就须要注册一个监听事件,等主LinearLayout组件中全部View绘制完成了再来调用loadClasstable()。 ide

在onCreate()中就变成了 函数

1
2
3
4
5
6
7
8
9
10
11
12
13
//绘制主界面
showDesktop();
//linearLayout为主LinearLayout对象
 ViewTreeObserver vto = linearLayout.getViewTreeObserver();
 vto.addOnPreDrawListener(newViewTreeObserver.OnPreDrawListener() {
  @Override
  publicbooleanonPreDraw() {
    //填充数据
    loadClasstable(currentWeekNum);
    linearLayout.getViewTreeObserver().removeOnPreDrawListener(this);
    returntrue;
  }
 });

二、APP的配置属性设置
配置信息通常不多改变,所以咱们能够将其存放在一个特定的文件保存。
Android平台给咱们提供了一个SharedPreferences类,它是一个轻量级的存储类,特别适合用于保存软件配置参数。使用SharedPreferences保存数据,其背后是用xml文件存放数据,文件存放在/data/data/<package name>/shared_prefs目录下
而后定义SettingPreferenceActivity类继承PreferenceActivity类,PreferenceActivity类是专门用于属性配置的类
这个类要求定义一个界面preference.xml
在这个xml中要定义一些常见的标签,如CheckBoxPreference、EditTextPreference、RingtonePreference等
每一个标签有一个android:layout用来定义这个标签的显示效果,这里就再也不详述 布局

preference.xml this

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
<?xmlversion="1.0"encoding="utf-8"?>
<PreferenceScreenxmlns:android=" http://schemas.android.com/apk/res/android">
 
<PreferenceCategory
 android:layout="@xml/pref_category"
 android:title="基本设置">
 <Preference
 android:key="setting_firstweek"
 android:layout="@xml/pref_list_item_top"
 android:summary="未设置"
 android:title="第1周星期1"
 android:widgetLayout="@xml/pref_widget_more"/>
 
<ListPreference
 android:dialogTitle="共多少星期"
 android:entries="@array/week_array"
 android:entryValues="@array/week_array"
 android:key="setting_totalweeknum"
 android:layout="@xml/pref_list_item_mid"
 android:summary="未设置"
 android:title="共多少周"
 android:widgetLayout="@xml/pref_widget_more"/>
 <ListPreference
 android:dialogTitle="设置"
 android:entries="@array/classnum_array"
 android:entryValues="@array/classnum_array"
 android:key="setting_classperday"
 android:layout="@xml/pref_list_item_mid"
 android:summary="未设置"
 android:title="天天几节课"
 android:widgetLayout="@xml/pref_widget_more"/>
 
<Preference
 android:key="setting_toset_classtime"
 android:layout="@xml/pref_list_item_bot"
 android:summary="点击修改"
 android:title="上课时间"
 android:widgetLayout="@xml/pref_widget_more"/>
 </PreferenceCategory>
 <PreferenceCategory
 android:layout="@xml/pref_category"
 android:title="闹钟设置">
 <CheckBoxPreference
 android:key="setting_allalarm"
 android:layout="@xml/pref_list_item_top"
 android:summaryOff="关闭"
 android:summaryOn="开启"
 android:title="闹钟状态"/>
 
<ListPreference
 android:dependency="setting_allalarm"
 android:dialogTitle="设置"
 android:entries="@array/bf_alarmtime_array"
 android:entryValues="@array/bf_alarmtime_array_values"
 android:key="setting_bfalarmtime"
 android:layout="@xml/pref_list_item_mid"
 android:title="课前几分钟提醒"
 android:widgetLayout="@xml/pref_widget_more"/>
 
<CheckBoxPreference
 android:key="setting_music"
 android:dependency="setting_allalarm"
 android:layout="@xml/pref_list_item_mid"
 android:summaryOff="关闭"
 android:summaryOn="开启"
 android:title="铃声提醒"/>
 
<RingtonePreference
 android:key="setting_ring"
 android:dependency="setting_allalarm"
 android:layout="@xml/pref_list_item_mid"
 android:ringtoneType="alarm"
 android:showDefault="true"
 android:showSilent="true"
 android:summary="系统默认"
 android:title="铃声歌曲"
 android:widgetLayout="@xml/pref_widget_more">
 </RingtonePreference>
 
<CheckBoxPreference
 android:key="setting_vibrate"
 android:dependency="setting_allalarm"
 android:layout="@xml/pref_list_item_bot"
 android:summaryOff="关闭"
 android:summaryOn="开启"
 android:title="震动提醒"/>
 </PreferenceCategory>
 
</PreferenceScreen>

在SettingPreferenceActivity类中就能够利用以下语句加载xml配置文件,而后获取Editor类对象,接下来就能够对属性进行设置了 spa

1
2
3
4
5
// 所的的值将会自动保存到SharePreferences
addPreferencesFromResource(R.xml.preference);
// 获得以包命名的SharedPreferences
SharedPreferences mSharedPrefs = PreferenceManager.getDefaultSharedPreferences(this);
Editor editor = mSharedPrefs.edit();

三、自定义Activity的title显示的位置
在Activity类中调用
getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.customtitle);
界面文件customtitle.xml 设计

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?xmlversion="1.0"encoding="utf-8"?>
<LinearLayoutxmlns:android=" http://schemas.android.com/apk/res/android"
 android:layout_width="fill_parent"
 android:layout_height="wrap_content"
 >
 
<LinearLayout
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
 android:gravity="center_horizontal"
 android:orientation="horizontal">
 <TextView
 android:id="@+id/tv_title"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:textColor="@color/white"
 android:textSize="18.0sp">
 
</TextView>
 </LinearLayout>
</LinearLayout>

编辑这个文件来显示你想要的效果。 server

相关文章
相关标签/搜索