android軟件開發(fā)工程師轉正個人總結
個人總結
我于201*年8月13日進入公司,根據(jù)公司的需要,目前擔任Android軟件工程師一職,負責綜合代維,考務通手機客戶端的開發(fā)工作。將近3個月的時候在這個新的工作環(huán)境我收獲頗深。開始讓我獨立完成整個項目,這還是我的第一次,之前在公司是多人完成,過程中也遇到了許多困難,但是都一一解決了,我想這是我最寶貴的經(jīng)歷,通過三個月的不斷學習,在項目開發(fā)中的不斷鍛煉以及同事、領導的幫助,我已逐漸融入這個大家庭,個人的工作技能也有了明顯的提高,雖然仍有一些不足,但三個月以來我付出了不少,也收獲了不少,我感覺自己成長了,也逐漸成熟了。
初到公司,加入了咨詢與信息化部,加入了綜合代維項目組,我也曾擔心自己不知道該怎么與項目組的同事溝通,擔心不知道怎么做好工作,但是項目組的前輩們都很親切,也很耐心的教導我,解答我的疑問,以及他們團結向上的精神,讓我很快的熟悉了工作,融入了項目組。
在這三個月的學習和工作中,我一直嚴格要求自己,遵循公司的規(guī)章制度,認真完成領導布置的每一項任務,遇到的問題虛心的向項目組的前輩們學習、請教,不斷的提高、充實自己。開發(fā)過程中出現(xiàn)的一些差錯,也有前輩們耐心的指出和指導我修改,這些經(jīng)歷讓我不斷成熟,處理問題時考慮得更全面,杜絕類似情況的發(fā)生。在此我要特地感謝部門的領導和同事們對我的指引和幫助,感謝他們對我工作上失誤的提醒和指正。
經(jīng)過這三個月,我已經(jīng)能獨立進行開發(fā)任務,按時按質的完成分配的工作任務,當然還有許多不足,開發(fā)的經(jīng)驗仍有待提高,編寫代碼的簡潔性和完整性也需要進一步增強,需要不斷的繼續(xù)學習以提高自己的工作能力。
總之,這三個月來我學到了很多,感悟了很多;看到公司的迅速發(fā)展,看到部門的同事越來越多,我深深地感到驕傲和自豪,也更加迫切的希望以一名正式員工的身份在這里工作,實現(xiàn)自己的奮斗目標,體現(xiàn)自己的人生價值,和公司一起成長。
我會用謙虛的態(tài)度和飽滿的熱情做好我的本職工作,為公司創(chuàng)造價值,同公司一起展望美好的未來!
XX201*年11月13日
擴展閱讀:android開發(fā)基礎-個人總結版
Android文檔
Android文檔..............................................................................................................................................................11自定義控件.........................................................................................................................................................2
1.1第一種添加屬性的方法,之前我也是經(jīng)常使用這種寫法,代碼如下:.........................................21.2下面是第二為VIEW注冊屬性的寫法................................................................................................32Button..................................................................................................................................................................9
2.1單擊事件寫法.........................................................................................................................................92.2Button居中方法.....................................................................................................................................9
2.2.1[圖片]運行結果......................................................................................................................102.2.2[代碼]簡單說明......................................................................................................................10
3EditText屬性...................................................................................................................................................104設置橫豎屏去掉狀態(tài)欄..................................................................................................................................115GridView網(wǎng)格布局.........................................................................................................................................126登錄界面的混合布局.......................................................................................................................................147萬能android調用webservices方法xml.......................................................................................................168Android調用webservices................................................................................................................................189editText的監(jiān)聽事件change...........................................................................................................................1910輕量級數(shù)據(jù)庫的存儲和取值...................................................................................................................201*Android數(shù)據(jù)庫的使用...................................................................................................................................201*連接webServices未成功........................................................................................................................2313數(shù)據(jù)庫操作,包括分頁...........................................................................................................................2414android多種布局.....................................................................................................................................32
14.1view的布局顯示概述..........................................................................................................................3214.2線性布局(LinearLayout).............................................................................................................3314.3相對布局(RelativeLayout)..........................................................................................................3714.4表格布局(TableLayout)...............................................................................................................3914.5列表視圖(ListView)....................................................................................................................4114.6網(wǎng)格視圖(GridView)...................................................................................................................4514.7標簽布局(TabLayout).................................................................................................................5015AndroidManifest.xml中的一些配置.......................................................................................................5416重力感應編程...........................................................................................................................................5517Android問價的壓縮與解壓...................................................................................................................5618List詳解...................................................................................................................................................6119自定義帶有圖標的文件管理器...............................................................................................................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);}}
這種寫法,簡單明了,不需要額外XML的配置,就可以在我們的VIEW文件下使用。
以上代碼通過構造函數(shù)中引入的AttributeSet去查找XML布局的屬性名稱,然后找到它對應引用的資源ID去找值。使用也時分方便。所以一直以來我也是很喜歡這種寫法。如上,自定好VIEW文件就可以在XML布局下如此使用:
好了,這是第一種為VIEW注冊屬性的寫法,比較簡單就不多介紹。
1.2下面是第二為VIEW注冊屬性的寫法
,這里也要重點說說第二種注冊屬性的寫法和使用要點,先看一下JAVA代碼要如何編寫:
packagecom.terry.attrs;
importandroid.content.Context;
importandroid.content.res.TypedArray;importandroid.util.AttributeSet;importandroid.widget.EditText;importandroid.widget.LinearLayout;importandroid.widget.TextView;publicclassEditTextExtextendsLinearLayout{
publicEditTextExt(Contextcontext){this(context,null);
//TODOAuto-generatedconstructorstub}
publicEditTextExt(Contextcontext,AttributeSetattrs){super(context,attrs);
//TODOAuto-generatedconstructorstubintresouceId=-1;
TypedArraytypeArray=context.obtainStyledAttributes(attrs,R.styleable.EditTextExt);
TextViewtv=newTextView(context);EditTextet=newEditText(context);
intN=typeArray.getIndexCount();for(inti=0;i
intattr=typeArray.getIndex(i);switch(attr){
caseR.styleable.EditTextExt_Oriental:
resouceId=typeArray.getInt(R.styleable.EditTextExt_Oriental,0);
this.setOrientation(resouceId==1?LinearLayout.HORIZONTAL:LinearLayout.VERTICAL);break;
caseR.styleable.EditTextExt_Text:resouceId=typeArray.getResourceId(R.styleable.EditTextExt_Text,0);
tv.setText(resouceId>0?typeArray.getResources().getText(resouceId):typeArray
.getString(R.styleable.EditTextExt_Text));break;}}
addView(tv);addView(et);
typeArray.recycle();}}如上代碼,跟前面代碼一樣。還是用的一個EDITTEXT和TEXTVIEW做基礎組件。下面我們一步步分析上面的代碼:
R.styleable.EditTextExt代碼的是一個attrs指向的一個declare-styleable的標簽,如下代碼:
這個文件位于,values下的attrs.xml目錄下面,我比較喜歡一個自定義View對應一個declare-styleable標簽。
Tip:一個自定義View第一部分的代碼,
TypedArraytypeArray=context.obtainStyledAttributes(attrs,R.styleable.EditTextExt);
指定為一個declare-styleable,而在declare-styleable下的attr(即各屬性)Android的ADT將會自動生成為declare-styleable的name名字加上“_”加上對應attr(即屬性名稱)的名稱,如上
(EditTextExt_Text)我們要得到Text就需要R.styleable.EditTextExt_Text,這一點的話可以看看R.java生成文件:
publicstaticfinalclassstyleable{
/**AttributesthatcanbeusedwithaEditTextExt.Includesthefollowingattributes:
AttributeDescription
{@link#EditTextExt_Orientalcom.terry.attrs:Oriental}
{@link#EditTextExt_Textcom.terry.attrs:Text}
@see#EditTextExt_Oriental@see#EditTextExt_Text*/
publicstaticfinalint[]EditTextExt={0x7f010000,0x7f010001};/**
Thissymbolistheoffsetwherethe{@linkcom.terry.attrs.R.attr#Oriental}
attribute"svaluecanbefoundinthe{@link#EditTextExt}array.
Mustbeoneofthefollowingconstantvalues.
ConstantValueDescriptionHorizontal1Vertical0
@attrnameandroid:Oriental*/
publicstaticfinalintEditTextExt_Oriental=1;/**
Thissymbolistheoffsetwherethe{@linkcom.terry.attrs.R.attr#Text}
attribute"svaluecanbefoundinthe{@link#EditTextExt}array.
Maybeareferencetoanotherresource,intheform"@[+][package:]type:name"
ortoathemeattributeintheform"?[package:][type:]name".
Maybeastringvalue,using"\\\\;"toescapecharacterssuchas"\\\\n"or"\\\\uxxxx"foraunicodecharacter.@attrnameandroid:Text*/
publicstaticfinalintEditTextExt_Text=0;};
好了,上述的代碼寫完,我們要在XML布局如何使用呢?這個會跟Android提供的基礎組件的使用方法是一致的。首先,我們要為其提供一個引用包名如下:
xmlns:android=""
xmlns:terry=""
上面提供的是android基礎組件的包名,和我們自己組件的包名。
寫好了包名。就可以像使用andriod基礎組件一樣使用了,如下全部XML布局源碼:
android:layout_width="fill_parent"android:layout_height="wrap_content"terry:Text="fdsafda"terry:Oriental="Vertical">
運行效果如下:
這是這兩種為Android注冊屬性的使用方法,那么兩者有什么區(qū)別呢?在這里我認為起碼有五點,大家可以找找看還有什么區(qū)別:
第二種可以編譯時報錯,如果編程人員隨便輸入什么第一種是不會報錯的,第二種可以支持代碼檢測功能。
第二種寫法,跟Android屬性標準寫法是一致的,而且可以統(tǒng)一書法規(guī)則。
第二種寫法,可以支持數(shù)據(jù)格式的驗證,比如我們在attrs上注明只支持integer那么就不可以使用字符串,這是第一種達不到的。
第二種寫法,可以為VIEW提供選擇操作,比如如上我們使用的ENUM讓VIEW對應的屬性支持ENUM列表,或者為其提供BOOL等只有雙項選擇的操作。
第一種寫法,所有的屬性必須是引用自資源(不大確定,如果朋友有什么好的DEMO麻煩共享),第二種寫法,可以即支持引用資源又可以直接輸入做操作,為編程帶來更多的方便性。
種種都說明,第二種寫法更具規(guī)范性,功能更性,代碼編寫也更優(yōu)雅,但個人有個人的使用習慣,我兩種都喜歡用,具體看需求吧。呵呵。。。
2Button
2.1單擊事件寫法
也可以指定多個OnClickListener或其他類型的事件,那就看看是否需要了。以上幾個代碼也可以寫成以下格式:
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[圖片]運行結果
2.2.2[代碼]簡單說明
1可以看到Button與Gallery的對齊方式是居中對齊,也即Button與Parent居中對齊。2另外,
3Android:gravity="CENTER_VERTICAL“:這個是垂直居中對齊4Android:gravity="BOTTOM”:放在容器的底部5Android:gravity="CENTER“:放在容器的中心
3EditText屬性
Android中的EditText數(shù)據(jù)編輯框,相當于C#中的TextBox。剛開始接觸時容易和TextView組件混淆,分不清那個是顯示,那個是編輯,至少我就犯了這個錯誤。Layout聲明:
android:layout_width="200px"android:paddingRight="@dimen/padding"android:textSize="18sp"android:layout_x="14px"android:layout_y="41px"
android:layout_height="wrap_content">
注:
android:id,不用說了,組件的唯一標識。
android:layout_width\\android:layout_height:寬度與高度,所有的android組件都是這么指定。參見Button說明。
android:layout_y\\android:layout_y:待定。
android:paddingRight:與右側空白大小。當然,還是paddingLeft、paddingTop、paddingButton和paddingAll。
除了上面這些,如果要指定EditText為Password輸入框,可用android:password=”true”進行聲明。
另外還有在用戶輸入體驗上的標簽,不會影響程序的運行,但會給用戶輸入帶來很好的體驗,如只需要輸入電話號碼或都數(shù)字等。
android:phoneNumber="true":系統(tǒng)只會打開電話輸鍵盤(電話號碼不可用鍵不會顯示.android:numeric="integer|signed|decimal":系統(tǒng)只會打開數(shù)據(jù)鍵盤(三值可選一)。
4設置橫豎屏去掉狀態(tài)欄
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);//設置成全屏模式
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE););//強制為橫屏
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//豎屏
我做的東西里面還用到了去掉標題欄。我也貼出來
requestWindowFeature(Window.FEATURE_NO_TITLE);5GridView網(wǎng)格布局
[功能]
以前提及過GridView說也是一種AdapterView和ListView有點像今天花了時間用了一些有點心得和大家分享分享[思路]
1.既然和ListView像那么應該還是通過setAdapter()來設置吧
2.因為我想顯示的是一些圖片信息必須用到ImageView不是默認的Adapter用到的TextView所以只能自己擴展了[代碼]
1.定義包含GridView的main.xmkJava代碼
1.2.7.14.這行應該注意一下:Java代碼
1.android:numColumns="3"用來設定GridView每行顯示的View數(shù)目如果沒有這行會默認每行顯示一個View和ListView的一樣
2.自定義classImageListextendsBaseAdapter其中主要是:寫道
ViewgetView(intposition,ViewconvertView,ViewGroupparent)
用于顯示目標ImageView
Java代碼1.publicclassImageListextendsBaseAdapter{2.Activityactivity;3.4.//construct5.publicImageList(Activitya){6.activity=a;7.}8.9.@Override10.publicintgetCount(){11.//TODOAuto-generatedmethodstub12.returnimage.length;13.}14.15.@Override16.publicObjectgetItem(intposition){17.//TODOAuto-generatedmethodstub18.returnimage[position];19.}20.21.@Override22.publiclonggetItemId(intposition){23.//TODOAuto-generatedmethodstub24.returnposition;25.}26.27.@Override28.publicViewgetView(intposition,ViewconvertView,ViewGroupparent){29.//TODOAuto-generatedmethodstub30.ImageViewiv=newImageView(activity);31.iv.setImageResource(image[position]);32.returniv;33.}34.}
3.給GridView指定AdapterJava代碼
1.GridViewgv=(GridView)findViewById(R.id.gride);2.3.ImageListadapter=newImageList(this);4.5.gv.setAdapter(adapter);
所以最后效果圖是這樣的網(wǎng)格布局
6登錄界面的混合布局
開發(fā)UI時,通常是先設計布局,具體怎么創(chuàng)建布局文件見上篇,本篇主要講如何做登陸窗口的布局,新建布局XML文件默認有一個LinearLayout布局對象和TextView對象,我們把TextView刪除,LinearLayout是線性布局,可以橫向或縱向線性排列里面的對象,在里面我們放個RelativeLayout對象,該對象是個相對布局對象,可以居中子對象,RelativeLayout對象里面再放LinearLayout對象,默認是橫向線性排列子對象,這個LinearLayout里面再放入TextView、Button等,這樣通過布局對象我們可以比較規(guī)則的布局登陸控件了,具體代碼和效果圖如下:
android:orientation="vertical"//縱向線性排列子對象
android:layout_width="fill_parent"android:layout_height="fill_parent">
//設置高度
android:layout_height="wrap_content">
我們可以可視化的添加Layouts布局對象和Views對象,選中對象后在Properties選項卡可設置屬性值,如圖。
當然可以切換到代碼模式添加對象或設置屬性值,就像asp.net的aspx文件可以在design下設計也可在source下設計,不過Ophone沒有split模式。另外布局對象的RelativeLayout相對定位布局和AbsoluteLayout絕對定位布局,有點像css中的position定位中的relative和absolute。
7萬能android調用webservices方法xml
關鍵代碼:try{
//發(fā)帖機原理,模擬瀏覽器
finalStringSERVER_URL="";//定義需要獲取的內容來源地址
URLurl=newURL(SERVER_URL);URLConnectioncon=url.openConnection();con.setDoOutput(true);
con.setRequestProperty("Pragma:","no-cache");con.setRequestProperty("Cache-Control","no-cache");con.setRequestProperty("Content-Type","text/xml");
OutputStreamWriterout=newOutputStreamWriter(con.getOutputStream());//控件取值
EditTexteTextName=(EditText)findViewById(R.id.tbx_name);EditTexteTextAge=(EditText)findViewById(R.id.tbx_age);String
xmlInfo
=""+URLEncoder.encode(eTextName.getText().toString())+""
+eTextAge.getText().toString()
+"";//發(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的返回值,但是那是一個完整的xml,需要進一步解析從而得到想要的結果解析的方法如下所示:
DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();DocumentBuilderbuilder=factory.newDocumentBuilder();
InputStreamis=newByteArrayInputStream(result.getBytes("UTF-8"));Documentdom=builder.parse(is);
Stringres=dom.getDocumentElement().getChildNodes().item(0).getNodeValue();
9editText的監(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){
//編輯內容
Log.d("Select----------","[TextWatcher][onTextChanged]"+s);}
};10輕量級數(shù)據(jù)庫的存儲和取值
publicstaticfinalStringPREFS_NAME=“輕量級數(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訪問一個數(shù)據(jù)庫。下面會詳細講解如果創(chuàng)建數(shù)據(jù)庫,添加數(shù)據(jù)和查詢數(shù)據(jù)庫。
創(chuàng)建數(shù)據(jù)庫Android不自動提供數(shù)據(jù)庫。在Android應用程序中使用SQLite,必須自己創(chuàng)建數(shù)據(jù)庫,然后創(chuàng)建表、索引,填充數(shù)據(jù)。Android提供了SQLiteOpenHelper幫助你創(chuàng)建一個數(shù)據(jù)庫,你只要繼承
SQLiteOpenHelper類,就可以輕松的創(chuàng)建數(shù)據(jù)庫。SQLiteOpenHelper類根據(jù)開發(fā)應用程序的需要,封裝了創(chuàng)建和更新數(shù)據(jù)庫使用的邏輯。SQLiteOpenHelper的子類,至少需要實現(xiàn)三個方法:
構造函數(shù),調用父類SQLiteOpenHelper的構造函數(shù)。這個方法需要四個參數(shù):上下文環(huán)境(例
如,一個Activity),數(shù)據(jù)庫名字,一個可選的游標工廠(通常是Null),一個代表你正在使用的數(shù)據(jù)庫模型版本的整數(shù)。
onCreate()方法,它需要一個SQLiteDatabase對象作為參數(shù),根據(jù)需要對這個對象填充表和
初始化數(shù)據(jù)。
onUpgrage()方法,它需要三個參數(shù),一個SQLiteDatabase對象,一個舊的版本號和一個新的
版本號,這樣你就可以清楚如何把一個數(shù)據(jù)庫從舊的模型轉變到新的模型。
下面示例代碼展示了如何繼承SQLiteOpenHelper創(chuàng)建數(shù)據(jù)庫:publicclassDatabaseHelperextendsSQLiteOpenHelper{DatabaseHelper(Contextcontext,Stringname,CursorFactorycursorFactory,intversion){super(context,name,cursorFactory,version);}@OverridepublicvoidonCreate(SQLiteDatabasedb){//TODO創(chuàng)建數(shù)據(jù)庫后,對數(shù)據(jù)庫的操作}@OverridepublicvoidonUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion){//TODO更改數(shù)據(jù)庫版本的操作}@OverridepublicvoidonOpen(SQLiteDatabasedb){super.onOpen(db);//TODO每次成功打開數(shù)據(jù)庫后首先被執(zhí)行}}接下來討論具體如何創(chuàng)建表、插入數(shù)據(jù)、刪除表等等。調用getReadableDatabase()或
getWriteableDatabase()方法,你可以得到SQLiteDatabase實例,具體調用那個方法,取決于你是否需要改變數(shù)據(jù)庫的內容:
db=(newDatabaseHelper(getContext())).getWritableDatabase();return(db==null)?false:true;上面這段代碼會返回一個SQLiteDatabase類的實例,使用這個對象,你就可以查詢或者修改數(shù)據(jù)庫。當你完成了對數(shù)據(jù)庫的操作(例如你的Activity已經(jīng)關閉),需要調用SQLiteDatabase的Close()方法來釋放掉數(shù)據(jù)庫連接。
創(chuàng)建表和索引
為了創(chuàng)建表和索引,需要調用SQLiteDatabase的execSQL()方法來執(zhí)行DDL語句。如果沒有異常,這個方法沒有返回值。
例如,你可以執(zhí)行如下代碼:db.execSQL("CREATETABLEmytable(_idINTEGERPRIMARYKEYAUTOINCREMENT,titleTEXT,valueREAL);");這條語句會創(chuàng)建一個名為mytable的表,表有一個列名為_id,并且是主鍵,這列的值是會自動增長的整數(shù)(例如,當你插入一行時,SQLite會給這列自動賦值),另外還有兩列:title(字符)和value(浮點數(shù))。SQLite會自動為主鍵列創(chuàng)建索引。
通常情況下,第一次創(chuàng)建數(shù)據(jù)庫時創(chuàng)建了表和索引。如果你不需要改變表的schema,不需要刪除表和索引.刪除表和索引,需要使用execSQL()方法調用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()方法適用于所有不返回結果的SQL語句。例如:
db.execSQL("INSERTINTOwidgets(name,inventory)"+"VALUES("Sprocket",5)");另一種方法是使用SQLiteDatabase對象的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()方法有四個參數(shù),分別是表名,表示列名和值的ContentValues對象,可選的WHERE條件和可選的填充WHERE語句的字符串,這些字符串會替換WHERE條件中的“?”標記。update()根據(jù)條件,更新指定列的值,所以用execSQL()方法可以達到同樣的目的。WHERE條件和其參數(shù)和用過的其他SQLAPIs類似。例如:String[]parms=newString[]{"thisisastring"};db.update("widgets",replacements,"name=?",parms);delete()方法的使用和update()類似,使用表名,可選的WHERE條件和相應的填充WHERE條件的字符串。
查詢數(shù)據(jù)庫
類似INSERT,UPDATE,DELETE,有兩種方法使用SELECT從SQLite數(shù)據(jù)庫檢索數(shù)據(jù)。1.使用rawQuery()直接調用SELECT語句;使用query()方法構建一個查詢。
RawQueries
正如API名字,rawQuery()是最簡單的解決方法。通過這個方法你就可以調用SQLSELECT語句。例如:
Cursorc=db.rawQuery("SELECTnameFROMsqlite_masterWHEREtype="table"ANDname="mytable"",null);
在上面例子中,我們查詢SQLite系統(tǒng)表(sqlite_master)檢查table表是否存在。返回值是一個cursor對象,這個對象的方法可以迭代查詢結果。
如果查詢是動態(tài)的,使用這個方法就會非常復雜。例如,當你需要查詢的列在程序編譯的時候不能確定,這時候使用query()方法會方便很多。RegularQueries
query()方法用SELECT語句段構建查詢。SELECT語句內容作為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實體
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類。我們需要創(chuàng)建數(shù)據(jù)表,必須重寫onCreate(更新時重寫onUpgrade方法)方法,在這個方法中創(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í)行查詢時獲得一個游標實例的工廠類。設置為null,則使用系統(tǒng)默認的工廠類。*/
super(context,name,null,version);}
@Override
publicvoidonCreate(SQLiteDatabasedb){
//創(chuàng)建contacts表,SQL表達式時提供的字段類型和長度僅為提高代碼的可讀性。db.execSQL("CREATETABLEIFNOTEXISTScontacts("+"_idintegerprimarykeyautoincrement,"+"namevarchar(20),"+"phonevarchar(50))");}
@Override
publicvoidonUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion){//僅演示用,所以先刪除表然后再創(chuàng)建。
db.execSQL("DROPTABLEIFEXISTScontacts");this.onCreate(db);}}
4.編寫ContactsService類
ContactsService類主要實現(xiàn)對業(yè)務邏輯和數(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.編寫測試類
編寫一個針對ContactsService的測試類,測試ContactsService類中的各個方法是否正確。packagecom.changcheng.sqlite.test;importjava.util.List;
importcom.changcheng.sqlite.MyOpenHelper;importcom.changcheng.sqlite.entity.Contact;
importcom.changcheng.sqlite.service.ContactsService;importandroid.database.Cursor;importandroid.test.AndroidTestCase;importandroid.util.Log;
publicclassContactsServiceTestextendsAndroidTestCase{privatestaticfinalStringTAG="ContactsServiceTest";//測試創(chuàng)建表
publicvoidtestCreateTable()throwsThrowable{
MyOpenHelperopenHelper=newMyOpenHelper(this.getContext());openHelper.getWritableDatabase();}
//測試save
publicvoidtestSave()throwsThrowable{
ContactsServicecontactsService=newContactsService(this.getContext());Contactcontact1=newContact(null,"tom","13898679876");Contactcontact2=newContact(null,"lili","13041094909");Contactcontact3=newContact(null,"jack","13504258899");Contactcontact4=newContact(null,"heary","1335789789");contactsService.save(contact1);contactsService.save(contact2);contactsService.save(contact3);contactsService.save(contact4);}//測試find
publicvoidtestFind()throwsThrowable{
ContactsServicecontactsService=newContactsService(this.getContext());Contactcontact=contactsService.find(1);Log.i(TAG,contact.toString());}
//測試update
publicvoidtestUpdate()throwsThrowable{
ContactsServicecontactsService=newContactsService(this.getContext());Contactcontact=contactsService.find(1);contact.setPhone("1399889955");contactsService.update(contact);}
//測試getCount
publicvoidtestGetCount()throwsThrowable{
ContactsServicecontactsService=newContactsService(this.getContext());Log.i(TAG,contactsService.getCount()+"");}
//測試getScrollData
publicvoidtestGetScrollData()throwsThrowable{
ContactsServicecontactsService=newContactsService(this.getContext());Listcontacts=contactsService.getScrollData(0,3);Log.i(TAG,contacts.toString());}
//測試getScrollDataCursor
publicvoidtestGetScrollDataCursor()throwsThrowable{
ContactsServicecontactsService=newContactsService(this.getContext());Cursorcursor=contactsService.getScrollDataCursor(0,3);while(cursor.moveToNext()){
Contactcontact=newContact(cursor.getInt(0),cursor.getString(1),cursor.getString(2));Log.i(TAG,contact.toString());}}}
啟用測試功能,不要忘記在AndroidManifest.xml文件中加入測試環(huán)境。為application元素添加一個子元素:,為application元素添加一個兄弟元素:。
SQLite數(shù)據(jù)庫以單個文件存儲,就像微軟的Access數(shù)據(jù)庫。有一個查看SQLite數(shù)據(jù)庫文件的工具SQLiteDeveloper,我們可以使用它來查看數(shù)據(jù)庫。Android將創(chuàng)建的數(shù)據(jù)庫存放在”/data/data/com.changcheng.sqlite/databases/contacts”,我們將它導出然后使用SQLiteDeveloper打開。6.分頁顯示數(shù)據(jù)
我們在ContactsService類中,提供了一個獲取分頁數(shù)據(jù)的方法。我們將調用它獲取的數(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所在目錄里添加一個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});//設置ListView適配器lv.setAdapter(adapter);//為ListView添加事件
lv.setOnItemClickListener(newOnItemClickListener(){@Override
publicvoidonItemClick(AdapterViewparent,Viewview,intposition,longid){
HashMapitem=(HashMap)parent.getItemAtPosition((int)id);
Toast.makeText(AndroidSQLite.this,item.get("name").toString(),1).show();}});}}
上面編寫的分頁顯示數(shù)據(jù)比較麻煩,Android為我們提供了一個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});//設置ListView適配器lv.setAdapter(adapter);//為ListView添加事件
lv.setOnItemClickListener(newOnItemClickListener(){@Override
publicvoidonItemClick(AdapterViewparent,Viewview,intposition,longid){
Cursorcursor=(Cursor)parent.getItemAtPosition((int)position);
Toast.makeText(AndroidSQLite.this,cursor.getString(1),1).show();}});}}
14android多種布局
14.1view的布局顯示概述
通過前面的學習我們知道:在一個Android應用程序中,用戶界面通過View和ViewGroup對象構建。Android中有很多種View和ViewGroup,他們都繼承自View類。View對象是Android平臺上表示用戶界面的基本單元。View的布局顯示方式直接影響用戶界面,View的布局方式是指一組View元素如何布局,準確的說是一個ViewGroup中包含的一些View怎么樣布局。ViewGroup類是布局(layout)和視圖容器(Viewcontainer)的基類,此類也定義了ViewGroup.LayoutParams類,它作為布局參數(shù)的基類,此類告訴父視圖
其中的子視圖想如何顯示。例如,XML布局文件中名為layout_something的屬性(參加上篇的4.2節(jié))。我們要介紹的View的布局方式的類,都是直接或間接繼承自ViewGroup類,如下圖所示:
圖1、繼承自ViewGroup的一些布局類
其實,所有的布局方式都可以歸類為ViewGroup的5個類別,即ViewGroup的5個直接子類。其它的一些布局都擴展自這5個類。下面分小節(jié)分別介紹View的七種布局顯示方式。
14.2線性布局(LinearLayout)
線性布局:是一個ViewGroup以線性方向顯示它的子視圖(view)元素,即垂直地或水平地。之前我們的HelloWorld!程序中view的布局方式就是線性布局的,一定不陌生!如下所示res/layour/main.xml:
android:orientation="horizontal">
從上面可以看出根LinearLayout視圖組(ViewGroup)包含5個Button,它的子元素是以線性方式(horizontal,水平的)布局,運行效果如下圖所示:
圖2、線性布局(水平或者說是橫向)
如果你在android:orientation="horizontal"設置為vertical,則是是垂直或者說是縱向的,如下圖所示:
圖3、線性布局(垂直或者說是縱向)
14.2.1.12.1、Tips:android:layout_weight="1"
這個屬性很關鍵,如果你沒有顯示設置它,它默認為0。把上面布局文件(水平顯示的那個)中的這個屬性都去掉,運行會得出如下結果:
圖4、layout_weight屬性
沒有了這個屬性,我們本來定義的5個Button運行后卻只顯示了2個Button,為什么呢??
"weight"顧名思義是權重的意思,layout_weight用于給一個線性布局中的諸多視圖的重要程度賦值。所有的視圖都有一個layout_weight值,默認為零,意思是需要顯示多大的視圖就占據(jù)多大的屏幕空間。這就不難解釋為什么會造成上面的情況了:Button1~Button5都設置了layout_height和layout_width屬性為wrap_content即包住文字內容,他們都沒有設置layout_weight屬性,即默認為0.,這樣Button1和Button2根據(jù)需要的內容占據(jù)了整個屏幕,別的就顯示不了啦!
若賦一個高于零的值,則將父視圖中的可用空間分割,分割大小具體取決于每一個視圖的layout_weight值以及該值在當前屏幕布局的整體layout_weight值和在其它視圖屏幕布局的layout_weight值中所占的比率而定。舉個例子:比如說我們在水平方向上有一個文本標簽和兩個文本編輯元素。該文本標簽并無指定layout_weight值,所以它將占據(jù)需要提供的最少空間。如果兩個文本編輯元素每一個的layout_weight值都設置為1,則兩者平分在父視圖布局剩余的寬度(因為我們聲明這兩者的重要度相等)。如果兩個文本編輯元素其中第一個的layout_weight值設置為1,而第二個的設置為2,則剩余空間的三分之二分給第一個,三分之一分給第二個(數(shù)值越小,重要度越高)。
14.3相對布局(RelativeLayout)
相對布局:是一個ViewGroup以相對位置顯示它的子視圖(view)元素,一個視圖可以指定相對于它的兄弟視圖的位置(例如在給定視圖的左邊或者下面)或相對于RelativeLayout的特定區(qū)域的位置(例如
底部對齊,或中間偏左)。
相對布局是設計用戶界面的有力工具,因為它消除了嵌套視圖組。如果你發(fā)現(xiàn)你使用了多個嵌套的LinearLayout視圖組后,你可以考慮使用一個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視圖組包含一個TextView、一個EditView、兩個Button,注意標記了(請注意運行代碼的時候,請把這些注釋去掉,否則會運行出錯,上面加上是為了更加醒目。┑膶傩,在使用相對布局方式中就是使用這些類似的屬性來定位視圖到你想要的位置,它們的值是你參照的視圖的id。這些屬性的意思很簡單,就是英文單詞的直譯,就不多做介紹了。運行之后,得如下結果:
圖5、相對布局
14.4表格布局(TableLayout)
表格布局:是一個ViewGroup以表格顯示它的子視圖(view)元素,即行和列標識一個視圖的位置。其實Android的表格布局跟HTML中的表格布局非常類似,TableRow就像HTML表格的標記。用表格布局需要知道以下幾點:
android:shrinkColumns,對應的方法:setShrinkAllColumns(boolean),作用:設置表格的列是否收縮(列編號從0開始,下同),多列用逗號隔開(下同),如android:shrinkColumns="0,1,2",即表格的第1、2、3列的內容是收縮的以適合屏幕,不會擠出屏幕。
android:collapseColumns,對應的方法:setColumnCollapsed(int,boolean),作用:設置表格的列是否隱藏
android:stretchColumns,對應的方法:setStretchAllColumns(boolean),作用:設置表格的列是否拉伸
看下面的res/layour/main.xml:
運行之后可以得出下面的結果:
圖6、表格布局
14.5列表視圖(ListView)
列表布局:是一個ViewGroup以列表顯示它的子視圖(view)元素,列表是可滾動的列表。列表元素通過
ListAdapter自動插入到列表。
ListAdapter:擴展自Adapter,它是ListView和數(shù)據(jù)列表之間的橋梁。ListView可以顯示任何包裝
在ListAdapter中的數(shù)據(jù)。該類提供兩個公有類型的抽象方法:1.2.
publicabstractbooleanareAllItemsEnabled():表示ListAdapter中的所有元素是否可激活的?如果返回真,即所有的元素是可選擇的即可點擊的。
publicabstractbooleanisEnabled(intposition):判斷指定位置的元素是否可激活的?
下面通過一個例子來,創(chuàng)建一個可滾動的列表,并從一個字符串數(shù)組讀取列表元素。當一個元素被選擇時,顯示該元素在列表中的位置的消息。
1)、首先,將res/layour/main.xml的內容置為如下:
這樣就定義了元素在列表中的布局。
2)、src/skynet.com.cnblogs.文件的代碼如下:
packageskynet.com.cnblogs.www;
importandroid.app.ListActivity;importandroid.os.Bundle;importandroid.view.View;
importandroid.widget.AdapterView;importandroid.widget.ArrayAdapter;importandroid.widget.ListView;importandroid.widget.TextView;importandroid.widget.Toast;
importandroid.widget.AdapterView.OnItemClickListener;
publicclassHelloWorldextendsListActivity{
//注意這里Helloworld類不是擴展自Acitvity,而是擴展自ListAcitivty/**Calledwhentheactivityisfirstcreated.*/@Override
publicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);
setListAdapter(newArrayAdapter(this,R.layout.main,COUNTRIES));
ListViewlv=getListView();lv.setTextFilterEnabled(true);
lv.setOnItemClickListener(newOnItemClickListener(){publicvoidonItemClick(AdapterViewparent,Viewview,intposition,longid){
//Whenclicked,showatoastwiththeTextViewtext
Toast.makeText(getApplicationContext(),((TextView)view).getText(),Toast.LENGTH_SHORT).show();}});}
staticfinalString[]COUNTRIES=newString[]{}
Note:onCreate()函數(shù)中并不像往常一樣通過setContentView()為活動(Activity)加載布局文件,替代的是通過setListAdapter(ListAdapter)自動添加一個ListView填充整個屏幕的ListActivity。
"1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24"};
在此文件中這個方法以一個ArrayAdapter為參數(shù):setListAdapter(newArrayAdapter(this,R.layout.main,COUNTRIES)),這個ArrayAdapter管理填入ListView中的列表元素。ArrayAdapter的構造函數(shù)的參數(shù)為:this(表示應用程序的上下文context)、表示ListViewde布局文件(這里是R.layout.main)、插入ListView的List對象對數(shù)組(這里是COUNTRES)。
setOnItemClickListener(OnItemClickListener)定義了每個元素的點擊(on-click)的監(jiān)聽器,當ListView中的元素被點擊時,onItemClick()方法被調用,在這里是即一個Toast消息每個元素的位置將顯示。
3)、運行應用程序得如下結果(點擊1之后,在下面顯示了1):
圖7、列表布局NOTE:如果你改了HelloWorldextendsListActivity而不是Activity之后,運行程序是提示:“ConversiontoDalvikformatfailedwitherror1”。可以這么解決:解決辦法是Project>Clean...>Cleanprojectselectedbelow>Ok
14.5.1.15.1、一個小的改進
上面我們是把要填充到ListView中的元素硬編碼到HelloWorld.java文件中,這樣就缺乏靈活性!也不符合推薦的應用程序的界面與控制它行為的代碼更好地分離的準則!
其實我們可以把要填充到ListView的元素寫到res/values/strings.xml文件中的元素中,然后再源碼中動態(tài)地讀取。這樣strings.xml的內容類似下面:
1234567
然而HelloWorld.java文件中的onCreate()函數(shù),則這樣動態(tài)訪問這個數(shù)組及填充到ListVies:
String[]countries=getResources().getStringArray(R.array.countries_array);setListAdapter(newArrayAdapter(this,R.layout.list_item,countries));
14.5.1.25.2、補充說明
首先總結一下列表布局的關鍵部分:
布局文件中定義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ù)放入一個數(shù)組以便顯示,上面的例子就是這樣的;SimpleAdapter能定義各種各樣的布局出來,可以放上ImageView(圖片),還可以放上Button(按鈕),CheckBox(復選框)等等;SimpleCursorAdapter是和數(shù)據(jù)庫有關的東西。篇幅有限后面兩種就不舉例實踐了。你可以參考androidListView詳解orArrayAdapter,SimpleAdapter,SimpleCursorAdapter區(qū)別。
14.6網(wǎng)格視圖(GridView)
網(wǎng)格布局:是一個ViewGroup以網(wǎng)格顯示它的子視圖(view)元素,即二維的、滾動的網(wǎng)格。網(wǎng)格元素通過ListAdapter自動插入到網(wǎng)格。ListAdapter跟上面的列表布局是一樣的,這里就不重復累述了。下面也通過一個例子來,創(chuàng)建一個顯示圖片縮略圖的網(wǎng)格。當一個元素被選擇時,顯示該元素在列表中的位置的消息。
1)、首先,將上面實踐截取的圖片放入res/drawable/
2)、res/layour/main.xml的內容置為如下:這個GridView填滿整個屏幕,而且它的屬性都很好理解,按英文單詞的意思就對了。
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ù)跟通常一樣,首先調用超類的onCreate()函數(shù)函數(shù),然后通過setContentView()為活動(Activity)加載布局文件。緊接著是,通過GridView的id獲取布局文件中的gridview,然后調用它的
setListAdapter(ListAdapter)函數(shù)填充它,它的參數(shù)是一個我們自定義的ImageAdapter。后面的工作
跟列表布局中一樣,為監(jiān)聽網(wǎng)格中的元素被點擊的事件而做的工作。4)、實現(xiàn)我們自定義ImageAdapter,新添加一個類文件,它的代碼如下:
packageskynet.com.cnblogs.www;
importandroid.content.Context;importandroid.view.View;importandroid.view.ViewGroup;importandroid.widget.BaseAdapter;importandroid.widget.GridView;importandroid.widget.ImageView;
publicclassImageAdapterextendsBaseAdapter{privateContextmContext;
publicImageAdapter(Contextc){mContext=c;}
publicintgetCount(){returnmThumbIds.length;}
publicObjectgetItem(intposition){returnnull;}
publiclonggetItemId(intposition){return0;}
//createanewImageViewforeachitemreferencedbytheAdapterpublicViewgetView(intposition,ViewconvertView,ViewGroupparent){ImageViewimageView;
if(convertView==null){//ifit"snotrecycled,initializesomeattributes
imageView=newImageView(mContext);
imageView.setLayoutParams(newGridView.LayoutParams(85,85));imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);imageView.setPadding(8,8,8,8);}else{
imageView=(ImageView)convertView;}
imageView.setImageResource(mThumbIds[position]);returnimageView;}
//referencestoourimagesprivateInteger[]mThumbIds={
R.drawable.linearlayout1,R.drawable.linearlayout2,R.drawable.linearlayout3,R.drawable.listview,R.drawable.relativelayout,R.drawable.tablelayout};}
ImageAdapter類擴展自BaseAdapter,所以首先得實現(xiàn)它所要求必須實現(xiàn)的方法。構造函數(shù)和
getcount()函數(shù)很好理解,而getItem(int)應該返回實際對象在適配器中的特定位置,但是這里我們不需要。類似地,getItemId(int)應該返回元素的行號,但是這里也不需要。這里重點要介紹的是getView()方法,它為每個要添加到ImageAdapter的圖片都創(chuàng)建了一個新的View。當調用這個方法時,一個View是循環(huán)再用的,因此要確認對象是否為空。如果是空的話,一個ImageView就被實例化且配置想要的顯示屬性:
setLayoutParams(ViewGroup.LayoutParams):設置View的高度和寬度,這確保不管drawable中圖片的大小,每個圖片都被重新設置大小且剪裁以適應這些尺寸。
setScaleType(ImageView.ScaleType):聲明圖片應該向中心剪裁(如果需要的話)。
setPadding(int,int,int,int):定義補距,如果圖片有不同的橫縱比,小的補距將導致更多的剪裁以適合設置的ImageView的高度和寬度。
如果View傳到getView()不是空的,則本地的ImageView初始化時將循環(huán)再用View對象。在getView()方法末尾,position整數(shù)傳入setImageResource()方法以從mThumbIds數(shù)組中選擇圖片。運行程序會得到如下結果(點擊第一張圖片之后):
圖8、網(wǎng)格布局
14.6.1.17、絕對布局(AbsoluteLayout)
絕對布局:是一個ViewGroup以絕對方式顯示它的子視圖(view)元素,即以坐標的方式來定位在屏幕上位置。
這種布局方式很好理解,在布局文件或編程地設置View的坐標,從而絕對地定位。如下所示布局文件:
android:layout_x="20dip"android:layout_y="20dip">
簡單吧,這里不在深入了!
14.7標簽布局(TabLayout)
標簽布局:是一個ViewGroup以標簽的方式顯示它的子視圖(view)元素,就像在Firefox中的一個窗口中顯示多個網(wǎng)頁一樣。
為了狂創(chuàng)建一個標簽UI(tabbedUI),需要使用到TabHost和TabWidget。TabHost必須是布局的
根節(jié)點,它包含為了顯示標簽的TabWidget和顯示標簽內容的FrameLayout。
可以有兩種方式實現(xiàn)標簽內容:使用標簽在同一個活動中交換視圖、使用標簽在完全隔離的活動之間改變。根據(jù)你的需要,選擇不同的方式,但是如果每個標簽提供不同的用戶活動,為每個標簽選擇隔離的活動,因此你可以更好地以分離的組管理應用程序,而不是一個巨大的應用程序和布局。下面還有一個例子來創(chuàng)建一個標簽UI,每個標簽使用隔離的活動。
1)、在項目中建立三個隔離的Activity類:ArtistisActivity、AlbumActivity、SongActivity。它們每個表示一個分隔的標簽。每個通過TextView顯示簡單的一個消息,例如:
publicclassArtistsActivityextendsActivity{publicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);
TextViewtextview=newTextView(this);textview.setText("ThisistheArtiststab");setContentView(textview);}}
其它兩個類也類似。
友情提示:本文中關于《android軟件開發(fā)工程師轉正個人總結》給出的范例僅供您參考拓展思維使用,android軟件開發(fā)工程師轉正個人總結:該篇文章建議您自主創(chuàng)作。
來源:網(wǎng)絡整理 免責聲明:本文僅限學習分享,如產(chǎn)生版權問題,請聯(lián)系我們及時刪除。