国产精品色无码视频,国产av毛片影院精品资源,亚洲人成网站77777·c0m,囯产av无码片毛片一级,夜夜操www99视频,美女白嫩胸交在线观看,亚洲a毛片性生活

薈聚奇文、博采眾長(zhǎng)、見賢思齊
當(dāng)前位置:公文素材庫 > 計(jì)劃總結(jié) > 工作總結(jié) > android軟件開發(fā)工程師轉(zhuǎn)正個(gè)人總結(jié)

android軟件開發(fā)工程師轉(zhuǎn)正個(gè)人總結(jié)

網(wǎng)站:公文素材庫 | 時(shí)間:2019-05-28 07:41:00 | 移動(dòng)端:android軟件開發(fā)工程師轉(zhuǎn)正個(gè)人總結(jié)

android軟件開發(fā)工程師轉(zhuǎn)正個(gè)人總結(jié)

個(gè)人總結(jié)

我于201*年8月13日進(jìn)入公司,根據(jù)公司的需要,目前擔(dān)任Android軟件工程師一職,負(fù)責(zé)綜合代維,考務(wù)通手機(jī)客戶端的開發(fā)工作。將近3個(gè)月的時(shí)候在這個(gè)新的工作環(huán)境我收獲頗深。開始讓我獨(dú)立完成整個(gè)項(xiàng)目,這還是我的第一次,之前在公司是多人完成,過程中也遇到了許多困難,但是都一一解決了,我想這是我最寶貴的經(jīng)歷,通過三個(gè)月的不斷學(xué)習(xí),在項(xiàng)目開發(fā)中的不斷鍛煉以及同事、領(lǐng)導(dǎo)的幫助,我已逐漸融入這個(gè)大家庭,個(gè)人的工作技能也有了明顯的提高,雖然仍有一些不足,但三個(gè)月以來我付出了不少,也收獲了不少,我感覺自己成長(zhǎng)了,也逐漸成熟了。

初到公司,加入了咨詢與信息化部,加入了綜合代維項(xiàng)目組,我也曾擔(dān)心自己不知道該怎么與項(xiàng)目組的同事溝通,擔(dān)心不知道怎么做好工作,但是項(xiàng)目組的前輩們都很親切,也很耐心的教導(dǎo)我,解答我的疑問,以及他們團(tuán)結(jié)向上的精神,讓我很快的熟悉了工作,融入了項(xiàng)目組。

在這三個(gè)月的學(xué)習(xí)和工作中,我一直嚴(yán)格要求自己,遵循公司的規(guī)章制度,認(rèn)真完成領(lǐng)導(dǎo)布置的每一項(xiàng)任務(wù),遇到的問題虛心的向項(xiàng)目組的前輩們學(xué)習(xí)、請(qǐng)教,不斷的提高、充實(shí)自己。開發(fā)過程中出現(xiàn)的一些差錯(cuò),也有前輩們耐心的指出和指導(dǎo)我修改,這些經(jīng)歷讓我不斷成熟,處理問題時(shí)考慮得更全面,杜絕類似情況的發(fā)生。在此我要特地感謝部門的領(lǐng)導(dǎo)和同事們對(duì)我的指引和幫助,感謝他們對(duì)我工作上失誤的提醒和指正。

經(jīng)過這三個(gè)月,我已經(jīng)能獨(dú)立進(jìn)行開發(fā)任務(wù),按時(shí)按質(zhì)的完成分配的工作任務(wù),當(dāng)然還有許多不足,開發(fā)的經(jīng)驗(yàn)仍有待提高,編寫代碼的簡(jiǎn)潔性和完整性也需要進(jìn)一步增強(qiáng),需要不斷的繼續(xù)學(xué)習(xí)以提高自己的工作能力。

總之,這三個(gè)月來我學(xué)到了很多,感悟了很多;看到公司的迅速發(fā)展,看到部門的同事越來越多,我深深地感到驕傲和自豪,也更加迫切的希望以一名正式員工的身份在這里工作,實(shí)現(xiàn)自己的奮斗目標(biāo),體現(xiàn)自己的人生價(jià)值,和公司一起成長(zhǎng)。

我會(huì)用謙虛的態(tài)度和飽滿的熱情做好我的本職工作,為公司創(chuàng)造價(jià)值,同公司一起展望美好的未來!

XX

201*年11月13日

擴(kuò)展閱讀:android開發(fā)基礎(chǔ)-個(gè)人總結(jié)版

Android文檔

Android文檔..............................................................................................................................................................11自定義控件.........................................................................................................................................................2

1.1第一種添加屬性的方法,之前我也是經(jīng)常使用這種寫法,代碼如下:.........................................21.2下面是第二為VIEW注冊(cè)屬性的寫法................................................................................................32Button..................................................................................................................................................................9

2.1單擊事件寫法.........................................................................................................................................92.2Button居中方法.....................................................................................................................................9

2.2.1[圖片]運(yùn)行結(jié)果......................................................................................................................102.2.2[代碼]簡(jiǎn)單說明......................................................................................................................10

3EditText屬性...................................................................................................................................................104設(shè)置橫豎屏去掉狀態(tài)欄..................................................................................................................................115GridView網(wǎng)格布局.........................................................................................................................................126登錄界面的混合布局.......................................................................................................................................147萬能android調(diào)用webservices方法xml.......................................................................................................168Android調(diào)用webservices................................................................................................................................189editText的監(jiān)聽事件change...........................................................................................................................1910輕量級(jí)數(shù)據(jù)庫的存儲(chǔ)和取值...................................................................................................................201*Android數(shù)據(jù)庫的使用...................................................................................................................................201*連接webServices未成功........................................................................................................................2313數(shù)據(jù)庫操作,包括分頁...........................................................................................................................2414android多種布局.....................................................................................................................................32

