201504进度

2015/04/01         星期三

计划:

  1. 改变List的存储结构(数据库或者其他),读取方式。
  2. 添加编辑功能(增删改)。
  3. 按钮/开关的状态信息保存。
  4. 全开全关按钮的边界。

完成:

  1. 之所以页面在上下滑动时开关的状态会自己改变,是因为在生成页面,显示开关状态时,没有按照各个开关在数据库中的位置来显示其状态,而只是在生成某一行是读取当前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查询数据库时有用

参考资料:

ListView 点击一个item另外几个Item响应

BaseAdapter——convertView回收机制与动态控件响应

在Activity中响应ListView内部按钮的点击事件

android用户界面之ListView教程实例汇总

为ListView每个Item上面的按钮添加事件

SlideExpandableListView-master

Android ListViewAdapter() 继承BaseAdapter实现一个列表功能:

在处理ListView的条目点击事件的时候,ListView的父类AdapterView会有一个方法getItemAtPosition 这个方法会调用Adapter中的getItem(int postion)方法

开启这个状态开关需要写在OnItemClickListener(), 再里面通过getAdapter获取BaseAdapter实例,然后通过其中的notifyDataSetInvalidated()刷新数据就好了。

2015/04/02         星期四

计划:

  1. 解决页面上下滑动时Item的状态自动改变问题和Item的联动问题。
  2. 解决页面点击某个开关,其他开关动作的问题。
  3. 添加编辑功能(增删改)。
  4. 按钮/开关的状态信息保存。
  5. 全开全关按钮的边界。

完成:

  1. 之所以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加入其中 
  2. 之所以点击页面上某个开关,其他开关动作,是因为此时监听点击事件的函数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         星期五

计划:

  1. 打开应用时,从数据库读取各个开关的状态并显示,即设定信息的保存;
  2. MyAdapter  ( extends BaseAdapter ) 分离出去,降低耦合;
  3. 添加编辑功能(增删改);
  4. 按钮/开关的状态信息保存;
  5. 全开全关按钮的边界。

完成:

  1. 尝试将BaseAdapter类分离出去,但是由于点击事件的记录数组,响应时需要数组判断,数据库处理函数,修改图片等操作的错综复杂,没有成功。
  2. 继续研究从数据库读取数据时总是出错的问题,若在最开始遍历时,读取判断on/off并存至数组,再在数组中确定开关图片,这种方式能将更改后的数据保存至数据库,但是当上下滑动时,开关图片仍恢复为应用最开始的图片,虽然数据库中的开关状态已经改变。还没有找到解决办法。

参考资料:

从源代码的角度分析--在BaseAdapter调用notifyDataSetChanged()之后发生了什么

2015/04/07         星期二

计划:

  1. 重新设计样式,按照新样式进行开发;
  2. 学习顶部导航栏控件及其滑动操作。

完成:

  1. 与公司前辈讨论确定了毕业设计的样式,包括页面和功能;
  2. 查找了顶部导航栏的资料,学习了滑动操作。不过这里继承的是FragmentActivity类,而如果想集成进之前做的底部菜单栏中(继承的是Fragment类),需要调整和改进,还需要继续研究。

参考资料:

ListView的性能优化之convertView和viewHolder

利用convertView优化ListView性能

主要介绍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         星期三

计划:

  1. 实现底部工具栏和顶部导航栏结合

完成:

  1. 完成底部工具栏和顶部导航栏的结合,不过底部工具栏再切换的时候程序会崩溃,目前还没找到原因,准备按照网上的代码重新写。

参考资料:

微信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         星期四

计划:

  1. 查找与应用页面样式设计类似的图标;
  2. 设计页面Activity名及参数,相互之间的逻辑;

完成:

  1. 暂时决定直接采用微信的图标,回去再找图修图;
  2. 按照网友的方式重写了底部菜单栏,并且重新设计了文件名及文件结构;
  3. 代码中的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         星期五

计划:

  1. 进入应用时,如何默认选中设备标签的?
  2. 载入’设备’顶部导航栏时将ActionBar遮盖的问题;
  3. manager.findFragmentByTag("TAG1");的用处;
  4. 查找FragmentManager的相关知识,理解transaction的用处;
  5. 继续整合顶部导航栏;

