《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

相關文章
相關標籤/搜索