<<>>这个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> |
编辑这个文件来显示你想要的效果。