完成:

  1. 之所以进入应用时默认选中’设备’标签,是因为’设备’标签是switch语句的第一项,如果将case 0 和case 1 交换(数字交换或者内容交换),则显示’场景’标签,可见,这是switch语句默认的设置。
  2. 在’设备’页面布局文件fragment_device.xml中添加android:paddingTop=”48dp” 就可以将ActionBar显示出来了。
  3. 如果不加上”TAG1”参数,会出现以下问题:应用长时间后台时,系统会销毁DeviceFragment引用,而当再次启动应用时,DeviceFragment的实例在内存中还在,但是它的引用已经被销毁了,此时切换tab时将无法隐藏DeviceFragment。

解决办法为:在add的时候,加上一个tab参数

transaction.add(R.id.content, DeviceFragment,”Tab1″);

然后当DeviceFragment引用被回收置空的话,先通过

DeviceFragment=FragmentManager.findFragmentByTag(“Tab1″);

找到对应的引用,然后继续上面的hide,show;

从Fragment被销毁看replace和add的区别

  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         星期一

计划:

  1. 继续整合照明的列表,研究从数据库读取开关状态并显示;
  2. 开发电器,窗帘,设置页面。

完成:

  1. 完成照明列表的整合,但是上下滑动时开关状态仍然会自己改变,问题并没有解决;
  2. 完成电器、窗帘、设置页面的开发,使用的是相同的BaseAdapter和布局文件。

2015/04/14         星期二

计划:

  1. 研究解决上下滑动照明list开关自己改变的问题;
  2. 开发“环境”和“场景”页面

完成:

  1. 解决上下滑动照明list时,开关自己改变的问题,解决方案是昨天周路学长跟我说的:先读取数据库,将数据库中的开关状态存进一个数组中,然后生成list的Item时由数组中的数据决定开关状态。
  2. “ 环境”和”场景”页面开发出来了,不过点击生成页面时程序会崩溃,原因初步认定为数据库的使用有漏洞,如打开之后没有关闭,cursor的使用不规范,不理解等,明天需要查找这方面的资料,学习一下。

2015/04/15         星期三

计划:

  1. 继续解决“环境”和“场景”页面崩溃的问题;
  2. 记录应用的结构,设计详细页面

完成:

  1. 解决了“环境”和“场景”页面崩溃的问题,原因在于读取数组数据时没有考虑数组为空的情况,当为空时,读取失败,程序崩溃。根据这种情况,修改由此漏洞的相关代码;
  2.  

参考资料:

判断ArrayList数组是否为空:

List list =new ArrayList();
list.isEmpty();          //这个是判断list里面是否有值。


return true; //为空;
return false; //不为空;
-----------------------
如果用 if(null == list),则即使list里面没有值也判断他不为空,因为已经为list对象new ArrayList了。

Android编程之ArrayList源码详解及使用

1、判断ArrayList是否有值:

if (!arrayList.isEmpty()){

    // do something

}

2ArrayList add(E e)方法,可以传入null的值吗?

add(E e)源码:

public boolean add(E e) {

        ensureCapacity(size + 1);  // Increments modCount!!

        elementData[size++] = e;

        return true;

    }

答案是肯定的,可以传入null。但在实际应用中,这么做没有什么意义。所以,在调用add方法前,最好还是判断一下传入的值是否为空

3ArrayListget(int index)方法,会返回null吗?

get(int index)源码:

public E get(int index) {

        RangeCheck(index);

        return (E) elementData[index];

    }

如果之前add的时候添加了null进去,那么这里就会有可能返回null。如果确定不了ArrayList中是否有null值,最好增加一个是否为空判断,避免空指针异常。

