2015/04/01 星期三
计划:
- 改变List的存储结构(数据库或者其他),读取方式。
- 添加编辑功能(增删改)。
- 按钮/开关的状态信息保存。
- 全开全关按钮的边界。
完成:
- 之所以页面在上下滑动时开关的状态会自己改变,是因为在生成页面,显示开关状态时,没有按照各个开关在数据库中的位置来显示其状态,而只是在生成某一行是读取当前holder的值。
问题原因:主要问题在于根据状态来改变按钮的显示,但因为listview的item具有复用机制,可能会出现按钮状态连锁改变、按钮状态紊乱等不定情况,解决办法是记住对应索引的按钮状态存入集合,在getview中读取,显示,触发事件的时候再更改集合,重新赋值。
protected void onListItemClick(ListView l, View v, int position, long id)
声明,我看文档了,文档说:
onListItemClick:当list里的一个item被点击的时候调用
l
这个点击事件在哪个ListView发生的
v
哪个View被点击了
position
这个View在ListView中的位置
id
这个被点击的View的ID
position 在listview是的位置,可以理解为数组的下标。id是子view的资源id,在整个应用中是唯一的。 |
position是用来被Cursor定位的,id是被SQLiteOpenHelper增删改查用的。
id是数据库相关的变量,Cursor查询数据库时有用
参考资料:
BaseAdapter——convertView回收机制与动态控件响应
SlideExpandableListView-master
Android ListView和Adapter(二) 继承BaseAdapter实现一个列表功能:
在处理ListView的条目点击事件的时候,ListView的父类AdapterView会有一个方法getItemAtPosition 这个方法会调用Adapter中的getItem(int postion)方法
开启这个状态开关需要写在OnItemClickListener(), 再里面通过getAdapter获取BaseAdapter实例,然后通过其中的notifyDataSetInvalidated()刷新数据就好了。
2015/04/02 星期四
计划:
- 解决页面上下滑动时Item的状态自动改变问题和Item的联动问题。
- 解决页面点击某个开关,其他开关动作的问题。
- 添加编辑功能(增删改)。
- 按钮/开关的状态信息保存。
- 全开全关按钮的边界。
完成:
- 之所以Item会有联动的现象,是因为下面刚刷新出来的Item是回收利用的之前的convertView,而之前的convertView的开关状态已经改变了。解决这个问题需要新建一个arrayList变量,保存各个Item的position值及其开关状态。
private ArrayList<Integer> attentionArr; attentionArr=new ArrayList<Integer>(); //根据当前position判断,重新制做样式 if (attentionArr.contains(position)) { attention.setTextColor(Color.RED); }else { attention.setTextColor(Color.BLACK); } attentionArr.add(position);//在点击时将position加入其中
- 之所以点击页面上某个开关,其他开关动作,是因为此时监听点击事件的函数holder.nodeSwitch.setOnClickListener()所监听的并不是我们点击的那个开关,而是当前页面中最后一个载入的Item,因此想要使我们点击的那个开关动作,需要加入下面两句话:
final ImageView imageView = holder.nodeSwitch; imageView.setImageResource(R.drawable.light_on);
3. 此时的问题是点击一次打开开关时保存了当前的position到数组,但当再点击一次即又关闭了开关时并没有删除数组中的position值,要找到这个值并删除。
解决办法为当点击一次,即打开开关保存position之前先进行判断,遍历数组,若之前存在过position的值,就将它们删除,然后再添加;再次点击,即关闭开关时,遍历数组,删除position。
参考资料:
BaseAdapter——convertView回收机制与动态控件响应
2015/04/03 星期五
计划:
- 打开应用时,从数据库读取各个开关的状态并显示,即设定信息的保存;
- 将MyAdapter ( extends BaseAdapter ) 分离出去,降低耦合;
- 添加编辑功能(增删改);
- 按钮/开关的状态信息保存;
- 全开全关按钮的边界。
完成:
- 尝试将BaseAdapter类分离出去,但是由于点击事件的记录数组,响应时需要数组判断,数据库处理函数,修改图片等操作的错综复杂,没有成功。
- 继续研究从数据库读取数据时总是出错的问题,若在最开始遍历时,读取判断on/off并存至数组,再在数组中确定开关图片,这种方式能将更改后的数据保存至数据库,但是当上下滑动时,开关图片仍恢复为应用最开始的图片,虽然数据库中的开关状态已经改变。还没有找到解决办法。
参考资料:
从源代码的角度分析--在BaseAdapter调用notifyDataSetChanged()之后发生了什么
2015/04/07 星期二
计划:
- 重新设计样式,按照新样式进行开发;
- 学习顶部导航栏控件及其滑动操作。
完成:
- 与公司前辈讨论确定了毕业设计的样式,包括页面和功能;
- 查找了顶部导航栏的资料,学习了滑动操作。不过这里继承的是FragmentActivity类,而如果想集成进之前做的底部菜单栏中(继承的是Fragment类),需要调整和改进,还需要继续研究。
参考资料:
ListView的性能优化之convertView和viewHolder
主要介绍Item有多种特定格式时,如有的item中包含图片,有的item包含视频,此时根据样式确定布局。涉及函数
public int getItemViewType(int position) {}
public int getViewTypeCount() {}
ViewPager的setOnPageChangeListener方法详解
介绍使用ViewPage时,最关键的代码就是setOnPageChangeListener,传入一个ViewPager. OnPageChangeListener对象。ViewPager. OnPageChangeListener是个接口,有三个方法。
SQLite 轻量级数据库、
优点: 可以将自己的数据存储到文件系统或者数据库当中, 也可以将自己的数据存储到SQLite数据库当中,还可以存到SD卡中
注意:
1. 数据库对于一个游戏(一个应用)来说是私有的,并且在一个游戏当中,数据库的名字也是唯一的。
2. apk中创建的数据库外部的进程是没有权限去读/写的,我们需要把数据库文件创建到sdcard上可以解决类似问题.
3. 当你删除id靠前的数据或者全部删除数据的时候,SQLite不会自动排序,也就是说再添加数据的时候你不指定id那么SQLite默认还是在原有id最后添加一条新数据
4. android 中 的SQLite 语法大小写不敏感,也就是说不区分大小写;
2015/04/08 星期三
计划:
- 实现底部工具栏和顶部导航栏结合
完成:
- 完成底部工具栏和顶部导航栏的结合,不过底部工具栏再切换的时候程序会崩溃,目前还没找到原因,准备按照网上的代码重新写。
参考资料:
微信4.2导航栏切换效果和Fragment实现TabHost
Android 底部和顶部都有导航栏
底部导航栏可以切换activity,顶部是viewpager+fragment用RadioGroup来切换,
最后用的RadioGroup+ActivityGroup切换activity,activity里用viewpager+fragment,效果还行。Fragment还是不能很好替换TabActivity和ActivityGroup。
Fragment与FragmentActivity的关系
1、fragmentactivity 继承自activity,用来解决android3.0 之前没有fragment的api,所以在使用的时候需要导入support包,同时继承fragmentActivity,这样在activity中就能嵌入fragment来实现你想要的布局效果。
2、当然3.0之后你就可以直接继承自Activity,并且在其中嵌入使用fragment了。
3、获得Manager的方式也不同
3.0以下:getSupportFragmentManager()
3.0以上:getFragmentManager()
2015/04/09 星期四
计划:
- 查找与应用页面样式设计类似的图标;
- 设计页面Activity名及参数,相互之间的逻辑;
完成:
- 暂时决定直接采用微信的图标,回去再找图修图;
- 按照网友的方式重写了底部菜单栏,并且重新设计了文件名及文件结构;
- 代码中的manager.findFragmentByTag("TAG1");还没搞懂,并且根据打印的log显示,每个fragment只生成了一次而不是每次点击都生成一次,这里也不是很理解。
思考:
之所以fragment只生成一次,是因为这段代码:
if (DeviceFragment == null) {
DeviceFragment = new DeviceFragment();
transaction.add(R.id.fragment, DeviceFragment,"TAG1");
} else {
transaction.show(DeviceFragment);
}
这里有判断,如果已经添加,则直接显示,否则新建并添加进transaction。
那么transaction是什么?
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.add(R.id.fragment, DeviceFragment,"TAG1");
要理解transaction,还是要查找FragmentManager的知识。
2015/04/10 星期五
计划:
- 进入应用时,如何默认选中设备标签的?
- 载入’设备’顶部导航栏时将ActionBar遮盖的问题;
- manager.findFragmentByTag("TAG1");的用处;
- 查找FragmentManager的相关知识,理解transaction的用处;
- 继续整合顶部导航栏;
完成:
- 之所以进入应用时默认选中’设备’标签,是因为’设备’标签是switch语句的第一项,如果将case 0 和case 1 交换(数字交换或者内容交换),则显示’场景’标签,可见,这是switch语句默认的设置。
- 在’设备’页面布局文件fragment_device.xml中添加android:paddingTop=”48dp” 就可以将ActionBar显示出来了。
- 如果不加上”TAG1”参数,会出现以下问题:应用长时间后台时,系统会销毁DeviceFragment引用,而当再次启动应用时,DeviceFragment的实例在内存中还在,但是它的引用已经被销毁了,此时切换tab时将无法隐藏DeviceFragment。
解决办法为:在add的时候,加上一个tab参数
transaction.add(R.id.content, DeviceFragment,”Tab1″);
然后当DeviceFragment引用被回收置空的话,先通过
DeviceFragment=FragmentManager.findFragmentByTag(“Tab1″);
找到对应的引用,然后继续上面的hide,show;
4. 使用Fragment时,可以通过用户交互来执行一些动作,比如增加、移除、替换等。所有这些改变构成一个集合,这个集合被叫做一个transaction。
可以调用FragmentTransaction中的方法来处理这个transaction,并且可以将transaction存进由activity管理的back stack中,这样用户就可以进行fragment变化的回退操作。
可以这样得到FragmentTransaction类的实例:
FragmentManager manager = getFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
每个transaction是一组同时执行的变化的集合。用add(), remove(), replace()方法,把所有需要的变化加进去,然后调用commit()方法,将这些变化应用。在commit()方法之前,可以调用addToBackStack(),把这个transaction加入back stack中去,这个back stack是由activity管理的,当用户按返回键时,就会回到上一个fragment的状态。
5. 将顶部导航栏整合到了应用中,调整了导航栏的点击事件范围,即TextView的布局,主要是以下几种改变:
android:layout_width="match_parent"
android:gravity="center"
android:textSize="18sp"
让textView里面的内容水平居中 : android:gravity="center_horizontal"
让textView控件在它的父布局里水平居中
android:layout_gravity="center_horizontal"
2015/04/13 星期一
计划:
- 继续整合照明的列表,研究从数据库读取开关状态并显示;
- 开发电器,窗帘,设置页面。
完成:
- 完成照明列表的整合,但是上下滑动时开关状态仍然会自己改变,问题并没有解决;
- 完成电器、窗帘、设置页面的开发,使用的是相同的BaseAdapter和布局文件。
2015/04/14 星期二
计划:
- 研究解决上下滑动照明list开关自己改变的问题;
- 开发“环境”和“场景”页面
完成:
- 解决上下滑动照明list时,开关自己改变的问题,解决方案是昨天周路学长跟我说的:先读取数据库,将数据库中的开关状态存进一个数组中,然后生成list的Item时由数组中的数据决定开关状态。
- “ 环境”和”场景”页面开发出来了,不过点击生成页面时程序会崩溃,原因初步认定为数据库的使用有漏洞,如打开之后没有关闭,cursor的使用不规范,不理解等,明天需要查找这方面的资料,学习一下。
2015/04/15 星期三
计划:
- 继续解决“环境”和“场景”页面崩溃的问题;
- 记录应用的结构,设计详细页面
完成:
- 解决了“环境”和“场景”页面崩溃的问题,原因在于读取数组数据时没有考虑数组为空的情况,当为空时,读取失败,程序崩溃。根据这种情况,修改由此漏洞的相关代码;
参考资料:
判断ArrayList数组是否为空:
List list =new ArrayList();
list.isEmpty(); //这个是判断list里面是否有值。
return true; //为空;
return false; //不为空;
-----------------------
如果用 if(null == list),则即使list里面没有值也判断他不为空,因为已经为list对象new ArrayList了。
1、判断ArrayList是否有值:
if (!arrayList.isEmpty()){
// do something
}
2、ArrayList 的add(E e)方法,可以传入null的值吗?
add(E e)源码:
public boolean add(E e) {
ensureCapacity(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
答案是肯定的,可以传入null。但在实际应用中,这么做没有什么意义。所以,在调用add方法前,最好还是判断一下传入的值是否为空。
3、ArrayList的get(int index)方法,会返回null吗?
get(int index)源码:
public E get(int index) {
RangeCheck(index);
return (E) elementData[index];
}
如果之前add的时候添加了null进去,那么这里就会有可能返回null。如果确定不了ArrayList中是否有null值,最好增加一个是否为空的判断,避免空指针异常。
4、ArrayList的remove(Object o)方法,出入null时,会空指针异常吗?
remove()源码:
public boolean remove(Object o) {
if (o == null) {
for (int index = 0; index < size; index++)
if (elementData[index] == null) {
fastRemove(index);
return true;
}
} else {
for (int index = 0; index < size; index++)
if (o.equals(elementData[index])) {
fastRemove(index);
return true;
}
}
return false;
}
如果我们之前调用add方法时,传入过null值,那么这里就会移除掉它。即不会空指针异常。
5、ArrayList的remove(Object o)方法移除未添加的值,会报异常吗?
如果我们想要移除的值之前没有add过,也只是返回false,并不会报什么异常。原因就在上面那段代码里。
而在实际代码中,有些人在调用remove方法时,会这么写:
if(mList.contain(object)){
mList.remove(object);
}
所以,这么看来,remove方法前再调用contain,就没什么意义了。我们可以通过判断其返回值,来获得其是否有这个值,也就是是否删除成功。
6、ArrayList可以重复添加相同的值吗?
相同的对象是可以重复添加进去的。原因可以从上面add方法了解到。
补充:可以添加多个相同对象,但remove的时候,不会一次全部都删掉,而是按添加顺序删除。调一次,删除一个!这一点,初学java的同学要特别注意!
7、ArrayList中的Object[ ] toArray()与<T> T[ ] toArray(T[ ] a)方法
在实际应用场景中,会需要将ArrayList转换成数组的形式。我见过有些人会用for循环的方法,一个个将ArrayList取出来,再赋值给数组的。没那么麻烦,用toArray这个方法即可。但ArrayList会有两个同名方法,该用哪一个呢?还是先看源码吧:
public Object[] toArray() {
return Arrays.copyOf(elementData, size);
}
public <T> T[] toArray(T[] a) {
if (a.length < size)
// Make a new array of a's runtime type, but my contents:
return (T[]) Arrays.copyOf(elementData, size, a.getClass());
System.arraycopy(elementData, 0, a, 0, size);
if (a.length > size)
a[size] = null;
return a;
}
直接调用toArray()这个方法,会直接返回一个数组,源码是返回Object类型的。所以,你需要自己手动泛型一下。
说起这个泛型,还真得唠叨一句,不知道有多少人会这么写:
ArrayList<String> mList = new ArrayList<String>();
......
String[] s = (String[]) mList.toArray();
如果有哪位同学这么写运行不报错的话,给我留个言。
继续。下面那个toArray(T[] a),就显得稍微复杂了一些。如果T[]的大小比ArrayList要小的话,则只会返回与T[]大小相等的数组。
注意,如果传入的数组与ArrayList的大小不相等,则会将ArrayList的size那位赋值为null。
这里给个最简单的测试例子:
ArrayList<String> mList = new ArrayList<String>();
mList.add("a");
mList.add("b");
String[] s = new String[4];
s[2] = "c";
s[3] = "d";
for (String string: s) {
System.out.println(string);
}
s = mList.toArray(s);
for (String string : s) {
System.out.println(string);
}
第一个for循环输出内容为:
null
null
c
d
因为我没有对String数组第一个和第二个赋值,所以自然为输出内容为null。
第二个for循环输出内容为:
a
b
null
d
可以看到,String数组的第三个值被赋值为null。
所以,在使用toArray(T[] a)要特别留心这个问题。当然,如果对第一个toArray()使用觉得麻烦的话,可以创建一个与ArrayList大小一样的数组,调用toArray(T[] a)传参进去,就可以直接得到了:
ArrayList<String> mList = new ArrayList<String>();
......
String[] s = new String[mList.size()];
s = mList.toArray(s);
2015/04/16 星期四
计划:
- 查找冰箱、空调、电视、智能插座等的设计页面;
- 学习数据库相关知识,设计灯具、电器、窗帘、场景等的数据库;
- 开发窗帘页面
完成:
- 查找了网上空调、电视相关的智能APP的设计;
- 修改环境页面,使item失去焦点;
参考资料:
下载智能家居App:海尔智能空调、海尔家电宝、海尔空气盒子、GKB全宅手机控、美的空调、三星电视、LG TV、奥克斯、海信智能遥控器等
2015/04/17 星期五
计划:
- 查找自定义Dialog相关知识,开发窗帘控制页面;
- 学习View的生成,销毁等知识。
完成:
- 尝试了三种弹出Dialog的方法,前两种是直接在CurtainFragment类里面定义和生成对话框的结构样式,这种方式结构很简单,但是考虑到之后还要操作数据库,代码会变得很臃肿,因此最终采用单独写一个CurtainDialog类的方式,将数据库中的窗帘名字存入数组,作为参数传递给CurtainDialog类,这样多个窗帘可以使用同一个弹出对话框。
- 之前所写的代码中,每一个Fragment显示的View都是新建的,这样在来回切换Fragment标签时,会生成很多个View对象实例,而这些实例会占用内存等,造成资源的浪费,因此根据周路学长的建议,进行修改:显示View时先进行判断,如果是第一次打开该Fragment页面,View为空,则新建View;如果之前打开过该页面,则不再新建View而使用之前建立的。
if (view == null) {
view = inflater.inflate(R.layout.device_curtain_fragment,container,false);
}
但是要注意:必须在onStop ()或onDestroy ()函数中调用removeView(),否则当第二次切换回该页面时会报错,java.lang.IllegalStateException The specified child already has a parent. You must call removeView(),原因为一个View只能有一个父控件。当第二次添加时,又要改变这个控件的父控件(虽然是同一个父控件,但是也要通过改变该View的父控件来实现)。运行时不允许改变一个(有父控件的)子控件的父控件。
2015/04/20 星期一
计划:
- 之前curtain页面中显示的窗帘名称的是通过数组导入的,现在需要改造成从数据库中读取并显示;
- 照明、电器和窗帘点击时反应不灵敏,尝试修改;
- 设计空调、冰箱和电视的控制页面;
- 查找智能插座的应用,作为参考;
- 查找log和System.out.println();的区别,看看是否需要将所有的System.out替换掉;
- 应用中多个页面的Item name、state和开关等都是直接连接数据库进行显示和修改的,探究这种方式是否合理,若不合理,应当怎样设计替换解决方案;
完成:
- 改造Curtain页面,从数据库读取数据并显示,点击Item时弹出Dialog页面,并将on/off/stop开关动作连接到数据库,完成窗帘页面的开发;
- 扩大顶部导航栏点击响应的触发范围、开关图标大小和触发范围等;
- 完成空调和电视控制页面的设计,冰箱的暂时还没有找到参考;
- 解决程序后台一段时间后listView的Item消失的问题,解决办法为将removeView()方法移动到destroyView()中.
2015/04/21 星期二
计划:
- 任务书填写到第八周;
- 查找log和System.out.println();的区别,看看是否需要将所有的System.out替换掉;
- 开发电视和空调页面;
- 应用中多个页面的Item name、state和开关等都是直接连接数据库进行显示和修改的,探究这种方式是否合理,若不合理,应当怎样设计替换解决方案;
完成:
- 查找System.out和log的相关知识,改造System.out.为log;
- 修改CurtainDialog页面;
- 开发电视页面。
参考资料:
android.util.Log常用的方法有以下5个:Log.v() Log.d() Log.i() Log.w() 以及 Log.e() 。根据首字母对应VERBOSE,DEBUG,INFO, WARN,ERROR。
1、Log.v 的调试颜色为黑色的,任何消息都会输出,这里的v代表verbose啰嗦的意思,平时使用就是Log.v("","");
2、Log.d的输出颜色是蓝色的,仅输出debug调试的意思,但他会输出上层的信息,过滤起来可以通过DDMS的Logcat标签来选择.
3、Log.i的输出为绿色,一般提示性的消息information,它不会输出Log.v和Log.d的信息,但会显示i、w和e的信息
4、Log.w的意思为橙色,可以看作为warning警告,一般需要我们注意优化Android代码,同时选择它后还会输出Log.e的信息。
5、Log.e为红色,可以想到error错误,这里仅显示红色的错误信息,这些错误就需要我们认真的分析,查看栈的信息了。
2015/04/22 星期三
计划:
- 任务书填写到第八周;
- 开发空调页面;
- 应用中多个页面的Item name、state和开关等都是直接连接数据库进行显示和修改的,探究这种方式是否合理,若不合理,应当怎样设计替换解决方案;
- 总结android:scaleType 和Vibrator vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);
完成:
- 完善电视页面:点击效果,震动;
- 修改窗帘图片,添加震动效果;
- 初步完成空调页面的开发;
- 完成任务书的填写;
任务书:
- 讨论毕业设计研究方向,确定并理解题目,参加毕设动员
- 选定毕业设计外文文献翻译文章,开始文献翻译
- 完成文献翻译,并根据指导老师意见修改;学习Java编程基础。
- 理解智能家庭系统移动客户端的具体需求,调查市场上同类型应用的功能, 学习Android控件的使用。
- 完成智能家庭系统移动客户端总体设计,开始客户端应用程序的开发。
- 学习Android ViewPage组件的使用,完成底部菜单栏和顶部标签栏的开发。
- 熟悉ListView、SQLite和BaseAdapter的使用,完成客户端主界面的开发。
- 开始进行照明、窗帘和部分电器的二级页面具体功能的开发
2015/04/23 星期四
计划:
- 继续进行空调页面开发,包括优化前台页面、建立和访问数据库等后台操作;
- 应用中多个页面的Item name、state和开关等都是直接连接数据库进行显示和修改的,探究这种方式是否合理,若不合理,应当怎样设计替换解决方案;
- 总结android:scaleType 和Vibrator vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);
完成:
- 完成空调页面前台设计;
- 部分完成后台建立和访问数据库等操作;
- 空调页面访问数据库的过程中,在onCreate()中将数据库的数据存至数组ArrayList<String> attentionArr中,页面上点击按钮时改变数组中的数据,在onStop()中将数组中的数据写入数据库。
2015/04/24 星期五
计划:
- 继续进行空调页面后台操作的开发;
- 开发插座页面;
- 整理这几周的资料,以备中期检查。
完成:
- 完成空调页面的开发;
- 完成插座页面的开发;
- 总结android:scaleType 和Vibrator vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);
参考资料:
在Android开发中,大部分控件都有visibility这个属性,其属性有3个分别为“visible ”、“invisible”、“gone”。主要用来设置控制控件的显示和隐藏。有些人可能会疑惑Invisible和gone是有什么区别的???
其在XML文件和Java代码中设置如下:
可见(visible)
XML文件:android:visibility="visible"
Java代码:view.setVisibility(View.VISIBLE);
不可见(invisible)
XML文件:android:visibility="invisible"
Java代码:view.setVisibility(View.INVISIBLE);
隐藏(GONE)
XML文件:android:visibility="gone"
Java代码:view.setVisibility(View.GONE);
VISIBLE:设置控件可见
INVISIBLE:设置控件不可见
GONE:设置控件隐藏
而INVISIBLE和GONE的主要区别是:当控件visibility属性为INVISIBLE时,界面保留了view控件所占有的空间;而控件属性为GONE时,界面则不保留view控件所占有的空间。
2015/04/27 星期一
计划:
- 理解android横屏竖屏切换时的内部过程,修改应用横屏竖屏设置,强制为竖屏显示;
- 修改电器页面;
- 开发机顶盒页面。
完成:
- 强制应用竖屏显示;
- 修改电器页面,删除冰箱选项,添加空调、电视和插座图标;
- 解决程序中多处”close() was never explicitly called on database ‘/data/data…/SQLite.db’”错误,即打开数据库之后没有关闭的问题。
- 完成机顶盒页面的基本布局设置。
参考资料:
http://store.baidu.com/product/view/2737.html#2737001
欧瑞博(ORVIBO) allone wifi智能遥控器深度体验
Android禁止横竖屏切换或禁止横竖屏切换时重启Activity
2015/04/28 星期二
计划:
- 继续开发机顶盒页面;
- 调整图标及其位置等,优化整体设计;
- 截图做PPT;
- 查找文献综述资料;
完成:
- 完成机顶盒页面的整体开发;
- 完成整体设计的调整;
- 整理目前所开发应用的文件结构、数据库结构和应用截图等资料;
参考资料:
2015/04/29 星期三
计划:
- 设计开发场景模块
- 完成中期检查PPT
完成:
- 点击场景的一个Item时包含以下操作:读取该场景的数据表à根据表格中的include_table和include_id的值分别去对应数据表取状态à将状态存进数组à将数组作为参数传递给显示页面à显示页面显示列表;
- 初步完成场景页面的设计,但是因为要重新设计数据库,所以没有进一步往下做,待数据库设计完成之后再继续开发;
- 遇到问题:从场景详细页面点击返回按钮时,返回设备页面,而不是场景页面,原因在于sceneFragment经过onPause()和onStop()之后再生成时调用onStart()和onResume(),而onResume()函数中设定了setTabSelect(0),即默认为设备页面。
随着信息化技术的逐步发展、网络技术的日益完善,家庭控制系统的智能化逐渐成为可能。通过将微处理器、传感器技术和网络通信技术引入家电设备,我们能够实现家电设备的自动控制及远程控制。