公文素材库 首页

android软件开发工程师转正个人总结

时间:2019-05-28 07:41:00 网站:公文素材库

android软件开发工程师转正个人总结

个人总结

我于201*年8月13日进入公司,根据公司的需要,目前担任Android软件工程师一职,负责综合代维,考务通手机客户端的开发工作。将近3个月的时候在这个新的工作环境我收获颇深。开始让我独立完成整个项目,这还是我的第一次,之前在公司是多人完成,过程中也遇到了许多困难,但是都一一解决了,我想这是我最宝贵的经历,通过三个月的不断学习,在项目开发中的不断锻炼以及同事、领导的帮助,我已逐渐融入这个大家庭,个人的工作技能也有了明显的提高,虽然仍有一些不足,但三个月以来我付出了不少,也收获了不少,我感觉自己成长了,也逐渐成熟了。

初到公司,加入了咨询与信息化部,加入了综合代维项目组,我也曾担心自己不知道该怎么与项目组的同事沟通,担心不知道怎么做好工作,但是项目组的前辈们都很亲切,也很耐心的教导我,解答我的疑问,以及他们团结向上的精神,让我很快的熟悉了工作,融入了项目组。

在这三个月的学习和工作中,我一直严格要求自己,遵循公司的规章制度,认真完成领导布置的每一项任务,遇到的问题虚心的向项目组的前辈们学习、请教,不断的提高、充实自己。开发过程中出现的一些差错,也有前辈们耐心的指出和指导我修改,这些经历让我不断成熟,处理问题时考虑得更全面,杜绝类似情况的发生。在此我要特地感谢部门的领导和同事们对我的指引和帮助,感谢他们对我工作上失误的提醒和指正。

经过这三个月,我已经能独立进行开发任务,按时按质的完成分配的工作任务,当然还有许多不足,开发的经验仍有待提高,编写代码的简洁性和完整性也需要进一步增强,需要不断的继续学习以提高自己的工作能力。

总之,这三个月来我学到了很多,感悟了很多;看到公司的迅速发展,看到部门的同事越来越多,我深深地感到骄傲和自豪,也更加迫切的希望以一名正式员工的身份在这里工作,实现自己的奋斗目标,体现自己的人生价值,和公司一起成长。

我会用谦虚的态度和饱满的热情做好我的本职工作,为公司创造价值,同公司一起展望美好的未来!

XX

201*年11月13日

扩展阅读:android开发基础-个人总结版

Android文档

Android文档..............................................................................................................................................................11自定义控件.........................................................................................................................................................2

1.1第一种添加属性的方法,之前我也是经常使用这种写法,代码如下:.........................................21.2下面是第二为VIEW注册属性的写法................................................................................................32Button..................................................................................................................................................................9

2.1单击事件写法.........................................................................................................................................92.2Button居中方法.....................................................................................................................................9

2.2.1[图片]运行结果......................................................................................................................102.2.2[代码]简单说明......................................................................................................................10

3EditText属性...................................................................................................................................................104设置横竖屏去掉状态栏..................................................................................................................................115GridView网格布局.........................................................................................................................................126登录界面的混合布局.......................................................................................................................................147万能android调用webservices方法xml.......................................................................................................168Android调用webservices................................................................................................................................189editText的监听事件change...........................................................................................................................1910轻量级数据库的存储和取值...................................................................................................................201*Android数据库的使用...................................................................................................................................201*连接webServices未成功........................................................................................................................2313数据库操作,包括分页...........................................................................................................................2414android多种布局.....................................................................................................................................32

14.1view的布局显示概述..........................................................................................................................3214.2线性布局(LinearLayout).............................................................................................................3314.3相对布局(RelativeLayout)..........................................................................................................3714.4表格布局(TableLayout)...............................................................................................................3914.5列表视图(ListView)....................................................................................................................4114.6网格视图(GridView)...................................................................................................................4514.7标签布局(TabLayout).................................................................................................................5015AndroidManifest.xml中的一些配置.......................................................................................................5416重力感应编程...........................................................................................................................................5517Android问价的压缩与解压...................................................................................................................5618List详解...................................................................................................................................................6119自定义带有图标的文件管理器...............................................................................................................1自定义控件

1.1

第一种添加属性的方法,之前我也是经常使用这种写法,代码如下:

packagecom.terry.attrs;

importandroid.content.Context;importandroid.util.AttributeSet;importandroid.widget.EditText;importandroid.widget.LinearLayout;importandroid.widget.TextView;

publicclassEditTextExt1extendsLinearLayout{

privateStringText="";

publicEditTextExt1(Contextcontext){this(context,null);

//TODOAuto-generatedconstructorstub}

publicEditTextExt1(Contextcontext,AttributeSetattrs){super(context,attrs);

//TODOAuto-generatedconstructorstubintresouceId=-1;

TextViewtv=newTextView(context);EditTextet=newEditText(context);

resouceId=attrs.getAttributeResourceValue(null,"Text",0);if(resouceId>0){

Text=context.getResources().getText(resouceId).toString();}else{Text="";}tv.setText(Text);

addView(tv);

addView(et,newLinearLayout.LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT));this.setGravity(LinearLayout.VERTICAL);}}

这种写法,简单明了,不需要额外XML的配置,就可以在我们的VIEW文件下使用。

以上代码通过构造函数中引入的AttributeSet去查找XML布局的属性名称,然后找到它对应引用的资源ID去找值。使用也时分方便。所以一直以来我也是很喜欢这种写法。如上,自定好VIEW文件就可以在XML布局下如此使用:

好了,这是第一种为VIEW注册属性的写法,比较简单就不多介绍。

1.2下面是第二为VIEW注册属性的写法

,这里也要重点说说第二种注册属性的写法和使用要点,先看一下JAVA代码要如何编写:

packagecom.terry.attrs;

importandroid.content.Context;

