博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《Concise课程表》开发过程总结
阅读量:6579 次
发布时间:2019-06-24

本文共 5845 字,大约阅读时间需要 19 分钟。

hot3.png

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

首先做这个APP的目的很明确,就是希望做一个简单明了的课程表,能像学校发的纸质课表一样–一目了然。

1、主界面的布局
最开始我就想到了用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中就可以填写课程信息了。主界面设计图

需要注意的问题是

我们先得绘制完组件才能获取组件属性信息,然后才能设置相关的组件(TextView)的文本信息为我们要填充的课程信息。
在onCreate()函数中逻辑上就需要调用

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

但事实上这不行,因为在调用loadClasstable()的时候,在showDesktop()执行组件的绘制,调用loadClasstable()时,事实上组件还未绘制完成,所以loadClasstable()方法中无法获取组件的width,height信息。于是这里就需要注册一个监听事件,等主LinearLayout组件中所有View绘制完成了再来调用loadClasstable()。

在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;
  }
 });

2、APP的配置属性设置

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

preference.xml

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=" ">
 
<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类对象,接下来就可以对属性进行设置了

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

3、自定义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=" "
 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>

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

转载于:https://my.oschina.net/tangs90/blog/83650

你可能感兴趣的文章
Craking the Interview-1
查看>>
CCF NOI1150 确定进制
查看>>
SpringBoot实战总汇--详解
查看>>
2018年7月1日笔记
查看>>
尝试使用iReport4.7(基于Ubuntu Desktop 12.04 LTS)
查看>>
动态规划:金矿模型
查看>>
子元素应该margin-top为何会影响父元素【转】
查看>>
AJAX 状态值(readyState)与状态码(status)详解
查看>>
BZOJ3668:[NOI2014]起床困难综合症(贪心)
查看>>
LightOJ 1245(Harmonic Number (II))
查看>>
小知识记录
查看>>
109. Convert Sorted List to Binary Search Tree
查看>>
css3 animate 和关键帧 @-webkit-keyframes
查看>>
文字链接颜色设置
查看>>
图片转流
查看>>
ubunto应用软件
查看>>
Git初始化仓库
查看>>
HTML 标签说明
查看>>
锋利的jQuery-2--判断jQuery获取到的对象是否存在$().length
查看>>
linux 查询系统版本命令、查询端口号是否被占用命令
查看>>