4ArrayListremove(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值,那么这里就会移除掉它。即不会空指针异常。

5ArrayListremove(Object o)方法移除未添加的值,会报异常吗?

如果我们想要移除的值之前没有add过,也只是返回false,并不会报什么异常。原因就在上面那段代码里。

而在实际代码中,有些人在调用remove方法时,会这么写:

if(mList.contain(object)){

    mList.remove(object);

}

所以,这么看来,remove方法前再调用contain,就没什么意义了。我们可以通过判断其返回值,来获得其是否有这个值,也就是是否删除成功。

6ArrayList可以重复添加相同的值吗?

相同的对象是可以重复添加进去的。原因可以从上面add方法了解到。

补充:可以添加多个相同对象,但remove的时候,不会一次全部都删掉,而是按添加顺序删除。调一次,删除一个!这一点,初学java的同学要特别注意!

7ArrayList中的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         星期四

计划:

  1. 查找冰箱、空调、电视、智能插座等的设计页面;
  2. 学习数据库相关知识,设计灯具、电器、窗帘、场景等的数据库;
  3. 开发窗帘页面

完成:

  1. 查找了网上空调、电视相关的智能APP的设计;
  2. 修改环境页面,使item失去焦点;

参考资料:

原创作品:智能冰箱系统界面设计

 

下载智能家居App:海尔智能空调、海尔家电宝、海尔空气盒子、GKB全宅手机控、美的空调、三星电视、LG TV、奥克斯、海信智能遥控器等

2014CITE:海尔天樽让空调变身“高智商”

2015/04/17         星期五

计划:

  1. 查找自定义Dialog相关知识,开发窗帘控制页面;
  2. 学习View的生成,销毁等知识。

完成:

  1. 尝试了三种弹出Dialog的方法,前两种是直接在CurtainFragment类里面定义和生成对话框的结构样式,这种方式结构很简单,但是考虑到之后还要操作数据库,代码会变得很臃肿,因此最终采用单独写一个CurtainDialog类的方式,将数据库中的窗帘名字存入数组,作为参数传递给CurtainDialog类,这样多个窗帘可以使用同一个弹出对话框。
  2. 之前所写的代码中,每一个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         星期一

计划:

  1. 之前curtain页面中显示的窗帘名称的是通过数组导入的,现在需要改造成从数据库中读取并显示;
  2. 照明、电器和窗帘点击时反应不灵敏,尝试修改;
  3. 设计空调、冰箱和电视的控制页面;
  4. 查找智能插座的应用,作为参考;
  5. 查找log和System.out.println();的区别,看看是否需要将所有的System.out替换掉;
  6. 应用中多个页面的Item name、state和开关等都是直接连接数据库进行显示和修改的,探究这种方式是否合理,若不合理,应当怎样设计替换解决方案;

完成:

  1. 改造Curtain页面,从数据库读取数据并显示,点击Item时弹出Dialog页面,并将on/off/stop开关动作连接到数据库,完成窗帘页面的开发;
  2. 扩大顶部导航栏点击响应的触发范围、开关图标大小和触发范围等;
  3. 完成空调和电视控制页面的设计,冰箱的暂时还没有找到参考;
  4. 解决程序后台一段时间后listView的Item消失的问题,解决办法为将removeView()方法移动到destroyView()中.

2015/04/21         星期二

计划:

  1. 任务书填写到第八周;
  2. 查找log和System.out.println();的区别,看看是否需要将所有的System.out替换掉;
  3. 开发电视和空调页面;
  4. 应用中多个页面的Item name、state和开关等都是直接连接数据库进行显示和修改的,探究这种方式是否合理,若不合理,应当怎样设计替换解决方案;

完成:

  1. 查找System.out和log的相关知识,改造System.out.为log;
  2. 修改CurtainDialog页面;
  3. 开发电视页面。

参考资料:

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         星期三

计划:

  1. 任务书填写到第八周;
  2. 开发空调页面;
  3. 应用中多个页面的Item name、state和开关等都是直接连接数据库进行显示和修改的,探究这种方式是否合理,若不合理,应当怎样设计替换解决方案;
  4. 总结android:scaleType 和Vibrator vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE); 

完成:

  1. 完善电视页面:点击效果,震动;
  2. 修改窗帘图片,添加震动效果;
  3. 初步完成空调页面的开发;
  4. 完成任务书的填写;