14.1view的布局顯示概述..........................................................................................................................3214.2線性布局(LinearLayout).............................................................................................................3314.3相對(duì)布局(RelativeLayout)..........................................................................................................3714.4表格布局(TableLayout)...............................................................................................................3914.5列表視圖(ListView)....................................................................................................................4114.6網(wǎng)格視圖(GridView)...................................................................................................................4514.7標(biāo)簽布局(TabLayout).................................................................................................................5015AndroidManifest.xml中的一些配置.......................................................................................................5416重力感應(yīng)編程...........................................................................................................................................5517Android問價(jià)的壓縮與解壓...................................................................................................................5618List詳解...................................................................................................................................................6119自定義帶有圖標(biāo)的文件管理器...............................................................................................................1自定義控件

1.1

第一種添加屬性的方法,之前我也是經(jīng)常使用這種寫法,代碼如下:

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);}}

這種寫法,簡(jiǎn)單明了,不需要額外XML的配置,就可以在我們的VIEW文件下使用。

以上代碼通過構(gòu)造函數(shù)中引入的AttributeSet去查找XML布局的屬性名稱,然后找到它對(duì)應(yīng)引用的資源ID去找值。使用也時(shí)分方便。所以一直以來我也是很喜歡這種寫法。如上,自定好VIEW文件就可以在XML布局下如此使用:

好了,這是第一種為VIEW注冊(cè)屬性的寫法,比較簡(jiǎn)單就不多介紹。

1.2下面是第二為VIEW注冊(cè)屬性的寫法

,這里也要重點(diǎn)說說第二種注冊(cè)屬性的寫法和使用要點(diǎn),先看一下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();}}如上代碼,跟前面代碼一樣。還是用的一個(gè)EDITTEXT和TEXTVIEW做基礎(chǔ)組件。下面我們一步步分析上面的代碼:

R.styleable.EditTextExt代碼的是一個(gè)attrs指向的一個(gè)declare-styleable的標(biāo)簽,如下代碼:

這個(gè)文件位于,values下的attrs.xml目錄下面,我比較喜歡一個(gè)自定義View對(duì)應(yīng)一個(gè)declare-styleable標(biāo)簽。

Tip:一個(gè)自定義View第一部分的代碼,

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

指定為一個(gè)declare-styleable,而在declare-styleable下的attr(即各屬性)Android的ADT將會(huì)自動(dòng)生成為declare-styleable的name名字加上“_”加上對(duì)應(yīng)attr(即屬性名稱)的名稱,如上

(EditTextExt_Text)我們要得到Text就需要R.styleable.EditTextExt_Text,這一點(diǎn)的話可以看看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布局如何使用呢?這個(gè)會(huì)跟Android提供的基礎(chǔ)組件的使用方法是一致的。首先,我們要為其提供一個(gè)引用包名如下:

xmlns:android=""

xmlns:terry=""

上面提供的是android基礎(chǔ)組件的包名,和我們自己組件的包名。

寫好了包名。就可以像使用andriod基礎(chǔ)組件一樣使用了,如下全部XML布局源碼:

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

運(yùn)行效果如下:

這是這兩種為Android注冊(cè)屬性的使用方法,那么兩者有什么區(qū)別呢?在這里我認(rèn)為起碼有五點(diǎn),大家可以找找看還有什么區(qū)別:

第二種可以編譯時(shí)報(bào)錯(cuò),如果編程人員隨便輸入什么第一種是不會(huì)報(bào)錯(cuò)的,第二種可以支持代碼檢測(cè)功能。

第二種寫法,跟Android屬性標(biāo)準(zhǔn)寫法是一致的,而且可以統(tǒng)一書法規(guī)則。

第二種寫法,可以支持?jǐn)?shù)據(jù)格式的驗(yàn)證,比如我們?cè)赼ttrs上注明只支持integer那么就不可以使用字符串,這是第一種達(dá)不到的。

第二種寫法,可以為VIEW提供選擇操作,比如如上我們使用的ENUM讓VIEW對(duì)應(yīng)的屬性支持ENUM列表,或者為其提供BOOL等只有雙項(xiàng)選擇的操作。

第一種寫法,所有的屬性必須是引用自資源(不大確定,如果朋友有什么好的DEMO麻煩共享),第二種寫法,可以即支持引用資源又可以直接輸入做操作,為編程帶來更多的方便性。

種種都說明,第二種寫法更具規(guī)范性,功能更性,代碼編寫也更優(yōu)雅,但個(gè)人有個(gè)人的使用習(xí)慣,我兩種都喜歡用,具體看需求吧。呵呵。。。

2Button

2.1單擊事件寫法

也可以指定多個(gè)OnClickListener或其他類型的事件,那就看看是否需要了。以上幾個(gè)代碼也可以寫成以下格式:

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[圖片]運(yùn)行結(jié)果

2.2.2[代碼]簡(jiǎn)單說明

1可以看到Button與Gallery的對(duì)齊方式是居中對(duì)齊,也即Button與Parent居中對(duì)齊。2另外,

3Android:gravity="CENTER_VERTICAL“:這個(gè)是垂直居中對(duì)齊4Android:gravity="BOTTOM”:放在容器的底部5Android:gravity="CENTER“:放在容器的中心

3EditText屬性

Android中的EditText數(shù)據(jù)編輯框,相當(dāng)于C#中的TextBox。剛開始接觸時(shí)容易和TextView組件混淆,分不清那個(gè)是顯示,那個(gè)是編輯,至少我就犯了這個(gè)錯(cuò)誤。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,不用說了,組件的唯一標(biāo)識(shí)。

android:layout_width\\android:layout_height:寬度與高度,所有的android組件都是這么指定。參見Button說明。

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

android:paddingRight:與右側(cè)空白大小。當(dāng)然,還是paddingLeft、paddingTop、paddingButton和paddingAll。

除了上面這些,如果要指定EditText為Password輸入框,可用android:password=”true”進(jìn)行聲明。

