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à)值,同公司一起展望美好的未來!
XX201*年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居中方法
010208
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í)刪除。