任务书:

  1. 讨论毕业设计研究方向,确定并理解题目,参加毕设动员
  2. 选定毕业设计外文文献翻译文章,开始文献翻译
  3. 完成文献翻译,并根据指导老师意见修改;学习Java编程基础。
  4. 理解智能家庭系统移动客户端的具体需求,调查市场上同类型应用的功能, 学习Android控件的使用。
  5. 完成智能家庭系统移动客户端总体设计,开始客户端应用程序的开发。
  6. 学习Android ViewPage组件的使用,完成底部菜单栏和顶部标签栏的开发。
  7. 熟悉ListView、SQLite和BaseAdapter的使用,完成客户端主界面的开发。
  8. 开始进行照明、窗帘和部分电器的二级页面具体功能的开发

2015/04/23         星期四

计划:

  1. 继续进行空调页面开发,包括优化前台页面、建立和访问数据库等后台操作;
  2. 应用中多个页面的Item name、state和开关等都是直接连接数据库进行显示和修改的,探究这种方式是否合理,若不合理,应当怎样设计替换解决方案;
  3. 总结android:scaleType 和Vibrator vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE); 

完成:

  1. 完成空调页面前台设计;
  2. 部分完成后台建立和访问数据库等操作;
  3. 空调页面访问数据库的过程中,在onCreate()中将数据库的数据存至数组ArrayList<String>  attentionArr中,页面上点击按钮时改变数组中的数据,在onStop()中将数组中的数据写入数据库。

2015/04/24         星期五

计划:

  1. 继续进行空调页面后台操作的开发;
  2. 开发插座页面;
  3. 整理这几周的资料,以备中期检查。

完成:

  1. 完成空调页面的开发;
  2. 完成插座页面的开发;
  3. 总结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         星期一

计划:

  1. 理解android横屏竖屏切换时的内部过程,修改应用横屏竖屏设置,强制为竖屏显示;
  2. 修改电器页面;
  3. 开发机顶盒页面。

完成:

  1. 强制应用竖屏显示;
  2. 修改电器页面,删除冰箱选项,添加空调、电视和插座图标;
  3. 解决程序中多处”close() was never explicitly called on database ‘/data/data…/SQLite.db’”错误,即打开数据库之后没有关闭的问题。
  4. 完成机顶盒页面的基本布局设置。

参考资料:

http://store.baidu.com/product/view/2737.html#2737001

欧瑞博(ORVIBO) allone wifi智能遥控器深度体验

Android中横竖屏切换时Activity的生命周期

Android禁止横竖屏切换或禁止横竖屏切换时重启Activity

2015/04/28         星期二

计划:

  1. 继续开发机顶盒页面;
  2. 调整图标及其位置等,优化整体设计;
  3. 截图做PPT;
  4. 查找文献综述资料;

完成:

  1. 完成机顶盒页面的整体开发;
  2. 完成整体设计的调整;
  3. 整理目前所开发应用的文件结构、数据库结构和应用截图等资料;

参考资料:

android 手机红外遥控器实现

手机遥控器,3.5mm耳机接口红外遥控改造解析

我也DIY一个Android遥控器-全部开源

Android中播放声音的两种方法

2015/04/29         星期三

计划:

  1. 设计开发场景模块
  2. 完成中期检查PPT

完成:

  1. 点击场景的一个Item时包含以下操作:读取该场景的数据表à根据表格中的include_table和include_id的值分别去对应数据表取状态à将状态存进数组à将数组作为参数传递给显示页面à显示页面显示列表;
  2. 初步完成场景页面的设计,但是因为要重新设计数据库,所以没有进一步往下做,待数据库设计完成之后再继续开发;
  3. 遇到问题:从场景详细页面点击返回按钮时,返回设备页面,而不是场景页面,原因在于sceneFragment经过onPause()和onStop()之后再生成时调用onStart()和onResume(),而onResume()函数中设定了setTabSelect(0),即默认为设备页面。

随着信息化技术的逐步发展、网络技术的日益完善,家庭控制系统的智能化逐渐成为可能。通过将微处理器、传感器技术和网络通信技术引入家电设备,我们能够实现家电设备的自动控制及远程控制。

原文地址:https://www.cnblogs.com/fansen/p/4384303.html