另外還有在用戶輸入體驗(yàn)上的標(biāo)簽,不會(huì)影響程序的運(yùn)行,但會(huì)給用戶輸入帶來很好的體驗(yàn),如只需要輸入電話號(hào)碼或都數(shù)字等。

android:phoneNumber="true":系統(tǒng)只會(huì)打開電話輸鍵盤(電話號(hào)碼不可用鍵不會(huì)顯示.android:numeric="integer|signed|decimal":系統(tǒng)只會(huì)打開數(shù)據(jù)鍵盤(三值可選一)。

4設(shè)置橫豎屏去掉狀態(tài)欄

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

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE););//強(qiáng)制為橫屏

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//豎屏

我做的東西里面還用到了去掉標(biāo)題欄。我也貼出來

requestWindowFeature(Window.FEATURE_NO_TITLE);5GridView網(wǎng)格布局

[功能]

以前提及過GridView說也是一種AdapterView和ListView有點(diǎn)像今天花了時(shí)間用了一些有點(diǎn)心得和大家分享分享[思路]

1.既然和ListView像那么應(yīng)該還是通過setAdapter()來設(shè)置吧

2.因?yàn)槲蚁腼@示的是一些圖片信息必須用到ImageView不是默認(rèn)的Adapter用到的TextView所以只能自己擴(kuò)展了[代碼]

1.定義包含GridView的main.xmkJava代碼

1.2.7.14.這行應(yīng)該注意一下:Java代碼

1.android:numColumns="3"用來設(shè)定GridView每行顯示的View數(shù)目如果沒有這行會(huì)默認(rèn)每行顯示一個(gè)View和ListView的一樣

2.自定義classImageListextendsBaseAdapter其中主要是:寫道

ViewgetView(intposition,ViewconvertView,ViewGroupparent)

用于顯示目標(biāo)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);

所以最后效果圖是這樣的網(wǎng)格布局

6登錄界面的混合布局

開發(fā)UI時(shí),通常是先設(shè)計(jì)布局,具體怎么創(chuàng)建布局文件見上篇,本篇主要講如何做登陸窗口的布局,新建布局XML文件默認(rèn)有一個(gè)LinearLayout布局對(duì)象和TextView對(duì)象,我們把TextView刪除,LinearLayout是線性布局,可以橫向或縱向線性排列里面的對(duì)象,在里面我們放個(gè)RelativeLayout對(duì)象,該對(duì)象是個(gè)相對(duì)布局對(duì)象,可以居中子對(duì)象,RelativeLayout對(duì)象里面再放LinearLayout對(duì)象,默認(rèn)是橫向線性排列子對(duì)象,這個(gè)LinearLayout里面再放入TextView、Button等,這樣通過布局對(duì)象我們可以比較規(guī)則的布局登陸控件了,具體代碼和效果圖如下:

android:orientation="vertical"//縱向線性排列子對(duì)象

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

//設(shè)置高度

android:layout_height="wrap_content">

我們可以可視化的添加Layouts布局對(duì)象和Views對(duì)象,選中對(duì)象后在Properties選項(xiàng)卡可設(shè)置屬性值,如圖。

當(dāng)然可以切換到代碼模式添加對(duì)象或設(shè)置屬性值,就像asp.net的aspx文件可以在design下設(shè)計(jì)也可在source下設(shè)計(jì),不過Ophone沒有split模式。另外布局對(duì)象的RelativeLayout相對(duì)定位布局和AbsoluteLayout絕對(duì)定位布局,有點(diǎn)像css中的position定位中的relative和absolute。

7萬能android調(diào)用webservices方法xml

