项目规划
阶段一:分析需求,提出显示需求,隐式需求
阶段二:
搭建程序主题框架,界面拆分为三部分,头部,中部,尾部
ID规则:前缀为类型缩写
主体部分:
1.布局为相对布局
TOP部分:
1.使用ACTIONBAR,图标 ,名称,常用功能,浮动菜单
2.使用布局文件,相对布局,文本框控件显示名称(定义的string文件资源),在布局的左侧,设置一个整体的背景,给文本控件制定一个字体颜色(color文件),设置文本控件在垂直中心,并与左边peddingleft=“10dp”
4.制定头部布局文件的高度,37dp为推荐
3.在主体布局中包含刚刚定义的头部布局文件
Bottom部分:
1.相对布局,高度68dp
2.相对布局,高度68dp(嵌套),设置背景,放入图片控件,指定资源,放置文本控件,设定文本资源,放入图片控件,设定资源,设定三个控件在布局内部的位置,左中右,分别设置每个控件都为垂直居中,设置边距,4dp,文字颜色为白色。
3.在主布局中包含底部布局
(include标签的ID会覆盖内部的ID)
中央布局:
为线性布局,宽高填充父布局,设置位置属性,在头下,尾上
阶段三:
1.建立ActivityBase类,封装openactivity,showmsg,showalertdialog,分别用于打开,显示信息,显示警告
内部变量名之前加下划线_,参数之前加p.
2.用ActivityFrame方法封装ActivityBase,来定义窗口风格(有无标题栏等),加载布局,封装APPENDMAINBODY方法,获取到中央布局,用INFLATE方法获取VIEW,获取一个布局参数对象,设置为双向填父布局,将此VIEW压入中央布局(addview方法)
3.创建相对布局,内嵌GRIDVIEW,双向适应内容,通过numcOLUM制定为三列,layout_centerinparent,控件之间间距50DP(verticalspacing)
4.建立图标-名字布局,线性(一个图片,一个TEXTVIEW),自提颜色为黑色,垂直分布
5.建立Adapter封装类,建立holder子类,内设Imageview 和TextView的变量。在adapter类中定义两个数组,图片资源ID数组,文字资源数组(context.getstring(id)) 来自构造函数的参数
在GETITEM中返回字符串资源,在GETVIEW中,用INFLATER压入4步骤布局,获取资源实例,赋予新建HOLDER实例的属性4中的两个属性,给新的VIEW设置TAG(settag)把Holder对象放入,下次可以直接获取,不用重复获取VIEW和初始化HOLDER(提高效率)。
完成后,给HOLDER的两个属性添加SETIMAGERESOURCE和SETTEXT,加入具体的值。
6.在主Activity中继承ActivityFrame,设置gridview变量,使用appendview方法通过ID动态压入布局(步骤3所定义的) ,定义变量初始化函数,View初始化函数,listener初始化函数,数据绑定函数
7.在Adapter的HOST中,先定义LAYOUT参数,高,宽,50,50,将其设置到HOST的IMAGEVIEW中,设置缩放(scaletype,XY)
新建SELECTER,通过设置android:state_selected,android:state_focused,pressed 来判断选择,点击等的主题(item)
在GRIDVIEW中设置上LISTSELECTOR为该次定义的
设置内部图片-文字布局中文字控件上下margin均为5dp
---------------------------------------------------------------------------------
阶段四:封装滑动菜单
封装在ActivityFrame中,在底部布局加入一个线性布局,内部增加一个LISTVIEW
定义全局的STYLE文件,加入DIVIDER和CACHECOLORHINT元素,双fill_parent
将此样式赋予LISTVIEW
新建控件包
封装菜单项对象类,SliderMenuItem,封装ID和TITLE,获得GET SET方法
封装SliderMenuView对象,封装Toggle,add,bindlist,onslidemenuclick,open,close,初始化变量,初始化VIEW,初始化监听器方法,创建构造方法,获取Activity实例,设置状态参数,数据源LIST,底部布局实例变量,初始化变量,初始化布局实例变量。
建立内部类,实现ONCLICK接口,给布局附上监听器
打开方法,建立布局参数,双向FILL_PARENT,为布局对象添加规则,addrule(relateive.below,R.id.includetitle),把布局参数传入布局,改变开关变量,关闭过程为设置高度为68dp.
ADD方法参数为菜单ITEM,加入LIST中
新建LISTITEM ADAPTER类,建立adapterbase类,封装adapter,构造传入list,context赋予本地变量,设置变量为抽象类,可以避免强制实现GETVIEW方法,封装LAYOUTINFLATER属性,并初始化,增加GETCONTEXT方法
添加listview selector
在SLIDEMENUVIEW中初始化LISTVIEW,加入ADAPTER,设置点击事件
在ActivityFRAME中再次封装菜单,CREATESLIDEMENU(),传入菜单选项的ID,用getresource.getstringarry来转换为STRING[],新建ITEM,调用ADD,绑定数据源。
增加SLIDERMENUITEM的构造函数,传入ID和TITLE
绑定到slidemenuview上面(bind方法)
主Activity使用createslidemenu新建滑动窗口
----------------------------------------------------------------------------------
在slidemenueview中声明菜单ITEM点击接口,参数为view和slidemenuitem
设置接口变量,将传入的activity转化为接口类型,给变量赋值
在菜单的ONCLICK类中,使用得到的该变量,调用其中的方法
传入的变量ITEM项可以通过ADAPTER获取
在调用的activity中实现该接口,实现回调
(菜单封装完成)
------------------------------------------------------------------------
人员管理账本管理
封装SQLITEDATABASECONFIG类(数据库的配置)
定义静态常量 Databasename,version,自身实例 instance(单例模式)
实现方法静态,getinstance,取得自身的实例,instance为空,new一个,否则直接返回instance
实现方法,返回数据库名,返回版本号
实现GETTABLE方法,返回一个arraylist
封装SQLiteHelper类(帮助打开数据库,Update数据库)
继承SQLiteOpenHelper类
静态成员变量,SQLiteDatabaseConfig
静态自身实例,instance
成员变量context
构造方法,传入context,调用父类构造函数,context,databasename,null,version
给context赋值
实现getinstance方法,传入context,返回instance
实现createtable方法,获取sqlitedatabaseconfig的gettable方法,得到arraylist
封装SQLiteDALBase类(基本的数据库操作,删除,查询,执行SQL)
抽象类
成员变量,context,database对象,构造函数获取context,getcontext()
getdatabase()返回database对象
begaintransanction(),setransectionsuccessful(),endtransection()方法
getcount方法,string[] = gettablenameandpk();(gettableandpk为抽象方法,在子类中实现的回调方法)
(从数据库中按条件选择)
返回为cursor类型
execsql方法参数为string,返回为getdatabase().rawquery(参数语句,null)
返回cursor的count,并关闭游标
delete方法(通过表名和ID来删除指定项)
内部调用getdatabase返回的对象的delete方法来实现
实现findmodel方法,参数为游标,抽象方法,返回object对象
实现cursortolist方法将cursor转化为list,先定义一个arraylist,在通过cursor.movetonext()以及findmodel方法加入list中,关闭cursor,返回list
补充:为slidemenuview中的底部布局添加按键事件(onkeylistener,如果按键为menu,执行toggle方法,actionup的时候才执行,需要设置焦点(setfocus为true))
建立一个model包
新建User类(用户实体类)
用户名,删除状态(int(方便增加状态类型)),创建日期,ID(注意责添加注释)
建立一个sqlitedal
建立SQLiteDALuser类,实现对User的处理,继承SQLiteDALbase类
实现两个抽象方法
用可视化工具建立数据库表(SQLite)
userid(int),username(char),data,state
复制DDL语句
在SQLiteHelper中定义接口,用来回调执行(Sqlitedatatable声明oncreate(sqlitedatabase),upgrate(sqlitedatabase) )
在SQLITEDALBASE中IMPLEMENT,在该类的子类中实现上面两个方法
在USERDAL类中新建INSERTUSER(MODEL)方法(用下面的方法获取contentvalues,getdatabase获得实例,调用insert(gettablenameandpk()[0],null,contentvalue))
返回的ID放入model中,判断id是否大于0,返回布尔值
封装contentvalues createparms(model)方法,新建content values对象将model中的各项属性(不包括ID)放入其中(put)方法,返回contentvalue对象
封装日期操作的工具类(源代码中去抄)
-----------------------------------------------------------------------------------------------------------------------------------
在gettablenameandpk中return new string[]{表名,PK}
实现deleteuser(tablename,string condition)直接调用父类方法即可
实现Updatauser(condition,model) getdatabase.update(name,contentvalue,condition,null)
实现list
实现findmodel方法,新建model对象,通过cursor获取userid,username,data,state的值,传入model对象中
实现initdefaultdata(sqlitedatabase)方法,初始化数据库内容,新建一个model,在string中建立string array,获取过来,循环赋值给model,加入contentvalue,database.insert(gettablename,null,contentvalue),在oncreate方法中调用init(database)
新建business包,封装业务逻辑类
建立业务类,businessuser
成员变量 sqlitedaluser
构造函数传入context,实例化dal对象
封装DAL的insedrt等操作,对于结果做进一步处理
实现deleteuserbyid(int id)建立 string condition "And userID = "+id
调用DAL的删除方法,返回结果
实现update(model)传入ID和model,调用dal update方法,返回结果
实现getuser(condition)方法,传入条件,返回LIST
实现model getuserbyid(int id)方法,调用getuser(condition),返回结果
封装getuserlistbyid(string id[]),调用上面的方法,将查询到的结果循环放入一个新的LIST中,返回LIST
新建getnothideuser(condition)方法,通过state属性获取未被隐藏用户
建立businessbase封装常用方法
protected 构造函数传入context
protected getstring(int presid),retrun context.getstring()
protected getstring(id,object[]) return context.getstring(id, object[])
新建布局user linear布局,matchparent*2,内嵌listview
新建user item布局,相对布局,image+textview
新建adapteruser类
在adapterbase中新增setlist方法,以便后面设置
调用getnothideuser获得用户表,调用上面的方法设置LIST
在GETVIEW方法中做相应改变
新建ActivityUser,做设置数据等操作
新建数组资源 数据库名
设置SQLITEDATABASECONFIG类的构造参数context
在SQLITEHELPER中的getinstance方法中调用sqlitedatabaseconfig的getinstance方法对成员进行初始化
在SQLITEDATABASECONFIG中的GETTABLE用上下文获取数组资源
获取包名,context.getpackagename
循环添加到LIST中,返回LIST
__________________}__________________________
新建反射工具类实例
调用其中的newinstance(classname,object[]{context},new class[]{context.class})获得SQLITEDATATABLE实例
调用实例的Oncreate(database)方法
在ADAPTER中对点击事件作出定义
---------------------------------------------
设置菜单样式,字体大小,居中,颜色等
新建添加/修改布局,一个EDITTEXT,包含HINT,maxlength=20
封装layoutinflator
新建警告框,添加或者修改,判断输入是否重复,判断是否合法,是否为点击保存,完毕之后刷新,关闭菜单