importandroid.content.res.TypedArray;importandroid.util.AttributeSet;importandroid.widget.EditText;importandroid.widget.LinearLayout;importandroid.widget.TextView;publicclassEditTextExtextendsLinearLayout{

publicEditTextExt(Contextcontext){this(context,null);

//TODOAuto-generatedconstructorstub}

publicEditTextExt(Contextcontext,AttributeSetattrs){super(context,attrs);

//TODOAuto-generatedconstructorstubintresouceId=-1;

TypedArraytypeArray=context.obtainStyledAttributes(attrs,R.styleable.EditTextExt);

TextViewtv=newTextView(context);EditTextet=newEditText(context);

intN=typeArray.getIndexCount();for(inti=0;i

intattr=typeArray.getIndex(i);switch(attr){

caseR.styleable.EditTextExt_Oriental:

resouceId=typeArray.getInt(R.styleable.EditTextExt_Oriental,0);

this.setOrientation(resouceId==1?LinearLayout.HORIZONTAL:LinearLayout.VERTICAL);break;

caseR.styleable.EditTextExt_Text:resouceId=typeArray.getResourceId(R.styleable.EditTextExt_Text,0);

tv.setText(resouceId>0?typeArray.getResources().getText(resouceId):typeArray

.getString(R.styleable.EditTextExt_Text));break;}}

addView(tv);addView(et);

typeArray.recycle();}}如上代码,跟前面代码一样。还是用的一个EDITTEXT和TEXTVIEW做基础组件。下面我们一步步分析上面的代码:

R.styleable.EditTextExt代码的是一个attrs指向的一个declare-styleable的标签,如下代码:

这个文件位于,values下的attrs.xml目录下面,我比较喜欢一个自定义View对应一个declare-styleable标签。

Tip:一个自定义View第一部分的代码,

TypedArraytypeArray=context.obtainStyledAttributes(attrs,R.styleable.EditTextExt);

指定为一个declare-styleable,而在declare-styleable下的attr(即各属性)Android的ADT将会自动生成为declare-styleable的name名字加上“_”加上对应attr(即属性名称)的名称,如上

(EditTextExt_Text)我们要得到Text就需要R.styleable.EditTextExt_Text,这一点的话可以看看R.java生成文件:

publicstaticfinalclassstyleable{

/**AttributesthatcanbeusedwithaEditTextExt.Includesthefollowingattributes:

AttributeDescription

{@link#EditTextExt_Orientalcom.terry.attrs:Oriental}

{@link#EditTextExt_Textcom.terry.attrs:Text}

@see#EditTextExt_Oriental@see#EditTextExt_Text*/

publicstaticfinalint[]EditTextExt={0x7f010000,0x7f010001};/**

Thissymbolistheoffsetwherethe{@linkcom.terry.attrs.R.attr#Oriental}

attribute"svaluecanbefoundinthe{@link#EditTextExt}array.

Mustbeoneofthefollowingconstantvalues.

ConstantValueDescriptionHorizontal1Vertical0

@attrnameandroid:Oriental*/

publicstaticfinalintEditTextExt_Oriental=1;/**

Thissymbolistheoffsetwherethe{@linkcom.terry.attrs.R.attr#Text}

attribute"svaluecanbefoundinthe{@link#EditTextExt}array.

Maybeareferencetoanotherresource,intheform"@[+][package:]type:name"

ortoathemeattributeintheform"?[package:][type:]name".

Maybeastringvalue,using"\\\\;"toescapecharacterssuchas"\\\\n"or"\\\\uxxxx"foraunicodecharacter.@attrnameandroid:Text*/

publicstaticfinalintEditTextExt_Text=0;};

好了,上述的代码写完,我们要在XML布局如何使用呢?这个会跟Android提供的基础组件的使用方法是一致的。首先,我们要为其提供一个引用包名如下:

xmlns:android=""

xmlns:terry=""

上面提供的是android基础组件的包名,和我们自己组件的包名。

写好了包名。就可以像使用andriod基础组件一样使用了,如下全部XML布局源码:

android:layout_width="fill_parent"android:layout_height="wrap_content"terry:Text="fdsafda"terry:Oriental="Vertical">

运行效果如下:

这是这两种为Android注册属性的使用方法,那么两者有什么区别呢?在这里我认为起码有五点,大家可以找找看还有什么区别:

第二种可以编译时报错,如果编程人员随便输入什么第一种是不会报错的,第二种可以支持代码检测功能。

第二种写法,跟Android属性标准写法是一致的,而且可以统一书法规则。

第二种写法,可以支持数据格式的验证,比如我们在attrs上注明只支持integer那么就不可以使用字符串,这是第一种达不到的。

第二种写法,可以为VIEW提供选择操作,比如如上我们使用的ENUM让VIEW对应的属性支持ENUM列表,或者为其提供BOOL等只有双项选择的操作。

第一种写法,所有的属性必须是引用自资源(不大确定,如果朋友有什么好的DEMO麻烦共享),第二种写法,可以即支持引用资源又可以直接输入做操作,为编程带来更多的方便性。

种种都说明,第二种写法更具规范性,功能更性,代码编写也更优雅,但个人有个人的使用习惯,我两种都喜欢用,具体看需求吧。呵呵。。。

2Button

2.1单击事件写法

也可以指定多个OnClickListener或其他类型的事件,那就看看是否需要了。以上几个代码也可以写成以下格式:

findViewById(R.Id.btnOK).setOnClickListener(newOnClickListener(){

@Override

publicvoidonClick(Viewv){//TODO:事件需要片的逻辑代码。}});

2.2Button居中方法

01

0208

0912

1316Android:gravity="center_horizontal"17Android:textSize="20sp"

18Android:layout_alignParentBottom="true"19Android:layout_centerHorizontal="true"20Android:text="返回主界面"/>21

2.2.1[图片]运行结果

2.2.2[代码]简单说明

1可以看到Button与Gallery的对齐方式是居中对齐,也即Button与Parent居中对齐。2另外,

3Android:gravity="CENTER_VERTICAL“:这个是垂直居中对齐4Android:gravity="BOTTOM”:放在容器的底部5Android:gravity="CENTER“:放在容器的中心

3EditText属性

Android中的EditText数据编辑框,相当于C#中的TextBox。刚开始接触时容易和TextView组件混淆,分不清那个是显示,那个是编辑,至少我就犯了这个错误。Layout声明:

android:layout_width="200px"android:paddingRight="@dimen/padding"android:textSize="18sp"android:layout_x="14px"android:layout_y="41px"

android:layout_height="wrap_content">

注:

android:id,不用说了,组件的唯一标识。

android:layout_width\\android:layout_height:宽度与高度,所有的android组件都是这么指定。参见Button说明。

android:layout_y\\android:layout_y:待定。

android:paddingRight:与右侧空白大小。当然,还是paddingLeft、paddingTop、paddingButton和paddingAll。

除了上面这些,如果要指定EditText为Password输入框,可用android:password=”true”进行声明。

另外还有在用户输入体验上的标签,不会影响程序的运行,但会给用户输入带来很好的体验,如只需要输入电话号码或都数字等。

android:phoneNumber="true":系统只会打开电话输键盘(电话号码不可用键不会显示.android:numeric="integer|signed|decimal":系统只会打开数据键盘(三值可选一)。

4设置横竖屏去掉状态栏

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);//设置成全屏模式

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE););//强制为横屏

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//竖屏

我做的东西里面还用到了去掉标题栏。我也贴出来

requestWindowFeature(Window.FEATURE_NO_TITLE);5GridView网格布局

[功能]

以前提及过GridView说也是一种AdapterView和ListView有点像今天花了时间用了一些有点心得和大家分享分享[思路]

1.既然和ListView像那么应该还是通过setAdapter()来设置吧

2.因为我想显示的是一些图片信息必须用到ImageView不是默认的Adapter用到的TextView所以只能自己扩展了[代码]

1.定义包含GridView的main.xmkJava代码

1.2.7.14.这行应该注意一下:Java代码

1.android:numColumns="3"用来设定GridView每行显示的View数目如果没有这行会默认每行显示一个View和ListView的一样

2.自定义classImageListextendsBaseAdapter其中主要是:写道

ViewgetView(intposition,ViewconvertView,ViewGroupparent)

用于显示目标ImageView

Java代码1.publicclassImageListextendsBaseAdapter{2.Activityactivity;3.4.//construct5.publicImageList(Activitya){6.activity=a;7.}8.9.@Override10.publicintgetCount(){11.//TODOAuto-generatedmethodstub12.returnimage.length;13.}14.15.@Override16.publicObjectgetItem(intposition){17.//TODOAuto-generatedmethodstub18.returnimage[position];19.}20.21.@Override22.publiclonggetItemId(intposition){23.//TODOAuto-generatedmethodstub24.returnposition;25.}26.27.@Override28.publicViewgetView(intposition,ViewconvertView,ViewGroupparent){29.//TODOAuto-generatedmethodstub30.ImageViewiv=newImageView(activity);31.iv.setImageResource(image[position]);32.returniv;33.}34.}

3.给GridView指定AdapterJava代码

1.GridViewgv=(GridView)findViewById(R.id.gride);2.3.ImageListadapter=newImageList(this);4.5.gv.setAdapter(adapter);

所以最后效果图是这样的网格布局

6登录界面的混合布局

开发UI时,通常是先设计布局,具体怎么创建布局文件见上篇,本篇主要讲如何做登陆窗口的布局,新建布局XML文件默认有一个LinearLayout布局对象和TextView对象,我们把TextView删除,LinearLayout是线性布局,可以横向或纵向线性排列里面的对象,在里面我们放个RelativeLayout对象,该对象是个相对布局对象,可以居中子对象,RelativeLayout对象里面再放LinearLayout对象,默认是横向线性排列子对象,这个LinearLayout里面再放入TextView、Button等,这样通过布局对象我们可以比较规则的布局登陆控件了,具体代码和效果图如下:

android:orientation="vertical"//纵向线性排列子对象

android:layout_width="fill_parent"android:layout_height="fill_parent">

//设置高度

android:layout_height="wrap_content">

我们可以可视化的添加Layouts布局对象和Views对象,选中对象后在Properties选项卡可设置属性值,如图。

当然可以切换到代码模式添加对象或设置属性值,就像asp.net的aspx文件可以在design下设计也可在source下设计,不过Ophone没有split模式。另外布局对象的RelativeLayout相对定位布局和AbsoluteLayout绝对定位布局,有点像css中的position定位中的relative和absolute。

7万能android调用webservices方法xml

关键代码:try{

//发帖机原理,模拟浏览器

finalStringSERVER_URL="";//定义需要获取的内容来源地址

URLurl=newURL(SERVER_URL);URLConnectioncon=url.openConnection();con.setDoOutput(true);

con.setRequestProperty("Pragma:","no-cache");con.setRequestProperty("Cache-Control","no-cache");con.setRequestProperty("Content-Type","text/xml");

OutputStreamWriterout=newOutputStreamWriter(con.getOutputStream());//控件取值

EditTexteTextName=(EditText)findViewById(R.id.tbx_name);EditTexteTextAge=(EditText)findViewById(R.id.tbx_age);String

xmlInfo

=

""+URLEncoder.encode(eTextName.getText().toString())+""

+eTextAge.getText().toString()

+"";//发送

out.write(newString(xmlInfo.getBytes("UTF-8")));out.flush();out.close();//取返回值

BufferedReaderbr=newBufferedReader(newInputStreamReader(con.getInputStream()));

StringBuildersBuilder=newStringBuilder();Stringline="";

for(line=br.readLine();line!=null;line=br.readLine()){sBuilder.append(line);}

//解析XML

Patternpatternname=Pattern.compile(".*?");Matchermatchername=patternname.matcher(sBuilder.toString());if(matchername.find()){

Stringname=matchername.group();

TextViewlblname=(TextView)findViewById(R.id.lbl_name);lblname.setText(URLDecoder.decode(name.substring(name.indexOf(">")+1,name.lastIndexOf("Matchermatcherage=patternage.matcher(sBuilder.toString());if(matcherage.find()){

Stringage=matcherage.group();

TextViewlblage=(TextView)findViewById(R.id.lbl_age);lblage.setText(age.substring(age.indexOf(">")+1,age.lastIndexOf("newAlertDialog.Builder(this).setTitle("Hint").setMessage(e.getMessage()).setPositiveButton("OK",null).show();}}

以上方法可以正确的得到WebService的返回值,但是那是一个完整的xml,需要进一步解析从而得到想要的结果解析的方法如下所示:

DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();DocumentBuilderbuilder=factory.newDocumentBuilder();

InputStreamis=newByteArrayInputStream(result.getBytes("UTF-8"));Documentdom=builder.parse(is);

Stringres=dom.getDocumentElement().getChildNodes().item(0).getNodeValue();

9editText的监听事件change

/**

*edittext的监听事件*/

privateTextWatcherwatcher=newTextWatcher(){

@Override

publicvoidafterTextChanged(Editables){//TODOAuto-generatedmethodstub}

@Override

publicvoidbeforeTextChanged(CharSequences,intstart,intcount,intafter){

//TODOAuto-generatedmethodstub}

@Override

publicvoidonTextChanged(CharSequences,intstart,intbefore,intcount){

//编辑内容

Log.d("Select----------","[TextWatcher][onTextChanged]"+s);}

};

10轻量级数据库的存储和取值

publicstaticfinalStringPREFS_NAME=“轻量级数据库的名字”;/**

记录用户名和密码*/

publicvoidsaveUsers(){

SharedPreferencessettings=getSharedPreferences(PREFS_NAME,0);//指定要使//获取编辑器

SharedPreferences.Editoreditor=settings.edit();

用的数据库

//存入数据(键值的形式)editor.putString("username",username.toString());

editor.putString(username.toString(),password.getText().toString().trim());

//提交editor.commit();

}

//取值

SharedPreferencessharedPreferences=getSharedPreferences("itcast",Context.MODE_PRIVATE);

Stringname=sharedPreferences.getString("username","");Stringpassw=sharedPreferences.getString(name,"");

11Android数据库的使用

Activites可以通过ContentProvider或者Service访问一个数据库。下面会详细讲解如果创建数据库,添加数据和查询数据库。

创建数据库Android不自动提供数据库。在Android应用程序中使用SQLite,必须自己创建数据库,然后创建表、索引,填充数据。Android提供了SQLiteOpenHelper帮助你创建一个数据库,你只要继承

SQLiteOpenHelper类,就可以轻松的创建数据库。SQLiteOpenHelper类根据开发应用程序的需要,封装了创建和更新数据库使用的逻辑。SQLiteOpenHelper的子类,至少需要实现三个方法:

构造函数,调用父类SQLiteOpenHelper的构造函数。这个方法需要四个参数:上下文环境(例

如,一个Activity),数据库名字,一个可选的游标工厂(通常是Null),一个代表你正在使用的数据库模型版本的整数。

onCreate()方法,它需要一个SQLiteDatabase对象作为参数,根据需要对这个对象填充表和

初始化数据。

onUpgrage()方法,它需要三个参数,一个SQLiteDatabase对象,一个旧的版本号和一个新的

版本号,这样你就可以清楚如何把一个数据库从旧的模型转变到新的模型。

下面示例代码展示了如何继承SQLiteOpenHelper创建数据库:publicclassDatabaseHelperextendsSQLiteOpenHelper{DatabaseHelper(Contextcontext,Stringname,CursorFactorycursorFactory,intversion){super(context,name,cursorFactory,version);}@OverridepublicvoidonCreate(SQLiteDatabasedb){//TODO创建数据库后,对数据库的操作}@OverridepublicvoidonUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion){//TODO更改数据库版本的操作}@OverridepublicvoidonOpen(SQLiteDatabasedb){super.onOpen(db);//TODO每次成功打开数据库后首先被执行}}接下来讨论具体如何创建表、插入数据、删除表等等。调用getReadableDatabase()或

getWriteableDatabase()方法,你可以得到SQLiteDatabase实例,具体调用那个方法,取决于你是否需要改变数据库的内容:

db=(newDatabaseHelper(getContext())).getWritableDatabase();return(db==null)?false:true;上面这段代码会返回一个SQLiteDatabase类的实例,使用这个对象,你就可以查询或者修改数据库。当你完成了对数据库的操作(例如你的Activity已经关闭),需要调用SQLiteDatabase的Close()方法来释放掉数据库连接。

创建表和索引

为了创建表和索引,需要调用SQLiteDatabase的execSQL()方法来执行DDL语句。如果没有异常,这个方法没有返回值。

例如,你可以执行如下代码:db.execSQL("CREATETABLEmytable(_idINTEGERPRIMARYKEYAUTOINCREMENT,titleTEXT,valueREAL);");这条语句会创建一个名为mytable的表,表有一个列名为_id,并且是主键,这列的值是会自动增长的整数(例如,当你插入一行时,SQLite会给这列自动赋值),另外还有两列:title(字符)和value(浮点数)。SQLite会自动为主键列创建索引。

通常情况下,第一次创建数据库时创建了表和索引。如果你不需要改变表的schema,不需要删除表和索引.删除表和索引,需要使用execSQL()方法调用DROPINDEX和DROPTABLE语句。

给表添加数据

上面的代码,已经创建了数据库和表,现在需要给表添加数据。有两种方法可以给表添加数据。

像上面创建表一样,你可以使用execSQL()方法执行INSERT,UPDATE,DELETE等语句来更新表的数据。execSQL()方法适用于所有不返回结果的SQL语句。例如:

db.execSQL("INSERTINTOwidgets(name,inventory)"+"VALUES("Sprocket",5)");另一种方法是使用SQLiteDatabase对象的insert(),update(),delete()方法。这些方法把SQL语句的一部分作为参数。示例如下:

ContentValuescv=newContentValues();cv.put(Constants.TITLE,"exampletitle");cv.put(Constants.VALUE,SensorManager.GRAVITY_DEATH_STAR_I);db.insert("mytable",getNullColumnHack(),cv);update()方法有四个参数,分别是表名,表示列名和值的ContentValues对象,可选的WHERE条件和可选的填充WHERE语句的字符串,这些字符串会替换WHERE条件中的“?”标记。update()根据条件,更新指定列的值,所以用execSQL()方法可以达到同样的目的。WHERE条件和其参数和用过的其他SQLAPIs类似。例如:String[]parms=newString[]{"thisisastring"};db.update("widgets",replacements,"name=?",parms);delete()方法的使用和update()类似,使用表名,可选的WHERE条件和相应的填充WHERE条件的字符串。

查询数据库

类似INSERT,UPDATE,DELETE,有两种方法使用SELECT从SQLite数据库检索数据。1.使用rawQuery()直接调用SELECT语句;使用query()方法构建一个查询。

RawQueries

正如API名字,rawQuery()是最简单的解决方法。通过这个方法你就可以调用SQLSELECT语句。例如:

Cursorc=db.rawQuery("SELECTnameFROMsqlite_masterWHEREtype="table"ANDname="mytable"",null);

在上面例子中,我们查询SQLite系统表(sqlite_master)检查table表是否存在。返回值是一个cursor对象,这个对象的方法可以迭代查询结果。

如果查询是动态的,使用这个方法就会非常复杂。例如,当你需要查询的列在程序编译的时候不能确定,这时候使用query()方法会方便很多。RegularQueries

query()方法用SELECT语句段构建查询。SELECT语句内容作为query()方法的参数,比如:要查询的表名,要获取的字段名,WHERE条件,包含可选的位置参数,去替代WHERE条件中位置参数的值,GROUPBY条件,HAVING条件。

除了表名,其他参数可以是null。所以,以前的代码段可以可写成:

String[]columns={"ID","inventory"};String[]parms={"snicklefritz"};Cursorresult=db.query("widgets",columns,"name=?",parms,null,null,null);

12连接webServices未成功

/*publicvoidcallWS(){

writeXml();

HttpPostrequest=newHttpPost(URL);

Listparams=newArrayList();try{}

new

request.setEntity(newUrlEncodedFormEntity(params,HTTP.UTF_8));HttpResponsehttpResponse=newDefaultHttpClient().execute(request);Stringresult="";

if(httpResponse.getStatusLine().getStatusCode()!=404){result=EntityUtils.toString(httpResponse.getEntity());

params.add(newBasicNameValuePair("xml",xml));

AlertDialog.Builder(this).setTitle("Hint").setMessage(result).setPositiveButton("OK",null).show();

}

catch(Exceptione){

newAlertDialog.Builder(this).setTitle("Hint").setMessage(e.getMessage()).setPositiveButton("OK",null).show();

}

}*/

13数据库操作,包括分页

1.创建Android工程Projectname:AndroidSQLiteBuildTarget:Android2.1

Applicationname:SQLite嵌入式数据库Packagename:com.changcheng.sqliteCreateActivity:AndroidSQLiteMinSDKVersion:72.Contact实体

packagecom.changcheng.sqlite.entity;publicclassContact{privateInteger_id;privateStringname;privateStringphone;publicContact(){super();}

publicContact(Stringname,Stringphone){this.name=name;this.phone=phone;}

publicIntegerget_id(){return_id;}

publicvoidset_id(Integerid){_id=id;}

publicStringgetName(){returnname;}

publicvoidsetName(Stringname){this.name=name;}

publicStringgetPhone(){returnphone;}

publicvoidsetPhone(Stringphone){this.phone=phone;}

@Override

publicStringtoString(){

return"Contants[id="+_id+",name="+name+",phone="+phone+"]";}}

3.编写MyOpenHelper类

MyOpenHelper继承自SQLiteOpenHelper类。我们需要创建数据表,必须重写onCreate(更新时重写onUpgrade方法)方法,在这个方法中创建数据表。packagecom.changcheng.sqlite;importandroid.content.Context;

importandroid.database.sqlite.SQLiteDatabase;importandroid.database.sqlite.SQLiteOpenHelper;publicclassMyOpenHelperextendsSQLiteOpenHelper{privatestaticfinalStringname="contants";//数据库名称privatestaticfinalintversion=1;//数据库版本publicMyOpenHelper(Contextcontext){/**

*CursorFactory指定在执行查询时获得一个游标实例的工厂类。设置为null,则使用系统默认的工厂类。*/

super(context,name,null,version);}

@Override

publicvoidonCreate(SQLiteDatabasedb){

//创建contacts表,SQL表达式时提供的字段类型和长度仅为提高代码的可读性。db.execSQL("CREATETABLEIFNOTEXISTScontacts("+"_idintegerprimarykeyautoincrement,"+"namevarchar(20),"+"phonevarchar(50))");}

@Override

publicvoidonUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion){//仅演示用,所以先删除表然后再创建。

db.execSQL("DROPTABLEIFEXISTScontacts");this.onCreate(db);}}

4.编写ContactsService类

ContactsService类主要实现对业务逻辑和数据库的操作。packagecom.changcheng.sqlite.service;importjava.util.ArrayList;importjava.util.List;

importandroid.content.Context;importandroid.database.Cursor;importcom.changcheng.sqlite.MyOpenHelper;importcom.changcheng.sqlite.entity.Contact;publicclassContactsService{privateMyOpenHelperopenHelper;publicContactsService(Contextcontext){this.openHelper=newMyOpenHelper(context);}/***保存*

*@paramcontact*/

publicvoidsave(Contactcontact){

Stringsql="INSERTINTOcontacts(name,phone)VALUES(?,?)";Object[]bindArgs={contact.getName(),contact.getPhone()};this.openHelper.getWritableDatabase().execSQL(sql,bindArgs);}/***查找*

*@paramid*@return*/

publicContactfind(Integerid){

Stringsql="SELECT_id,name,phoneFROMcontactsWHERE_id=?";String[]selectionArgs={id+""};

Cursorcursor=this.openHelper.getReadableDatabase().rawQuery(sql,selectionArgs);

if(cursor.moveToFirst())

returnnewContact(cursor.getInt(0),cursor.getString(1),cursor.getString(2));returnnull;}/***更新*

*@paramcontact*/

publicvoidupdate(Contactcontact){

Stringsql="UPDATEcontactsSETname=?,phone=?WHERE_id=?";Object[]bindArgs={contact.getName(),contact.getPhone(),contact.get_id()};

this.openHelper.getWritableDatabase().execSQL(sql,bindArgs);}/***删除*

*@paramid*/

publicvoiddelete(Integerid){

Stringsql="DELETEFROMcontactsWHERE_id=?";Object[]bindArgs={id};

this.openHelper.getReadableDatabase().execSQL(sql,bindArgs);}/**

*获取记录数量*

*@return*/

publiclonggetCount(){

Stringsql="SELECTcount(*)FROMcontacts";

Cursorcursor=this.openHelper.getReadableDatabase().rawQuery(sql,null);

cursor.moveToFirst();returncursor.getLong(0);}/**

*获取分页数据*

*@paramstartIndex*@parammaxCount*@return*/

publicListgetScrollData(longstartIndex,longmaxCount){Stringsql="SELECT_id,name,phoneFROMcontactsLIMIT?,?";String[]selectionArgs={String.valueOf(startIndex),String.valueOf(maxCount)};

Cursorcursor=this.openHelper.getReadableDatabase().rawQuery(sql,selectionArgs);

Listcontacts=newArrayList();while(cursor.moveToNext()){

Contactcontact=newContact(cursor.getInt(0),cursor.getString(1),cursor.getString(2));contacts.add(contact);}

returncontacts;}/***获取分页数据,提供给SimpleCursorAdapter使用。*

*@paramstartIndex*@parammaxCount*@return*/

publicCursorgetScrollDataCursor(longstartIndex,longmaxCount){Stringsql="SELECT_id,name,phoneFROMcontactsLIMIT?,?";String[]selectionArgs={String.valueOf(startIndex),String.valueOf(maxCount)};

Cursorcursor=this.openHelper.getReadableDatabase().rawQuery(sql,selectionArgs);returncursor;}}

5.编写测试类

编写一个针对ContactsService的测试类,测试ContactsService类中的各个方法是否正确。packagecom.changcheng.sqlite.test;importjava.util.List;

importcom.changcheng.sqlite.MyOpenHelper;importcom.changcheng.sqlite.entity.Contact;

importcom.changcheng.sqlite.service.ContactsService;importandroid.database.Cursor;importandroid.test.AndroidTestCase;importandroid.util.Log;

publicclassContactsServiceTestextendsAndroidTestCase{privatestaticfinalStringTAG="ContactsServiceTest";//测试创建表

publicvoidtestCreateTable()throwsThrowable{

MyOpenHelperopenHelper=newMyOpenHelper(this.getContext());openHelper.getWritableDatabase();}

//测试save

publicvoidtestSave()throwsThrowable{

ContactsServicecontactsService=newContactsService(this.getContext());Contactcontact1=newContact(null,"tom","13898679876");Contactcontact2=newContact(null,"lili","13041094909");Contactcontact3=newContact(null,"jack","13504258899");Contactcontact4=newContact(null,"heary","1335789789");contactsService.save(contact1);contactsService.save(contact2);contactsService.save(contact3);contactsService.save(contact4);}//测试find

publicvoidtestFind()throwsThrowable{

ContactsServicecontactsService=newContactsService(this.getContext());Contactcontact=contactsService.find(1);Log.i(TAG,contact.toString());}

//测试update

publicvoidtestUpdate()throwsThrowable{

ContactsServicecontactsService=newContactsService(this.getContext());Contactcontact=contactsService.find(1);contact.setPhone("1399889955");contactsService.update(contact);}

//测试getCount

publicvoidtestGetCount()throwsThrowable{

ContactsServicecontactsService=newContactsService(this.getContext());Log.i(TAG,contactsService.getCount()+"");}

//测试getScrollData

publicvoidtestGetScrollData()throwsThrowable{

ContactsServicecontactsService=newContactsService(this.getContext());Listcontacts=contactsService.getScrollData(0,3);Log.i(TAG,contacts.toString());}

//测试getScrollDataCursor

publicvoidtestGetScrollDataCursor()throwsThrowable{

ContactsServicecontactsService=newContactsService(this.getContext());Cursorcursor=contactsService.getScrollDataCursor(0,3);while(cursor.moveToNext()){

Contactcontact=newContact(cursor.getInt(0),cursor.getString(1),cursor.getString(2));Log.i(TAG,contact.toString());}}}

启用测试功能,不要忘记在AndroidManifest.xml文件中加入测试环境。为application元素添加一个子元素:,为application元素添加一个兄弟元素:。

SQLite数据库以单个文件存储,就像微软的Access数据库。有一个查看SQLite数据库文件的工具SQLiteDeveloper,我们可以使用它来查看数据库。Android将创建的数据库存放在”/data/data/com.changcheng.sqlite/databases/contacts”,我们将它导出然后使用SQLiteDeveloper打开。6.分页显示数据

我们在ContactsService类中,提供了一个获取分页数据的方法。我们将调用它获取的数据,使用ListView组件显示出来。编辑mail.xml:

"1.0"encoding="utf-8"?>""

android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent">"fill_parent"

android:layout_height="fill_parent"android:id="@+id/listView"/>在mail.xml所在目录里添加一个contactitem.xml:"1.0"encoding="utf-8"?>

""

android:layout_width="wrap_content"android:layout_height="wrap_content">

"30dip"android:layout_height="wrap_content"android:textSize="20sp"android:id="@+id/tv_id"/>

"150dip"android:layout_height="wrap_content"

android:textSize="20sp"android:layout_toRightOf="@id/tv_id"android:layout_alignTop="@id/tv_id"android:id="@+id/tv_name"/>

"150dip"android:layout_height="wrap_content"

android:textSize="20sp"android:layout_toRightOf="@id/tv_name"android:layout_alignTop="@id/tv_name"android:id="@+id/tv_phone"/>编辑AndroidSQLite类:packagecom.changcheng.sqlite;importjava.util.ArrayList;importjava.util.HashMap;importjava.util.List;

importcom.changcheng.sqlite.R;

importcom.changcheng.sqlite.entity.Contact;

importcom.changcheng.sqlite.service.ContactsService;importandroid.app.Activity;importandroid.database.Cursor;importandroid.os.Bundle;importandroid.view.View;

importandroid.widget.AdapterView;importandroid.widget.ListView;importandroid.widget.SimpleAdapter;importandroid.widget.Toast;

importandroid.widget.AdapterView.OnItemClickListener;publicclassAndroidSQLiteextendsActivity{/**Calledwhentheactivityisfirstcreated.*/@Override

publicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);//获取分页数据

ContactsServicecontactsService=newContactsService(this);Listcontacts=contactsService.getScrollData(0,3);//获取ListView

ListViewlv=(ListView)this.findViewById(R.id.listView);//生成List>数据

List>data=newArrayList>();for(Contactcontact:contacts){HashMapitem=newHashMap();item.put("_id",contact.get_id());item.put("name",contact.getName());item.put("phone",contact.getPhone());data.add(item);}

//生成Adapter

SimpleAdapteradapter=newSimpleAdapter(this,data,R.layout.contactitem,newString[]{"_id","name","phone"},newint[]{R.id.tv_id,R.id.tv_name,R.id.tv_phone});//设置ListView适配器lv.setAdapter(adapter);//为ListView添加事件

lv.setOnItemClickListener(newOnItemClickListener(){@Override

publicvoidonItemClick(AdapterViewparent,Viewview,intposition,longid){

HashMapitem=(HashMap)parent.getItemAtPosition((int)id);

Toast.makeText(AndroidSQLite.this,item.get("name").toString(),1).show();}});}}

上面编写的分页显示数据比较麻烦,Android为我们提供了一个SimpleCursorAdapter类。使用它可以方便的显示分页数据。将AndroidSQLite类修改为:packagecom.changcheng.sqlite;importcom.changcheng.sqlite.R;

importcom.changcheng.sqlite.service.ContactsService;importandroid.app.Activity;importandroid.database.Cursor;importandroid.os.Bundle;importandroid.widget.ListView;

importandroid.widget.SimpleCursorAdapter;publicclassAndroidSQLiteextendsActivity{/**Calledwhentheactivityisfirstcreated.*/@Override

publicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);//获取分页数据

ContactsServicecontactsService=newContactsService(this);Cursorcursor=contactsService.getScrollDataCursor(0,3);//获取ListView

ListViewlv=(ListView)this.findViewById(R.id.listView);//创建Adapter

SimpleCursorAdapteradapter=newSimpleCursorAdapter(this,R.layout.contactitem,cursor,newString[]{"_id","name","phone"},newint[]{R.id.tv_id,R.id.tv_name,R.id.tv_phone});//设置ListView适配器lv.setAdapter(adapter);//为ListView添加事件

lv.setOnItemClickListener(newOnItemClickListener(){@Override

publicvoidonItemClick(AdapterViewparent,Viewview,intposition,longid){

Cursorcursor=(Cursor)parent.getItemAtPosition((int)position);

Toast.makeText(AndroidSQLite.this,cursor.getString(1),1).show();}});}}

14android多种布局

14.1view的布局显示概述

通过前面的学习我们知道:在一个Android应用程序中,用户界面通过View和ViewGroup对象构建。Android中有很多种View和ViewGroup,他们都继承自View类。View对象是Android平台上表示用户界面的基本单元。View的布局显示方式直接影响用户界面,View的布局方式是指一组View元素如何布局,准确的说是一个ViewGroup中包含的一些View怎么样布局。ViewGroup类是布局(layout)和视图容器(Viewcontainer)的基类,此类也定义了ViewGroup.LayoutParams类,它作为布局参数的基类,此类告诉父视图

其中的子视图想如何显示。例如,XML布局文件中名为layout_something的属性(参加上篇的4.2节)。我们要介绍的View的布局方式的类,都是直接或间接继承自ViewGroup类,如下图所示:

图1、继承自ViewGroup的一些布局类

其实,所有的布局方式都可以归类为ViewGroup的5个类别,即ViewGroup的5个直接子类。其它的一些布局都扩展自这5个类。下面分小节分别介绍View的七种布局显示方式。

14.2线性布局(LinearLayout)

线性布局:是一个ViewGroup以线性方向显示它的子视图(view)元素,即垂直地或水平地。之前我们的HelloWorld!程序中view的布局方式就是线性布局的,一定不陌生!如下所示res/layour/main.xml:

android:orientation="horizontal">

从上面可以看出根LinearLayout视图组(ViewGroup)包含5个Button,它的子元素是以线性方式(horizontal,水平的)布局,运行效果如下图所示:

图2、线性布局(水平或者说是横向)

如果你在android:orientation="horizontal"设置为vertical,则是是垂直或者说是纵向的,如下图所示:

图3、线性布局(垂直或者说是纵向)

14.2.1.12.1、Tips:android:layout_weight="1"

这个属性很关键,如果你没有显示设置它,它默认为0。把上面布局文件(水平显示的那个)中的这个属性都去掉,运行会得出如下结果:

图4、layout_weight属性

没有了这个属性,我们本来定义的5个Button运行后却只显示了2个Button,为什么呢??

"weight"顾名思义是权重的意思,layout_weight用于给一个线性布局中的诸多视图的重要程度赋值。所有的视图都有一个layout_weight值,默认为零,意思是需要显示多大的视图就占据多大的屏幕空间。这就不难解释为什么会造成上面的情况了:Button1~Button5都设置了layout_height和layout_width属性为wrap_content即包住文字内容,他们都没有设置layout_weight属性,即默认为0.,这样Button1和Button2根据需要的内容占据了整个屏幕,别的就显示不了啦!

若赋一个高于零的值,则将父视图中的可用空间分割,分割大小具体取决于每一个视图的layout_weight值以及该值在当前屏幕布局的整体layout_weight值和在其它视图屏幕布局的layout_weight值中所占的比率而定。举个例子:比如说我们在水平方向上有一个文本标签和两个文本编辑元素。该文本标签并无指定layout_weight值,所以它将占据需要提供的最少空间。如果两个文本编辑元素每一个的layout_weight值都设置为1,则两者平分在父视图布局剩余的宽度(因为我们声明这两者的重要度相等)。如果两个文本编辑元素其中第一个的layout_weight值设置为1,而第二个的设置为2,则剩余空间的三分之二分给第一个,三分之一分给第二个(数值越小,重要度越高)。

14.3相对布局(RelativeLayout)

相对布局:是一个ViewGroup以相对位置显示它的子视图(view)元素,一个视图可以指定相对于它的兄弟视图的位置(例如在给定视图的左边或者下面)或相对于RelativeLayout的特定区域的位置(例如

底部对齐,或中间偏左)。

相对布局是设计用户界面的有力工具,因为它消除了嵌套视图组。如果你发现你使用了多个嵌套的LinearLayout视图组后,你可以考虑使用一个RelativeLayout视图组了。看下面的res/layour/main.xml:

android:layout_width="fill_parent"android:layout_height="wrap_content"

android:background="@android:drawable/editbox_background"android:layout_below="@id/label"/>android:layout_marginLeft="10dip"android:text="OK"/>android:text="Cancel"/>

从上面的布局文件我们知道,RelativeLayout视图组包含一个TextView、一个EditView、两个Button,注意标记了(请注意运行代码的时候,请把这些注释去掉,否则会运行出错,上面加上是为了更加醒目!)的属性,在使用相对布局方式中就是使用这些类似的属性来定位视图到你想要的位置,它们的值是你参照的视图的id。这些属性的意思很简单,就是英文单词的直译,就不多做介绍了。运行之后,得如下结果:

图5、相对布局

14.4表格布局(TableLayout)

表格布局:是一个ViewGroup以表格显示它的子视图(view)元素,即行和列标识一个视图的位置。其实Android的表格布局跟HTML中的表格布局非常类似,TableRow就像HTML表格的标记。用表格布局需要知道以下几点:

android:shrinkColumns,对应的方法:setShrinkAllColumns(boolean),作用:设置表格的列是否收缩(列编号从0开始,下同),多列用逗号隔开(下同),如android:shrinkColumns="0,1,2",即表格的第1、2、3列的内容是收缩的以适合屏幕,不会挤出屏幕。

android:collapseColumns,对应的方法:setColumnCollapsed(int,boolean),作用:设置表格的列是否隐藏

android:stretchColumns,对应的方法:setStretchAllColumns(boolean),作用:设置表格的列是否拉伸

看下面的res/layour/main.xml:

运行之后可以得出下面的结果:

图6、表格布局

14.5列表视图(ListView)

列表布局:是一个ViewGroup以列表显示它的子视图(view)元素,列表是可滚动的列表。列表元素通过

ListAdapter自动插入到列表。

ListAdapter:扩展自Adapter,它是ListView和数据列表之间的桥梁。ListView可以显示任何包装

在ListAdapter中的数据。该类提供两个公有类型的抽象方法:1.2.

publicabstractbooleanareAllItemsEnabled():表示ListAdapter中的所有元素是否可激活的?如果返回真,即所有的元素是可选择的即可点击的。

publicabstractbooleanisEnabled(intposition):判断指定位置的元素是否可激活的?

下面通过一个例子来,创建一个可滚动的列表,并从一个字符串数组读取列表元素。当一个元素被选择时,显示该元素在列表中的位置的消息。

1)、首先,将res/layour/main.xml的内容置为如下:

这样就定义了元素在列表中的布局。

2)、src/skynet.com.cnblogs.文件的代码如下:

packageskynet.com.cnblogs.www;

importandroid.app.ListActivity;importandroid.os.Bundle;importandroid.view.View;

importandroid.widget.AdapterView;importandroid.widget.ArrayAdapter;importandroid.widget.ListView;importandroid.widget.TextView;importandroid.widget.Toast;

importandroid.widget.AdapterView.OnItemClickListener;

publicclassHelloWorldextendsListActivity{

//注意这里Helloworld类不是扩展自Acitvity,而是扩展自ListAcitivty/**Calledwhentheactivityisfirstcreated.*/@Override

publicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);

setListAdapter(newArrayAdapter(this,R.layout.main,COUNTRIES));

ListViewlv=getListView();lv.setTextFilterEnabled(true);

lv.setOnItemClickListener(newOnItemClickListener(){publicvoidonItemClick(AdapterViewparent,Viewview,intposition,longid){

//Whenclicked,showatoastwiththeTextViewtext

Toast.makeText(getApplicationContext(),((TextView)view).getText(),Toast.LENGTH_SHORT).show();}});}

staticfinalString[]COUNTRIES=newString[]{}

Note:onCreate()函数中并不像往常一样通过setContentView()为活动(Activity)加载布局文件,替代的是通过setListAdapter(ListAdapter)自动添加一个ListView填充整个屏幕的ListActivity。

"1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24"};

在此文件中这个方法以一个ArrayAdapter为参数:setListAdapter(newArrayAdapter(this,R.layout.main,COUNTRIES)),这个ArrayAdapter管理填入ListView中的列表元素。ArrayAdapter的构造函数的参数为:this(表示应用程序的上下文context)、表示ListViewde布局文件(这里是R.layout.main)、插入ListView的List对象对数组(这里是COUNTRES)。

setOnItemClickListener(OnItemClickListener)定义了每个元素的点击(on-click)的监听器,当ListView中的元素被点击时,onItemClick()方法被调用,在这里是即一个Toast消息每个元素的位置将显示。

3)、运行应用程序得如下结果(点击1之后,在下面显示了1):

图7、列表布局NOTE:如果你改了HelloWorldextendsListActivity而不是Activity之后,运行程序是提示:“ConversiontoDalvikformatfailedwitherror1”。可以这么解决:解决办法是Project>Clean...>Cleanprojectselectedbelow>Ok

14.5.1.15.1、一个小的改进

上面我们是把要填充到ListView中的元素硬编码到HelloWorld.java文件中,这样就缺乏灵活性!也不符合推荐的应用程序的界面与控制它行为的代码更好地分离的准则!

其实我们可以把要填充到ListView的元素写到res/values/strings.xml文件中的元素中,然后再源码中动态地读取。这样strings.xml的内容类似下面:

1234567

然而HelloWorld.java文件中的onCreate()函数,则这样动态访问这个数组及填充到ListVies:

String[]countries=getResources().getStringArray(R.array.countries_array);setListAdapter(newArrayAdapter(this,R.layout.list_item,countries));

14.5.1.25.2、补充说明

首先总结一下列表布局的关键部分:

布局文件中定义ListView

Adapter用来将数据填充到ListView

要填充到ListView的数据,这些数据可以字符串、图片、控件等等其中Adapter是ListView和数据源之间的桥梁,根据数据源的不同Adapter可以分为三类:

String[]:ArrayAdapter

List:SimpleAdapter数据库Cursor:SimpleCursorAdapter

使用ArrayAdapter(数组适配器)顾名思义,需要把数据放入一个数组以便显示,上面的例子就是这样的;SimpleAdapter能定义各种各样的布局出来,可以放上ImageView(图片),还可以放上Button(按钮),CheckBox(复选框)等等;SimpleCursorAdapter是和数据库有关的东西。篇幅有限后面两种就不举例实践了。你可以参考androidListView详解orArrayAdapter,SimpleAdapter,SimpleCursorAdapter区别。

14.6网格视图(GridView)

网格布局:是一个ViewGroup以网格显示它的子视图(view)元素,即二维的、滚动的网格。网格元素通过ListAdapter自动插入到网格。ListAdapter跟上面的列表布局是一样的,这里就不重复累述了。下面也通过一个例子来,创建一个显示图片缩略图的网格。当一个元素被选择时,显示该元素在列表中的位置的消息。

1)、首先,将上面实践截取的图片放入res/drawable/

2)、res/layour/main.xml的内容置为如下:这个GridView填满整个屏幕,而且它的属性都很好理解,按英文单词的意思就对了。

3)、然后,HelloWorld.java文件中onCreate()函数如下:publicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);

GridViewgridview=(GridView)findViewById(R.id.gridview);gridview.setAdapter(newImageAdapter(this));

gridview.setOnItemClickListener(newOnItemClickListener(){

publicvoidonItemClick(AdapterViewparent,Viewv,intposition,longid){

Toast.makeText(HelloWorld.this,""+position,Toast.LENGTH_SHORT).show();}});}

onCreate()函数跟通常一样,首先调用超类的onCreate()函数函数,然后通过setContentView()为活动(Activity)加载布局文件。紧接着是,通过GridView的id获取布局文件中的gridview,然后调用它的

setListAdapter(ListAdapter)函数填充它,它的参数是一个我们自定义的ImageAdapter。后面的工作

跟列表布局中一样,为监听网格中的元素被点击的事件而做的工作。4)、实现我们自定义ImageAdapter,新添加一个类文件,它的代码如下:

packageskynet.com.cnblogs.www;

importandroid.content.Context;importandroid.view.View;importandroid.view.ViewGroup;importandroid.widget.BaseAdapter;importandroid.widget.GridView;importandroid.widget.ImageView;

publicclassImageAdapterextendsBaseAdapter{privateContextmContext;

publicImageAdapter(Contextc){mContext=c;}

publicintgetCount(){returnmThumbIds.length;}

publicObjectgetItem(intposition){returnnull;}

publiclonggetItemId(intposition){return0;}

//createanewImageViewforeachitemreferencedbytheAdapterpublicViewgetView(intposition,ViewconvertView,ViewGroupparent){ImageViewimageView;

if(convertView==null){//ifit"snotrecycled,initializesomeattributes

imageView=newImageView(mContext);

imageView.setLayoutParams(newGridView.LayoutParams(85,85));imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);imageView.setPadding(8,8,8,8);}else{

imageView=(ImageView)convertView;}

imageView.setImageResource(mThumbIds[position]);returnimageView;}

//referencestoourimagesprivateInteger[]mThumbIds={

R.drawable.linearlayout1,R.drawable.linearlayout2,R.drawable.linearlayout3,R.drawable.listview,R.drawable.relativelayout,R.drawable.tablelayout};}

ImageAdapter类扩展自BaseAdapter,所以首先得实现它所要求必须实现的方法。构造函数和

