zoukankan      html  css  js  c++  java
  • 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),即默认为设备页面。

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

  • 相关阅读:
    ICONS-图标库
    图形资源
    vue项目中,如果修改了组件名称,vscode编辑器会在引入修改组件的名字处提示红色波浪线 The file is in the program because:Imported via xxx Root file specified for compilation .
    接口在dev环境报跨域问题(has been blocked by CORS policy:Response to preflight request doesn't pass access control check:No 'Access-Control-Allow-Origin' header ispresent on the requested resource.),qa环境正常
    阿里云occ的图片文件URL用浏览器直接打开无法访问,提示This XML file does noe appear to have any style information associated with it. The document tree is shown below.
    vue 项目使用element ui 中tree组件 check-strictly 用法(父子不互相关联的反显情况)
    高德地图进行线路规划绘制标记点操作(vue)
    vue中实现拖拽调整顺序功能
    2021-01-22 浏览器相关知识
    2021-01-22 js 相关知识点
  • 原文地址:https://www.cnblogs.com/fansen/p/4384303.html
Copyright © 2011-2022 走看看