文档章节

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

半天想不出来
 半天想不出来
发布于 2012/10/17 22:55
字数 1515
阅读 411
收藏 3

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

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

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

本文转载自:http://tangs90.net/concise-app-keypoint/

半天想不出来
粉丝 2
博文 2
码字总数 135
作品 0
武汉
程序员
私信 提问
加载中

评论(2)

半天想不出来
半天想不出来 博主

引用来自“汪华冰”的评论

谢谢~~想法不错,不过用子RelativeLayout布局算法会简单很多。

业余开发,多多指教
汪华冰
汪华冰
谢谢~~想法不错,不过用子RelativeLayout布局算法会简单很多。
写给人类的机器学习 六、最好的机器学习资源

六、最好的机器学习资源 原文:The Best Machine Learning Resources 作者:Vishal Maini 译者:飞龙 协议:CC BY-NC-SA 4.0 用于制定人工智能、机器学习和深度学习课程表的资源概览。 制定课...

apachecn_飞龙
2017/10/21
0
0
java|写一个简单功能课程表

课程表 课程数据录入 课程数据显示 课程数据修改和删除 根据2份不同课程表,显示共同选修的课程 根据2份不同课程表,显示共同的空闲时间 对比结果保存为文本文件 数据备份功能 (兄弟不是伸手...

_oracle
2014/12/28
2.3K
1
有人了解值班表的排班,或是课程表安排的相关算法吗?

有人了解值班表的排班,或是课程表安排的相关算法吗? 就是在一定的约束条件下安排值班表或安排课程表,有人了解相关算法么?

nile
2011/02/24
2K
3
MySQL数据库基础(四)——MySQL数据库创建实例

MySQL数据库基础(四)——MySQL数据库创建实例 一、创建数据库 1、创建数据库 创建数据库,指定数据库的默认字符集为utf8。 create database schoolDB default character set utf8; 连接数据...

642960662
2018/03/26
0
0
昨晚做了一个怪梦

昨晚做了一个怪梦 梦见回到少年时 快上学了 准备对着课程表整理书包 课程表是拍成图片存手机里的 手机里图片太多,怎样都找不到 这边看着时间到点,父母催吃饭 心急火燎的要崩溃 醒来想了想,...

梅开源
2016/09/01
155
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周三乱弹 —— 投篮的一霎那,你突然心悸

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @clouddyy :#每日一歌# 分享ろん的单曲《First Love (原唱:宇多田ヒカル / produced by keeno)》: 《First Love (原唱:宇多田ヒカル / prod...

小小编辑
16分钟前
43
4
小程序for批量嵌套数据

js Page({ data: { objectArray: [{ id: 5, unique: 'unique_5', count:'countf' }, { id: 4, unique: 'unique_4', ......

淘幻幻
42分钟前
4
0
分享一个 pycharm 专业版的永久使用方法

刚开始接触Python,首先要解决的就是Python开发环境的搭建。 目前比较好用的Python开发工具是PyCharm,他有社区办和专业版两个版本,但是社区版支持有限,我们既然想好好学python,那肯定得用...

上海小胖
55分钟前
6
0
Spring Cloud Alibaba 实战(二) - 关于Spring Boot你不可不知道的实情

0 相关源码 1 什么是Spring Boot 一个快速开发的脚手架 作用 快速创建独立的、生产级的基于Spring的应用程序 特性 无需部署WAR文件 提供starter简化配置 尽可能自动配置Spring以及第三方库 ...

JavaEdge
今天
7
0
TensorFlow 机器学习秘籍中文第二版(初稿)

TensorFlow 入门 介绍 TensorFlow 如何工作 声明变量和张量 使用占位符和变量 使用矩阵 声明操作符 实现激活函数 使用数据源 其他资源 TensorFlow 的方式 介绍 计算图中的操作 对嵌套操作分层...

ApacheCN_飞龙
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部