getcount()函数很好理解,而getItem(int)应该返回实际对象在适配器中的特定位置,但是这里我们不需要。类似地,getItemId(int)应该返回元素的行号,但是这里也不需要。这里重点要介绍的是getView()方法,它为每个要添加到ImageAdapter的图片都创建了一个新的View。当调用这个方法时,一个View是循环再用的,因此要确认对象是否为空。如果是空的话,一个ImageView就被实例化且配置想要的显示属性:

setLayoutParams(ViewGroup.LayoutParams):设置View的高度和宽度,这确保不管drawable中图片的大小,每个图片都被重新设置大小且剪裁以适应这些尺寸。

setScaleType(ImageView.ScaleType):声明图片应该向中心剪裁(如果需要的话)。

setPadding(int,int,int,int):定义补距,如果图片有不同的横纵比,小的补距将导致更多的剪裁以适合设置的ImageView的高度和宽度。

如果View传到getView()不是空的,则本地的ImageView初始化时将循环再用View对象。在getView()方法末尾,position整数传入setImageResource()方法以从mThumbIds数组中选择图片。运行程序会得到如下结果(点击第一张图片之后):

图8、网格布局

14.6.1.17、绝对布局(AbsoluteLayout)

绝对布局:是一个ViewGroup以绝对方式显示它的子视图(view)元素,即以坐标的方式来定位在屏幕上位置。

