<<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