这样进度条的尺寸就可以根据设置灵活调整了。
综上所述,进度条的设置,关键在于首先在xml中要使其不可见,即GONE,然后根据动作不断增加显示,后面具体需要和线程配合使用。
Android快速开发4——ListView控件的使用
ListView控件主要用来在屏幕上,以列表形式显示数据,帮助用户进行浏览操作。
使用方法相对复杂一些,主要包括class和两个布局文件xml。
首先编辑第一个xml文件(main)
基本就是要使用linearlayout进行一下嵌套,先竖着线性,然后每行里的内容再线性,此处贴出的例子均是确认正确的。
注意设置的排列方向为垂直。
Scrollbars表示当显示不全时,上下滚动。
第二个xml(user.xml)
这里实际上是每一行的布局,本例中在每一行中有两个textView显示内容,实际可根据情况选择其他控件。
最后编辑class文件,与普通activity不同的是,使用listView控件的activity要继承ListActivity,如下:
需要注意几个地方:
1继承ListActivity这个方法
2声明ArrayList和hashmap,并给其填充内容,具体情况可根据数据要求写循环操作。
3声明SimpleAdapter,其中包含4个部分的内容,最后要setListAdapter。
最后如果要操作list中的记录,需要复写onListItemClick方法,如下:
根据实际需要,在这里添加对应的功能代码。
Android快速开发5——使用handler控制进度条
1基本使用
Handler被用来处理程序的异步操作,也就是用来编写多线程相关的程序。
基本的使用方法非常简单,核心代码只在class中编写,有时候为了增加开始和结束功能,会在布局文件xml中添加按钮控件,以下只针对class中具体的调用进行说明。
先要声明Handler,然后声明匿名内部类Runnable,实例化一个updateThread,再复写他的run方法,实际的操作写在这个run方法里。
这里的例子比较简单,就是执行一个日志打印,其中handler.postDelayed是每3000ms执行一次updateThread。
如果不想有延迟时间,直接用handler.post即可。
以上是handler执行的异步操作,还需要开始和结束按钮使线程开始和结束。
实际就是给两个按钮添加监听:
开始执行,就是把updateThread这个实例post进handler。
当前为马上开始进行操作。
结束执行时,使用removeCallBacks将updateThread从handler中移除即可。
最后将两个监听器绑定到对应的按钮上,即可完成操作。
在实际项目中,根据用处和实际情况,在run中编写实际的代码即可。
2使用Handler控制进度条的方法
首先在布局文件中声明一个横向进度条,同样通过findViewById获取,并声明一个按钮,添加应有的绑定,本例是使用按钮开始线程,由线程控制进度条的运行。
与普通的使用一样,先要声明匿名内部类
这里声明的内部类是updateBarHandler
Bar1.setProgress(msg.arg1),由一个消息信息控制进度条的运行,这个消息msg来源于run中的代码。
同样的使用post把线程重新放进Handler实例中。
在Runnable中,首先声明一个i,并赋予初始值。
在run中:
Messagemsg=updateBarHandler.obtainMessage();一个消息队列的使用。
Msg.arg1=i;在消息队列的参数1中接收i。
然后每500ms让线程执行一次。
把msg放入到updateBarHandler的消息队列。
当i等于100时,将线程移除。
最后是按钮触发器的实际操作;
首先从控件不可见,到将执行线程放入handler,然后根据run的代码自动运行。
最后将触发器绑定到按钮上。
Android快速开发6——Handler与activity的线程分离
上一个文档的例子里,使用开始按钮和结束按钮控制屏幕后台的日志打印,直接调用run方法,实际上这个操作和activity是没有分开的,根据实际验证,这个线程的信息和activity的线程信息完全一样,因此说明二者互相干涉,没有做到真正的分离,但实际应用肯定不行,需要把复杂的耗时场的处理放在单独的线程中,因此就要使用下面介绍的方法。
本例只在class中编写代码,实际功能是利用一个线程在日志中打印字符串。
系统加载后自动运行单独的线程执行操作。
代码分下面两部分:
如上图:
加载了布局文件之后,声明HandlerThread对象,然后使用start方法,这样才能开始一个独立于activity的线程,并且只有在使用了start方法,后面才能使用looper。
MyHandler是后面声明的一个匿名内部类,实例化时使用handlerThread的getLooper()方法,保证当时间轮盘轮转到时,可以占用CPU时间。
然后再声明一个Message对象,同时从myHandler中接受消息信息。
在msg中传递数据,arg1和arg2用来传递简单的整型数据。
还可以使用Bundle传递相对复杂的对象,对象是一组键值对,可以包含整数或字符串等常用内容。
声明Bundle对象,直接在b中put需要传递的内容。
setData(b),将b存入,sendToTarget,发送到目标,实际就是myHandler。
下面是第二部分,
声明匿名内部类,并继承Handler。
注意构造函数的使用,最后复写handleMessage的方法。
其中声明Bundle后,使用msg.getData接收来自之前sendToTarget的内容。
通过键值名称接收数据。
B.getInt和b.getString。
根据当前实例,加载布局文件后直接执行,实际会放在其他操作之后,如此就可以使线程得到分离。
Android快速开发7——SQLite编程
SQLite是android框架自身包含的一个小型关系数据库系统,他支持基本的SQL语句以及基本的表操作功能,能够满足android编程中对数据的基本操作,是一种简便的数据解决方案。
SQLite本身占系统资源非常小,一共才几十kb,所以使用他处理数据,对系统资源本身的影响比较小,但是需要注意,出于各种原因,SQLite本身会存在一些让人莫名其妙的bug,故对于SQLite,仅限于处理简单的数据事务,不适合处理复杂的业务。
以下通过几个截图,说明具体使用方法:
整个开发过程分几部分,首先xml布局文件中,要有基本的按钮,以及其他需要的控件,并绑定对应的监听器,具体方法不再赘述。
其次,需要两个class文件,一个是SQLiteActivity.class,对应主界面的java文件,另一个是DatabaseHelper.class,一个助手类文件。
首先看这个助手类:
首先:
这个class需要继承一个SQLiteOpenHelper的方法,然后分别创建三个构造函数,其中三组构造函数的初始化赋值有所不同。
基本型包含全部的4个参数:
context,name,factory,version
Context就是activity对象;
Name就是要操作的表名;
Factury暂时传null;
Version为操作数据库的版本,是一个递增正数,若数据库有增删改的变化,需要给这个值;
只有context和name的构造函数,只用在初始化建表的时候;
包含context,name,version三个参数的构造函数,用在对表进行修改的时候;
紧接着要复写onCreate()和onUpgrade()两个方法:
onCreate()方法,包含的是建表等语句,只执行一次,使用两个参数的构造函数进行初始化。
onUpgrade()方法,在回调函数有版本号变化时执行,操作数据库的增删改操作。
以上基本的助手类就编写完成了。
下面是SQLiteActivity.class的编写:
首先要了解到,如何在命令行里操作sqlite库的文件。
在手机模拟器启动的情况下(不启动找不到),到adt工具的安装目录,找到sdk目录,进入“platform-tools”,找到adb.exe,执行adbshell,进入模拟器的linux环境,此时提示符变成“#”。
找到根目录的data文件夹,进入,再进入一层data目录,可以看到当前系统中所有开发和安装的com包文件。
当这个项目(com包中)执行过sqlite的建表文件,就会包含一个databases的目录,进入这个目录,就可以使用SQL语句直接操作表数据。
当进入了该目录后,执行sqlite3dbname,进入sql模拟状态,操作方法跟其他SQL工具一致。
.schema,查看当前库里有哪些表。
实际代码操作如下:
继承基本的activity类,然后在onCreate()方法中获取按钮等控件的使用,添加对应的点击响应,这些内容和其他控件的使用没有区别。
1下面是表的创建
在创建数据库按钮的匿名类中,复写onClick方法,回调函数,包含两个参数:
SQLiteActivity.this,就是当前的activity,后面的“”中的,是创建的表名。
只有在添加了后面getReadableDatabase()方法并执行后,才真正创建一个新表。
最后将这个操作绑定到对应的按钮点击监听器上即可。
2更新表结构
更新表结构时,回调函数使用3个参数,增加一个版本号,这样会调用那个upgrade()方法,如果里面有表结构的修改语句,则会对表结构进行修改。
3插入数据
插入数据的时候,先声明一个contentValues对象,实例化以后,向他put键值对,键名为表的字段,后面会根据字段类型自动判断传入的数据类型。
同样调用upgrade()的方法,之后使用db.insert将contentValues的值传入到这个表中,完成数据插入。
4更新数据
类似于插入数据,同样使用contentValues对象,调用getWritableDatbase方法,后面用db.update执行操作。
“id=?
”是条件语句
String[]{“1”}中,有几个“?
”条件,这里就跟几个成员。
5查询数据
查询数据,需要一个指针的方法,默认指向第一条记录的前面,使用cursor.moveToNext向下移动,类似rs.next的用法。
在cursor获取查询结果时:
“user”是表名;
“String[]{“id”,”name”}”是获取的表的字段;
“id=?
”是查询条件;
String[]{“1”}是查询条件的具体值,根据有几个条件,这里有几个成员;
最后的4个null,是查询时的几个设置,orderby、group等,具体可通过提示了解。
最后在获取具体值的时候,使用cursor得到要获取值的列的编号,但是获取编号又要使用该列的名称,因此完整的语句就是:
cursor.getString(cursor.getColumnIndex(“name”));
以上为使用sqlite进行的表结构新建、修改操作,表记录的增、改、查询操作。
如果只涉及查询,则只调用getReadableDatabase方法,如果涉及修改,则要调用getWritableDatabase方法。
Android快速开发8——文件下载
在android实现文件的下载,使用的是java的IO流,基本原理和思想与j2se、j2ee一致,以下为一个简单的样例,分为下载文本文件和任意类型文件。
本例中,包含一个xml布局文件和3个class文件,如上图,为这3个java文件,其中:
Download为对应xml的activity;
HttpDownloader为下载功能主要函数和方法;
FileUtils为封装的一些文件操作方法;
下面先看Download这个activity:
分别放置了两个按钮,一个用来下载文本文件,一个用来下载其他任意格式的文件。
在两个监听器里,分别绑定了两种方法,方法调用的参数如图中所标。
接下来是HttpDownloader.java文件,里面主要是两个监听器里绑定的方法
注意需要先声明一个URL类型的变量,以备下面使用。
以下是下载文本文件的详细代码:
本方法中,只有一个参数,就是要下载的文件的地址(包括文件名),返回的是一个文件流,使用时把这个文件流赋值给字符串变量。
以下是下载任意类型文件的代码:
这个方法用来下载任意格式的文件,比较实用,三个参数分别是:
urlStr:
被测文件的地址(包含文件名);
path:
存储到手机本地(SD卡的路径);
fileName:
保存到本地时的文件名;
返回值:
当下载出现异常失败时,返回-1,当本地指定路径已经存在该文件时,返回1,当下载成功时,返回0;
本方法中的getInputStreamFromUrl()方法,是本class文件中单独实现的一个方法,用来把从url中读取到的文件流,赋值给变量进行处理,代码如下:
以上的代码是两个下载按钮绑定的基本方法,其中包含了一些“在SD卡创建目录,创建文件,判断文件存在,写数据”的方法,封装到了另一个class文件FileUtils中。
首先声明String类型变量SDPATH,声明get方法,用构造函数给SDPATH赋值初始化,
Environment的方法可以让程序适应任意的手机环境,然后依次是4个文件操作方法:
基本代码编写完成后,因为本例中使用了网络访问和存储卡读写等操作,所以要在配置文件manifest上设置权限,才能正确使用:
至此,android的基本文件下载功能完成。
Android快速开发9——使用SAX处理XML文件
使用SAX处理XML文件,边读取边处理,本例包含3个文件:
1xml文件,2基本操作的activity,3MyContentHandler.java。
首先xml文件的内容中包含以下格式:
在activity中编写如下代码,在监听器中增加功能代码:
在onClick方法中增加上面代码:
先声明一个httpDownloader对象,然后调用文本下载的方法,将xml文件当做一个文本文件读入一个变量。
SAXParserFactory是这里的固定用法,然后用reader中的方法去处理具体的xml文件。
MyContentHandler是另一个编写的class,里面包含处理xml的具体方法。
Reader的parse方法,处理两个内部方法,InputSource和StringReader。
下面是MyContentHandler的代码:
首先以适配器模式,这个类要继承DefaultHandler类;
声明的变量用来存储xml中的每个元素。
tagName用来存储每个元素的标签名。
startDocument和endDocument用来处理开始的根节点。
startElement和endElement用例处理一级节点,本例为worker,具体代码为:
localName为不带前缀的名称(**:
),qName为带前缀的名称,attribute为标签属性(尖括号中值的部分)
首先把localName存入tagName待用,然后判断,当localName为预计的一级标签时,循环属性个数长度,把第序号个标签而定属性和值存起来。
当在结束标签中遇到worker时,结束处理,加了一个打印的方法,这个方法是在下面手写的。
具体处理标签字段中的值,由于每次已经把标签名存入tagName了,所以用if判断,当标签为指定名称时,将对应信息存入变量。
基本按格式固定用法。
最后是结束标签时打印的操作。
如此处理完先下载,后处理xml文件的操作(下载的方法参加相关部分)。
Android快速开发10——广播机制1
在程序运行时,使用广播的形式处理发送端不需要确认接收端的处理状态的情况,就像实际的广播一样,发出了信号,但接收端是否接收了,是否处理了,不在发送端的处理之中。
就好像UDP协议,只管发送数据,是否收到则不做考虑。
本例为广播机制最简单的使用,需要两个文件:
1基本界面的activity,2负责处理事件的class文件。
下面是负责处理事件的class文件,本例比较简单:
首先名称,要注意,需要放在manifest中进行注册用,用例区分多个不同的broadcast;
这个类要继承BroadcastReceiver这个类;
先声明构造函数publicTestReceiver(){写入需要的方法}