这种布局方式很好理解,在布局文件或编程地设置View的坐标,从而绝对地定位。如下所示布局文件:

android:layout_x="20dip"android:layout_y="20dip">

简单吧,这里不在深入了!

14.7标签布局(TabLayout)

标签布局:是一个ViewGroup以标签的方式显示它的子视图(view)元素,就像在Firefox中的一个窗口中显示多个网页一样。

为了狂创建一个标签UI(tabbedUI),需要使用到TabHost和TabWidget。TabHost必须是布局的

根节点,它包含为了显示标签的TabWidget和显示标签内容的FrameLayout。

可以有两种方式实现标签内容:使用标签在同一个活动中交换视图、使用标签在完全隔离的活动之间改变。根据你的需要,选择不同的方式,但是如果每个标签提供不同的用户活动,为每个标签选择隔离的活动,因此你可以更好地以分离的组管理应用程序,而不是一个巨大的应用程序和布局。下面还有一个例子来创建一个标签UI,每个标签使用隔离的活动。

1)、在项目中建立三个隔离的Activity类:ArtistisActivity、AlbumActivity、SongActivity。它们每个表示一个分隔的标签。每个通过TextView显示简单的一个消息,例如:

publicclassArtistsActivityextendsActivity{publicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);

TextViewtextview=newTextView(this);textview.setText("ThisistheArtiststab");setContentView(textview);}}

其它两个类也类似。

友情提示:本文中关于《android软件开发工程师转正个人总结》给出的范例仅供您参考拓展思维使用,android软件开发工程师转正个人总结:该篇文章建议您自主创作。

  来源:网络整理 免责声明:本文仅限学习分享,如产生版权问题,请联系我们及时删除。


android软件开发工程师转正个人总结
由互联网用户整理提供,转载分享请保留原作者信息,谢谢!
http://m.bsmz.net/gongwen/547709.html
相关阅读
最近更新
推荐专题