關(guān)鍵代碼:try{

//發(fā)帖機(jī)原理,模擬瀏覽器

finalStringSERVER_URL="";//定義需要獲取的內(nèi)容來源地址

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()

+"";//發(fā)送

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的返回值,但是那是一個(gè)完整的xml,需要進(jìn)一步解析從而得到想要的結(jié)果解析的方法如下所示:

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

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

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

9editText的監(jiān)聽事件change

/**

*edittext的監(jiān)聽事件*/

privateTextWatcherwatcher=newTextWatcher(){

@Override

publicvoidafterTextChanged(Editables){//TODOAuto-generatedmethodstub}

@Override

publicvoidbeforeTextChanged(CharSequences,intstart,intcount,intafter){

//TODOAuto-generatedmethodstub}

@Override

publicvoidonTextChanged(CharSequences,intstart,intbefore,intcount){

//編輯內(nèi)容

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

};

10輕量級(jí)數(shù)據(jù)庫的存儲(chǔ)和取值

publicstaticfinalStringPREFS_NAME=“輕量級(jí)數(shù)據(jù)庫的名字”;/**

記錄用戶名和密碼*/

publicvoidsaveUsers(){

SharedPreferencessettings=getSharedPreferences(PREFS_NAME,0);//指定要使//獲取編輯器

SharedPreferences.Editoreditor=settings.edit();

用的數(shù)據(jù)庫

//存入數(shù)據(jù)(鍵值的形式)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數(shù)據(jù)庫的使用

Activites可以通過ContentProvider或者Service訪問一個(gè)數(shù)據(jù)庫。下面會(huì)詳細(xì)講解如果創(chuàng)建數(shù)據(jù)庫,添加數(shù)據(jù)和查詢數(shù)據(jù)庫。

創(chuàng)建數(shù)據(jù)庫Android不自動(dòng)提供數(shù)據(jù)庫。在Android應(yīng)用程序中使用SQLite,必須自己創(chuàng)建數(shù)據(jù)庫,然后創(chuàng)建表、索引,填充數(shù)據(jù)。Android提供了SQLiteOpenHelper幫助你創(chuàng)建一個(gè)數(shù)據(jù)庫,你只要繼承

SQLiteOpenHelper類,就可以輕松的創(chuàng)建數(shù)據(jù)庫。SQLiteOpenHelper類根據(jù)開發(fā)應(yīng)用程序的需要,封裝了創(chuàng)建和更新數(shù)據(jù)庫使用的邏輯。SQLiteOpenHelper的子類,至少需要實(shí)現(xiàn)三個(gè)方法:

構(gòu)造函數(shù),調(diào)用父類SQLiteOpenHelper的構(gòu)造函數(shù)。這個(gè)方法需要四個(gè)參數(shù):上下文環(huán)境(例

如,一個(gè)Activity),數(shù)據(jù)庫名字,一個(gè)可選的游標(biāo)工廠(通常是Null),一個(gè)代表你正在使用的數(shù)據(jù)庫模型版本的整數(shù)。

onCreate()方法,它需要一個(gè)SQLiteDatabase對(duì)象作為參數(shù),根據(jù)需要對(duì)這個(gè)對(duì)象填充表和

初始化數(shù)據(jù)。

onUpgrage()方法,它需要三個(gè)參數(shù),一個(gè)SQLiteDatabase對(duì)象,一個(gè)舊的版本號(hào)和一個(gè)新的

版本號(hào),這樣你就可以清楚如何把一個(gè)數(shù)據(jù)庫從舊的模型轉(zhuǎn)變到新的模型。

下面示例代碼展示了如何繼承SQLiteOpenHelper創(chuàng)建數(shù)據(jù)庫:publicclassDatabaseHelperextendsSQLiteOpenHelper{DatabaseHelper(Contextcontext,Stringname,CursorFactorycursorFactory,intversion){super(context,name,cursorFactory,version);}@OverridepublicvoidonCreate(SQLiteDatabasedb){//TODO創(chuàng)建數(shù)據(jù)庫后,對(duì)數(shù)據(jù)庫的操作}@OverridepublicvoidonUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion){//TODO更改數(shù)據(jù)庫版本的操作}@OverridepublicvoidonOpen(SQLiteDatabasedb){super.onOpen(db);//TODO每次成功打開數(shù)據(jù)庫后首先被執(zhí)行}}接下來討論具體如何創(chuàng)建表、插入數(shù)據(jù)、刪除表等等。調(diào)用getReadableDatabase()或

getWriteableDatabase()方法,你可以得到SQLiteDatabase實(shí)例,具體調(diào)用那個(gè)方法,取決于你是否需要改變數(shù)據(jù)庫的內(nèi)容:

db=(newDatabaseHelper(getContext())).getWritableDatabase();return(db==null)?false:true;上面這段代碼會(huì)返回一個(gè)SQLiteDatabase類的實(shí)例,使用這個(gè)對(duì)象,你就可以查詢或者修改數(shù)據(jù)庫。當(dāng)你完成了對(duì)數(shù)據(jù)庫的操作(例如你的Activity已經(jīng)關(guān)閉),需要調(diào)用SQLiteDatabase的Close()方法來釋放掉數(shù)據(jù)庫連接。

創(chuàng)建表和索引

為了創(chuàng)建表和索引,需要調(diào)用SQLiteDatabase的execSQL()方法來執(zhí)行DDL語句。如果沒有異常,這個(gè)方法沒有返回值。

例如,你可以執(zhí)行如下代碼:db.execSQL("CREATETABLEmytable(_idINTEGERPRIMARYKEYAUTOINCREMENT,titleTEXT,valueREAL);");這條語句會(huì)創(chuàng)建一個(gè)名為mytable的表,表有一個(gè)列名為_id,并且是主鍵,這列的值是會(huì)自動(dòng)增長(zhǎng)的整數(shù)(例如,當(dāng)你插入一行時(shí),SQLite會(huì)給這列自動(dòng)賦值),另外還有兩列:title(字符)和value(浮點(diǎn)數(shù))。SQLite會(huì)自動(dòng)為主鍵列創(chuàng)建索引。

通常情況下,第一次創(chuàng)建數(shù)據(jù)庫時(shí)創(chuàng)建了表和索引。如果你不需要改變表的schema,不需要?jiǎng)h除表和索引.刪除表和索引,需要使用execSQL()方法調(diào)用DROPINDEX和DROPTABLE語句。

給表添加數(shù)據(jù)

上面的代碼,已經(jīng)創(chuàng)建了數(shù)據(jù)庫和表,現(xiàn)在需要給表添加數(shù)據(jù)。有兩種方法可以給表添加數(shù)據(jù)。

像上面創(chuàng)建表一樣,你可以使用execSQL()方法執(zhí)行INSERT,UPDATE,DELETE等語句來更新表的數(shù)據(jù)。execSQL()方法適用于所有不返回結(jié)果的SQL語句。例如:

db.execSQL("INSERTINTOwidgets(name,inventory)"+"VALUES("Sprocket",5)");另一種方法是使用SQLiteDatabase對(duì)象的insert(),update(),delete()方法。這些方法把SQL語句的一部分作為參數(shù)。示例如下:

ContentValuescv=newContentValues();cv.put(Constants.TITLE,"exampletitle");cv.put(Constants.VALUE,SensorManager.GRAVITY_DEATH_STAR_I);db.insert("mytable",getNullColumnHack(),cv);update()方法有四個(gè)參數(shù),分別是表名,表示列名和值的ContentValues對(duì)象,可選的WHERE條件和可選的填充WHERE語句的字符串,這些字符串會(huì)替換WHERE條件中的“?”標(biāo)記。update()根據(jù)條件,更新指定列的值,所以用execSQL()方法可以達(dá)到同樣的目的。WHERE條件和其參數(shù)和用過的其他SQLAPIs類似。例如:String[]parms=newString[]{"thisisastring"};db.update("widgets",replacements,"name=?",parms);delete()方法的使用和update()類似,使用表名,可選的WHERE條件和相應(yīng)的填充WHERE條件的字符串。

查詢數(shù)據(jù)庫

類似INSERT,UPDATE,DELETE,有兩種方法使用SELECT從SQLite數(shù)據(jù)庫檢索數(shù)據(jù)。1.使用rawQuery()直接調(diào)用SELECT語句;使用query()方法構(gòu)建一個(gè)查詢。

RawQueries

正如API名字,rawQuery()是最簡(jiǎn)單的解決方法。通過這個(gè)方法你就可以調(diào)用SQLSELECT語句。例如:

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

在上面例子中,我們查詢SQLite系統(tǒng)表(sqlite_master)檢查table表是否存在。返回值是一個(gè)cursor對(duì)象,這個(gè)對(duì)象的方法可以迭代查詢結(jié)果。

如果查詢是動(dòng)態(tài)的,使用這個(gè)方法就會(huì)非常復(fù)雜。例如,當(dāng)你需要查詢的列在程序編譯的時(shí)候不能確定,這時(shí)候使用query()方法會(huì)方便很多。RegularQueries

query()方法用SELECT語句段構(gòu)建查詢。SELECT語句內(nèi)容作為query()方法的參數(shù),比如:要查詢的表名,要獲取的字段名,WHERE條件,包含可選的位置參數(shù),去替代WHERE條件中位置參數(shù)的值,GROUPBY條件,HAVING條件。

除了表名,其他參數(shù)可以是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數(shù)據(jù)庫操作,包括分頁

1.創(chuàng)建Android工程Projectname:AndroidSQLiteBuildTarget:Android2.1

Applicationname:SQLite嵌入式數(shù)據(jù)庫Packagename:com.changcheng.sqliteCreateActivity:AndroidSQLiteMinSDKVersion:72.Contact實(shí)體

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類。我們需要?jiǎng)?chuàng)建數(shù)據(jù)表,必須重寫onCreate(更新時(shí)重寫onUpgrade方法)方法,在這個(gè)方法中創(chuàng)建數(shù)據(jù)表。packagecom.changcheng.sqlite;importandroid.content.Context;

importandroid.database.sqlite.SQLiteDatabase;importandroid.database.sqlite.SQLiteOpenHelper;publicclassMyOpenHelperextendsSQLiteOpenHelper{privatestaticfinalStringname="contants";//數(shù)據(jù)庫名稱privatestaticfinalintversion=1;//數(shù)據(jù)庫版本publicMyOpenHelper(Contextcontext){/**

*CursorFactory指定在執(zhí)行查詢時(shí)獲得一個(gè)游標(biāo)實(shí)例的工廠類。設(shè)置為null,則使用系統(tǒng)默認(rèn)的工廠類。*/

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

@Override

publicvoidonCreate(SQLiteDatabasedb){

//創(chuàng)建contacts表,SQL表達(dá)式時(shí)提供的字段類型和長(zhǎng)度僅為提高代碼的可讀性。db.execSQL("CREATETABLEIFNOTEXISTScontacts("+"_idintegerprimarykeyautoincrement,"+"namevarchar(20),"+"phonevarchar(50))");}

@Override

publicvoidonUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion){//僅演示用,所以先刪除表然后再創(chuàng)建。

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

4.編寫ContactsService類

ContactsService類主要實(shí)現(xiàn)對(duì)業(yè)務(wù)邏輯和數(shù)據(jù)庫的操作。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);}/**

*獲取記錄數(shù)量*

*@return*/

publiclonggetCount(){

Stringsql="SELECTcount(*)FROMcontacts";

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

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

*獲取分頁數(shù)據(jù)*

*@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;}/***獲取分頁數(shù)據(jù),提供給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.編寫測(cè)試類

編寫一個(gè)針對(duì)ContactsService的測(cè)試類,測(cè)試ContactsService類中的各個(gè)方法是否正確。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";//測(cè)試創(chuàng)建表

publicvoidtestCreateTable()throwsThrowable{

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

//測(cè)試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);}//測(cè)試find

publicvoidtestFind()throwsThrowable{

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

//測(cè)試update

publicvoidtestUpdate()throwsThrowable{

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

//測(cè)試getCount

publicvoidtestGetCount()throwsThrowable{

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

//測(cè)試getScrollData

publicvoidtestGetScrollData()throwsThrowable{

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

//測(cè)試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());}}}

啟用測(cè)試功能,不要忘記在AndroidManifest.xml文件中加入測(cè)試環(huán)境。為application元素添加一個(gè)子元素:,為application元素添加一個(gè)兄弟元素:。

SQLite數(shù)據(jù)庫以單個(gè)文件存儲(chǔ),就像微軟的Access數(shù)據(jù)庫。有一個(gè)查看SQLite數(shù)據(jù)庫文件的工具SQLiteDeveloper,我們可以使用它來查看數(shù)據(jù)庫。Android將創(chuàng)建的數(shù)據(jù)庫存放在”/data/data/com.changcheng.sqlite/databases/contacts”,我們將它導(dǎo)出然后使用SQLiteDeveloper打開。6.分頁顯示數(shù)據(jù)

我們?cè)贑ontactsService類中,提供了一個(gè)獲取分頁數(shù)據(jù)的方法。我們將調(diào)用它獲取的數(shù)據(jù),使用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所在目錄里添加一個(gè)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);//獲取分頁數(shù)據(jù)

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

ListViewlv=(ListView)this.findViewById(R.id.listView);//生成List>數(shù)據(jù)

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});//設(shè)置ListView適配器lv.setAdapter(adapter);//為L(zhǎng)istView添加事件

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();}});}}

上面編寫的分頁顯示數(shù)據(jù)比較麻煩,Android為我們提供了一個(gè)SimpleCursorAdapter類。使用它可以方便的顯示分頁數(shù)據(jù)。將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);//獲取分頁數(shù)據(jù)

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

ListViewlv=(ListView)this.findViewById(R.id.listView);//創(chuàng)建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});//設(shè)置ListView適配器lv.setAdapter(adapter);//為L(zhǎng)istView添加事件

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的布局顯示概述

通過前面的學(xué)習(xí)我們知道:在一個(gè)Android應(yīng)用程序中,用戶界面通過View和ViewGroup對(duì)象構(gòu)建。Android中有很多種View和ViewGroup,他們都繼承自View類。View對(duì)象是Android平臺(tái)上表示用戶界面的基本單元。View的布局顯示方式直接影響用戶界面,View的布局方式是指一組View元素如何布局,準(zhǔn)確的說是一個(gè)ViewGroup中包含的一些View怎么樣布局。ViewGroup類是布局(layout)和視圖容器(Viewcontainer)的基類,此類也定義了ViewGroup.LayoutParams類,它作為布局參數(shù)的基類,此類告訴父視圖

其中的子視圖想如何顯示。例如,XML布局文件中名為layout_something的屬性(參加上篇的4.2節(jié))。我們要介紹的View的布局方式的類,都是直接或間接繼承自ViewGroup類,如下圖所示:

圖1、繼承自ViewGroup的一些布局類

其實(shí),所有的布局方式都可以歸類為ViewGroup的5個(gè)類別,即ViewGroup的5個(gè)直接子類。其它的一些布局都擴(kuò)展自這5個(gè)類。下面分小節(jié)分別介紹View的七種布局顯示方式。

14.2線性布局(LinearLayout)

線性布局:是一個(gè)ViewGroup以線性方向顯示它的子視圖(view)元素,即垂直地或水平地。之前我們的HelloWorld!程序中view的布局方式就是線性布局的,一定不陌生!如下所示res/layour/main.xml:

android:orientation="horizontal">

從上面可以看出根LinearLayout視圖組(ViewGroup)包含5個(gè)Button,它的子元素是以線性方式(horizontal,水平的)布局,運(yùn)行效果如下圖所示:

圖2、線性布局(水平或者說是橫向)

如果你在android:orientation="horizontal"設(shè)置為vertical,則是是垂直或者說是縱向的,如下圖所示:

圖3、線性布局(垂直或者說是縱向)

14.2.1.12.1、Tips:android:layout_weight="1"

這個(gè)屬性很關(guān)鍵,如果你沒有顯示設(shè)置它,它默認(rèn)為0。把上面布局文件(水平顯示的那個(gè))中的這個(gè)屬性都去掉,運(yùn)行會(huì)得出如下結(jié)果:

圖4、layout_weight屬性

沒有了這個(gè)屬性,我們本來定義的5個(gè)Button運(yùn)行后卻只顯示了2個(gè)Button,為什么呢??

"weight"顧名思義是權(quán)重的意思,layout_weight用于給一個(gè)線性布局中的諸多視圖的重要程度賦值。所有的視圖都有一個(gè)layout_weight值,默認(rèn)為零,意思是需要顯示多大的視圖就占據(jù)多大的屏幕空間。這就不難解釋為什么會(huì)造成上面的情況了:Button1~Button5都設(shè)置了layout_height和layout_width屬性為wrap_content即包住文字內(nèi)容,他們都沒有設(shè)置layout_weight屬性,即默認(rèn)為0.,這樣Button1和Button2根據(jù)需要的內(nèi)容占據(jù)了整個(gè)屏幕,別的就顯示不了啦!

若賦一個(gè)高于零的值,則將父視圖中的可用空間分割,分割大小具體取決于每一個(gè)視圖的layout_weight值以及該值在當(dāng)前屏幕布局的整體layout_weight值和在其它視圖屏幕布局的layout_weight值中所占的比率而定。舉個(gè)例子:比如說我們?cè)谒椒较蛏嫌幸粋(gè)文本標(biāo)簽和兩個(gè)文本編輯元素。該文本標(biāo)簽并無指定layout_weight值,所以它將占據(jù)需要提供的最少空間。如果兩個(gè)文本編輯元素每一個(gè)的layout_weight值都設(shè)置為1,則兩者平分在父視圖布局剩余的寬度(因?yàn)槲覀兟暶鬟@兩者的重要度相等)。如果兩個(gè)文本編輯元素其中第一個(gè)的layout_weight值設(shè)置為1,而第二個(gè)的設(shè)置為2,則剩余空間的三分之二分給第一個(gè),三分之一分給第二個(gè)(數(shù)值越小,重要度越高)。

14.3相對(duì)布局(RelativeLayout)

相對(duì)布局:是一個(gè)ViewGroup以相對(duì)位置顯示它的子視圖(view)元素,一個(gè)視圖可以指定相對(duì)于它的兄弟視圖的位置(例如在給定視圖的左邊或者下面)或相對(duì)于RelativeLayout的特定區(qū)域的位置(例如

底部對(duì)齊,或中間偏左)。

相對(duì)布局是設(shè)計(jì)用戶界面的有力工具,因?yàn)樗饲短滓晥D組。如果你發(fā)現(xiàn)你使用了多個(gè)嵌套的LinearLayout視圖組后,你可以考慮使用一個(gè)RelativeLayout視圖組了?聪旅娴膔es/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視圖組包含一個(gè)TextView、一個(gè)EditView、兩個(gè)Button,注意標(biāo)記了(請(qǐng)注意運(yùn)行代碼的時(shí)候,請(qǐng)把這些注釋去掉,否則會(huì)運(yùn)行出錯(cuò),上面加上是為了更加醒目。┑膶傩,在使用相對(duì)布局方式中就是使用這些類似的屬性來定位視圖到你想要的位置,它們的值是你參照的視圖的id。這些屬性的意思很簡(jiǎn)單,就是英文單詞的直譯,就不多做介紹了。運(yùn)行之后,得如下結(jié)果:

圖5、相對(duì)布局

14.4表格布局(TableLayout)

表格布局:是一個(gè)ViewGroup以表格顯示它的子視圖(view)元素,即行和列標(biāo)識(shí)一個(gè)視圖的位置。其實(shí)Android的表格布局跟HTML中的表格布局非常類似,TableRow就像HTML表格的標(biāo)記。用表格布局需要知道以下幾點(diǎn):

android:shrinkColumns,對(duì)應(yīng)的方法:setShrinkAllColumns(boolean),作用:設(shè)置表格的列是否收縮(列編號(hào)從0開始,下同),多列用逗號(hào)隔開(下同),如android:shrinkColumns="0,1,2",即表格的第1、2、3列的內(nèi)容是收縮的以適合屏幕,不會(huì)擠出屏幕。

android:collapseColumns,對(duì)應(yīng)的方法:setColumnCollapsed(int,boolean),作用:設(shè)置表格的列是否隱藏

android:stretchColumns,對(duì)應(yīng)的方法:setStretchAllColumns(boolean),作用:設(shè)置表格的列是否拉伸

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

運(yùn)行之后可以得出下面的結(jié)果:

圖6、表格布局

14.5列表視圖(ListView)

列表布局:是一個(gè)ViewGroup以列表顯示它的子視圖(view)元素,列表是可滾動(dòng)的列表。列表元素通過

ListAdapter自動(dòng)插入到列表。

ListAdapter:擴(kuò)展自Adapter,它是ListView和數(shù)據(jù)列表之間的橋梁。ListView可以顯示任何包裝

在ListAdapter中的數(shù)據(jù)。該類提供兩個(gè)公有類型的抽象方法:1.2.

publicabstractbooleanareAllItemsEnabled():表示ListAdapter中的所有元素是否可激活的?如果返回真,即所有的元素是可選擇的即可點(diǎn)擊的。

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

下面通過一個(gè)例子來,創(chuàng)建一個(gè)可滾動(dòng)的列表,并從一個(gè)字符串?dāng)?shù)組讀取列表元素。當(dāng)一個(gè)元素被選擇時(shí),顯示該元素在列表中的位置的消息。

1)、首先,將res/layour/main.xml的內(nèi)容置為如下:

這樣就定義了元素在列表中的布局。

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類不是擴(kuò)展自Acitvity,而是擴(kuò)展自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()函數(shù)中并不像往常一樣通過setContentView()為活動(dòng)(Activity)加載布局文件,替代的是通過setListAdapter(ListAdapter)自動(dòng)添加一個(gè)ListView填充整個(gè)屏幕的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"};

在此文件中這個(gè)方法以一個(gè)ArrayAdapter為參數(shù):setListAdapter(newArrayAdapter(this,R.layout.main,COUNTRIES)),這個(gè)ArrayAdapter管理填入ListView中的列表元素。ArrayAdapter的構(gòu)造函數(shù)的參數(shù)為:this(表示應(yīng)用程序的上下文context)、表示ListViewde布局文件(這里是R.layout.main)、插入ListView的List對(duì)象對(duì)數(shù)組(這里是COUNTRES)。

setOnItemClickListener(OnItemClickListener)定義了每個(gè)元素的點(diǎn)擊(on-click)的監(jiān)聽器,當(dāng)ListView中的元素被點(diǎn)擊時(shí),onItemClick()方法被調(diào)用,在這里是即一個(gè)Toast消息每個(gè)元素的位置將顯示。

3)、運(yùn)行應(yīng)用程序得如下結(jié)果(點(diǎn)擊1之后,在下面顯示了1):

圖7、列表布局NOTE:如果你改了HelloWorldextendsListActivity而不是Activity之后,運(yùn)行程序是提示:“ConversiontoDalvikformatfailedwitherror1”?梢赃@么解決:解決辦法是Project>Clean...>Cleanprojectselectedbelow>Ok

14.5.1.15.1、一個(gè)小的改進(jìn)

上面我們是把要填充到ListView中的元素硬編碼到HelloWorld.java文件中,這樣就缺乏靈活性!也不符合推薦的應(yīng)用程序的界面與控制它行為的代碼更好地分離的準(zhǔn)則!

其實(shí)我們可以把要填充到ListView的元素寫到res/values/strings.xml文件中的元素中,然后再源碼中動(dòng)態(tài)地讀取。這樣strings.xml的內(nèi)容類似下面:

1234567

然而HelloWorld.java文件中的onCreate()函數(shù),則這樣動(dòng)態(tài)訪問這個(gè)數(shù)組及填充到ListVies:

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

14.5.1.25.2、補(bǔ)充說明

首先總結(jié)一下列表布局的關(guān)鍵部分:

布局文件中定義ListView

Adapter用來將數(shù)據(jù)填充到ListView

要填充到ListView的數(shù)據(jù),這些數(shù)據(jù)可以字符串、圖片、控件等等其中Adapter是ListView和數(shù)據(jù)源之間的橋梁,根據(jù)數(shù)據(jù)源的不同Adapter可以分為三類:

String[]:ArrayAdapter

List:SimpleAdapter數(shù)據(jù)庫Cursor:SimpleCursorAdapter

使用ArrayAdapter(數(shù)組適配器)顧名思義,需要把數(shù)據(jù)放入一個(gè)數(shù)組以便顯示,上面的例子就是這樣的;SimpleAdapter能定義各種各樣的布局出來,可以放上ImageView(圖片),還可以放上Button(按鈕),CheckBox(復(fù)選框)等等;SimpleCursorAdapter是和數(shù)據(jù)庫有關(guān)的東西。篇幅有限后面兩種就不舉例實(shí)踐了。你可以參考androidListView詳解orArrayAdapter,SimpleAdapter,SimpleCursorAdapter區(qū)別。

14.6網(wǎng)格視圖(GridView)

網(wǎng)格布局:是一個(gè)ViewGroup以網(wǎng)格顯示它的子視圖(view)元素,即二維的、滾動(dòng)的網(wǎng)格。網(wǎng)格元素通過ListAdapter自動(dòng)插入到網(wǎng)格。ListAdapter跟上面的列表布局是一樣的,這里就不重復(fù)累述了。下面也通過一個(gè)例子來,創(chuàng)建一個(gè)顯示圖片縮略圖的網(wǎng)格。當(dāng)一個(gè)元素被選擇時(shí),顯示該元素在列表中的位置的消息。

1)、首先,將上面實(shí)踐截取的圖片放入res/drawable/

2)、res/layour/main.xml的內(nèi)容置為如下:這個(gè)GridView填滿整個(gè)屏幕,而且它的屬性都很好理解,按英文單詞的意思就對(duì)了。

3)、然后,HelloWorld.java文件中onCreate()函數(shù)如下: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()函數(shù)跟通常一樣,首先調(diào)用超類的onCreate()函數(shù)函數(shù),然后通過setContentView()為活動(dòng)(Activity)加載布局文件。緊接著是,通過GridView的id獲取布局文件中的gridview,然后調(diào)用它的

setListAdapter(ListAdapter)函數(shù)填充它,它的參數(shù)是一個(gè)我們自定義的ImageAdapter。后面的工作

跟列表布局中一樣,為監(jiān)聽網(wǎng)格中的元素被點(diǎn)擊的事件而做的工作。4)、實(shí)現(xiàn)我們自定義ImageAdapter,新添加一個(gè)類文件,它的代碼如下:

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類擴(kuò)展自BaseAdapter,所以首先得實(shí)現(xiàn)它所要求必須實(shí)現(xiàn)的方法。構(gòu)造函數(shù)和

getcount()函數(shù)很好理解,而getItem(int)應(yīng)該返回實(shí)際對(duì)象在適配器中的特定位置,但是這里我們不需要。類似地,getItemId(int)應(yīng)該返回元素的行號(hào),但是這里也不需要。這里重點(diǎn)要介紹的是getView()方法,它為每個(gè)要添加到ImageAdapter的圖片都創(chuàng)建了一個(gè)新的View。當(dāng)調(diào)用這個(gè)方法時(shí),一個(gè)View是循環(huán)再用的,因此要確認(rèn)對(duì)象是否為空。如果是空的話,一個(gè)ImageView就被實(shí)例化且配置想要的顯示屬性:

setLayoutParams(ViewGroup.LayoutParams):設(shè)置View的高度和寬度,這確保不管drawable中圖片的大小,每個(gè)圖片都被重新設(shè)置大小且剪裁以適應(yīng)這些尺寸。

setScaleType(ImageView.ScaleType):聲明圖片應(yīng)該向中心剪裁(如果需要的話)。

setPadding(int,int,int,int):定義補(bǔ)距,如果圖片有不同的橫縱比,小的補(bǔ)距將導(dǎo)致更多的剪裁以適合設(shè)置的ImageView的高度和寬度。

如果View傳到getView()不是空的,則本地的ImageView初始化時(shí)將循環(huán)再用View對(duì)象。在getView()方法末尾,position整數(shù)傳入setImageResource()方法以從mThumbIds數(shù)組中選擇圖片。運(yùn)行程序會(huì)得到如下結(jié)果(點(diǎn)擊第一張圖片之后):

圖8、網(wǎng)格布局

14.6.1.17、絕對(duì)布局(AbsoluteLayout)

絕對(duì)布局:是一個(gè)ViewGroup以絕對(duì)方式顯示它的子視圖(view)元素,即以坐標(biāo)的方式來定位在屏幕上位置。

這種布局方式很好理解,在布局文件或編程地設(shè)置View的坐標(biāo),從而絕對(duì)地定位。如下所示布局文件:

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

簡(jiǎn)單吧,這里不在深入了!

14.7標(biāo)簽布局(TabLayout)

標(biāo)簽布局:是一個(gè)ViewGroup以標(biāo)簽的方式顯示它的子視圖(view)元素,就像在Firefox中的一個(gè)窗口中顯示多個(gè)網(wǎng)頁一樣。

為了狂創(chuàng)建一個(gè)標(biāo)簽UI(tabbedUI),需要使用到TabHost和TabWidget。TabHost必須是布局的

根節(jié)點(diǎn),它包含為了顯示標(biāo)簽的TabWidget和顯示標(biāo)簽內(nèi)容的FrameLayout。

可以有兩種方式實(shí)現(xiàn)標(biāo)簽內(nèi)容:使用標(biāo)簽在同一個(gè)活動(dòng)中交換視圖、使用標(biāo)簽在完全隔離的活動(dòng)之間改變。根據(jù)你的需要,選擇不同的方式,但是如果每個(gè)標(biāo)簽提供不同的用戶活動(dòng),為每個(gè)標(biāo)簽選擇隔離的活動(dòng),因此你可以更好地以分離的組管理應(yīng)用程序,而不是一個(gè)巨大的應(yīng)用程序和布局。下面還有一個(gè)例子來創(chuàng)建一個(gè)標(biāo)簽UI,每個(gè)標(biāo)簽使用隔離的活動(dòng)。

1)、在項(xiàng)目中建立三個(gè)隔離的Activity類:ArtistisActivity、AlbumActivity、SongActivity。它們每個(gè)表示一個(gè)分隔的標(biāo)簽。每個(gè)通過TextView顯示簡(jiǎn)單的一個(gè)消息,例如:

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

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

其它兩個(gè)類也類似。

友情提示:本文中關(guān)于《android軟件開發(fā)工程師轉(zhuǎn)正個(gè)人總結(jié)》給出的范例僅供您參考拓展思維使用,android軟件開發(fā)工程師轉(zhuǎn)正個(gè)人總結(jié):該篇文章建議您自主創(chuàng)作。

來源:網(wǎng)絡(luò)整理 免責(zé)聲明:本文僅限學(xué)習(xí)分享,如產(chǎn)生版權(quán)問題,請(qǐng)聯(lián)系我們及時(shí)刪除。


android軟件開發(fā)工程師轉(zhuǎn)正個(gè)人總結(jié)》由互聯(lián)網(wǎng)用戶整理提供,轉(zhuǎn)載分享請(qǐng)保留原作者信息,謝謝!
鏈接地址:http://m.hmlawpc.com/gongwen/547709.html
推薦專題