安卓核心基礎(chǔ)筆記android第三天_第1頁(yè)
安卓核心基礎(chǔ)筆記android第三天_第2頁(yè)
安卓核心基礎(chǔ)筆記android第三天_第3頁(yè)
安卓核心基礎(chǔ)筆記android第三天_第4頁(yè)
安卓核心基礎(chǔ)筆記android第三天_第5頁(yè)
已閱讀5頁(yè),還剩85頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

數(shù)據(jù)庫(kù) )7.1.特簡(jiǎn)介,是一款輕量型的數(shù)據(jù)庫(kù),是遵守ACID(原子性、一致性、性、持久性)的關(guān)聯(lián)式數(shù)據(jù)庫(kù)管理系統(tǒng),多用于嵌入式開發(fā)中。Android平臺(tái)中嵌入了一個(gè)關(guān)系型數(shù)據(jù)庫(kù),和其他數(shù)據(jù)庫(kù)不同的是存除非是主鍵被定義為Integer,這時(shí)只能64位整創(chuàng)建數(shù)據(jù)庫(kù)的表時(shí)可以不指定數(shù)據(jù)類型,例如:CREATETABLE (idINTEGERPRIMARYKEYAUTOINCREMENT,name支持大部分標(biāo)準(zhǔn)SQL語(yǔ)句,增刪改查語(yǔ)句都是通用的,分頁(yè)查詢語(yǔ)句和MySQLSELECT*FROM LIMIT20OFFSET10SELECT*FROM LIMIT10,20與MySql的不同之處主鍵自增長(zhǎng):是autoincrementMySql是auto_increment 獲取可讀數(shù)據(jù)庫(kù)、可寫數(shù)據(jù)庫(kù)的區(qū)別AndroidJunit(AndroidJunit定義類繼承OpenHelper構(gòu)造函數(shù),4重寫onCreate()方法重寫upGrade()方法publicpublic*OpenHelperOpenHelper@paramcontext@paramname@paramfactory游標(biāo)結(jié)果集工廠,如果需要使用則需要自定義結(jié)果集工廠,null值代表使用默認(rèn)結(jié)果集工廠@paramversion OpenHelper(Contextcontext,Stringname,CursorFactoryintversion)super(context,name,factory,}publicvoidDatabasedb)//數(shù)據(jù)庫(kù)第一次被創(chuàng)建的時(shí)候執(zhí)行如下sql語(yǔ)句創(chuàng)建一 db.execSQL("create(idintegerprimarykeynamevarchar(20),phonevarchar(20),moneyinteger(20),age}@paramdb@paramoldVersion@paramenwVersionpublicpublicvoidDatabasedb,intoldVersion,intnewVersion)//if(oldVersion==1&&newVersion==2)db.execSQL("alter addcolumnbalance}}}創(chuàng)建一 OpenHelperTest類,用于測(cè)試上面的代碼OpenHelperTestextendsAndroidTestCaseDatabaseOpenHelperhelper= .db",null,DatabasewritableDatabase=return}}執(zhí)行完上面代碼后,通過(guò)DDMS,查 .itheima. .db-journal文件會(huì)被自動(dòng)創(chuàng)建,該文件是的一個(gè)臨時(shí)的日志文件,主要用于數(shù)據(jù)庫(kù)的事務(wù)回滾操作了。但是Android在測(cè)試類中創(chuàng)建該類對(duì)象,調(diào)用getWritableDatabase()或者如果數(shù)據(jù)庫(kù)不存在,創(chuàng)建數(shù)據(jù)庫(kù)文件,執(zhí)行onCreae()方法,并獲取數(shù)據(jù)庫(kù)對(duì)象如果數(shù)據(jù)庫(kù)存在,版本號(hào)沒有發(fā)生改變,直接獲取數(shù)據(jù)庫(kù)對(duì)象如果數(shù)據(jù)庫(kù)存在,版本號(hào)提升,先執(zhí) onUpgrade()方法,再獲取數(shù)據(jù)庫(kù)對(duì)數(shù)據(jù)庫(kù)并不是初始化MyHelper如果版本號(hào)降低,應(yīng)用降級(jí)。并且不重寫onDowngrade,就會(huì)調(diào)用父類的Android提供了一個(gè)名為Database的類,該類封裝了一些操作數(shù)據(jù)庫(kù)的API,使用該類可以完成對(duì)數(shù)據(jù)進(jìn)行添加(Create)、查詢(Retrieve)、更新(Update)和刪除(Delete)操作(這些操作簡(jiǎn)稱為CRUD)。和JDBC數(shù)據(jù)庫(kù)不同,操作數(shù)據(jù)庫(kù)無(wú)需加載驅(qū)動(dòng),不用獲取連接,直接可常用方法:獲 Database對(duì)象之后通過(guò)該對(duì)象直接可以執(zhí)行SQL語(yǔ)之類有更改行為的SQL語(yǔ)句Database.rawQuery():用于執(zhí)行select查詢語(yǔ)句。getReadableDatabase() getWritableDatabase()的區(qū)查看源代碼后我們發(fā)現(xiàn)getReadableDatabase()在通常情況下返回的就是getWritabeDatabae()方法最后會(huì)使用一個(gè)成員變量記住這個(gè)數(shù)據(jù)庫(kù)對(duì)象,下次打開時(shí)判斷是否重用Databaseinsert()、delete()、update()、query()四個(gè)方法也可以對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作,詳情參照7.3.4執(zhí)行SQLSQL語(yǔ)句能夠防止SQL注入execSQL(StringsqlCursorrawQuery(StringsqlStringselectionArgs):查詢(拼串方式,第二個(gè)參數(shù)傳null即可)。下面通過(guò)一個(gè)案例來(lái)演示通過(guò)執(zhí)行SQL實(shí)現(xiàn)對(duì)數(shù)據(jù)的增刪改查操作,這里使用本文檔中7.2章節(jié)中的工程(★★★★)。 intage=cursor.getInt(cursor.getColumnIndex("age"));Stringphone=cursor.getString(2);}}publicvoidDatabasedataBase=Stringsql="updatesetage=?where//將zhangsan的修改為18}publicvoidDatabasedataBase= s=newArrayList< Stringsql="selectname,age,phonefrom Cursorcursor=dataBase.rawQuery(sql,null);Stringname=intage=p=new }ps){}:在上面例子各個(gè)方法中,為了方便AndroidJunit我們發(fā)現(xiàn)在7.3.2中的query方法返回了一個(gè)Cursor,那么CursorCursor與JDBC中的ResultSeturor中一個(gè)行索引一個(gè)列索引,游標(biāo)中本身沒有數(shù)據(jù),它只是指向數(shù)據(jù)庫(kù)的索引,模擬一個(gè)行、列的表結(jié)構(gòu)。其起始位置是在-1的位置上的。moveToPreviou集的第一行,返回值為false,否則為true。moveToirst為fle,否則為true。moveToLast():用于將游標(biāo)移動(dòng)到結(jié)果集的最后一行,如果結(jié)果集為空,返回值為flse,否則為true。(update這些方法封裝了部分SQL語(yǔ)句,通過(guò)參數(shù)進(jìn)行拼接,這些方法實(shí)際上是給那些不太了解SL語(yǔ)法的開發(fā)者使用的(對(duì)我來(lái)講直接通過(guò)sql操作數(shù)據(jù)庫(kù)反而要簡(jiǎn)單的多,這兩種操作數(shù)據(jù)庫(kù)的方式要求都會(huì),開發(fā)過(guò)程中用什么方法就要看個(gè)人習(xí)慣和公司有無(wú)特殊規(guī)定了SL語(yǔ)法的程序員而言,直接使用execSQL()和rawQuery()方法執(zhí)行SQL語(yǔ)句就能完成數(shù)據(jù)的添加、刪除、更新、查詢操作。這四個(gè)方法主要是在使用內(nèi)容提供者時(shí)使用,因?yàn)閏ontentprovider中提供的增刪改查方法,與這一套一樣,方便調(diào)用傳參。(等學(xué)完ContentProvider自然明白)insertnullColumnHacknull,就無(wú)法插入一條空數(shù)據(jù)(2.3,4.0可以寫null)如果想插入空數(shù)據(jù),第二個(gè)參數(shù)必須寫一個(gè)列名(任意列名,無(wú)法構(gòu)建sql語(yǔ)句onentue:鍵值對(duì):鍵對(duì)應(yīng)列明,值對(duì)應(yīng)插入的值返回值ongd,插入的主鍵iddelete("update("表名",contentValuesquery下面通過(guò)代碼來(lái)演 操作數(shù)據(jù)庫(kù)的過(guò)程,我們這里直接使用本文7.2中工程,只需修 OpenHelperTest類中方法即可publicvoidinsert()DatabasedataBase=getDataBase();ContentValuesvalues=newContentValues();values.put("name","heima");values.put("age", 第一個(gè)參數(shù)table該字段的值設(shè)為NULLnullphone字段為空的時(shí)候系統(tǒng)自動(dòng)給其值設(shè)置為是表中的字段,value}","phone",publicvoiddelete()Databasedatabase=*第一個(gè)參數(shù)table*第二個(gè)參數(shù)whereClausenull則刪除表中*第三個(gè)參數(shù)whereArgs 數(shù),沒有寫null*刪除名字為"heima"database.delete("","name=?",new}publicvoidupdate()Databasedatabase=getDataBase();ContentValuesvalues=newContentValues();values.put("age","100");ContentValues設(shè)置要修改的字段的新值,沒有涉及到的 ",values,"name=?",new}publicvoidquery()Databasedatabase=第一個(gè)參數(shù)table第二個(gè)參數(shù)columnsselectionselectionArgsgroupBy分組字段,nullAfilterdeclarewhichrowgroupstoincludeintheifrowgrouisbeingused,formattedasanSQLHAVING(excludingtheHAVINGitself).Passingnullwillcauseallrowtobeincluded,andisrequiredwhenrowgrouisnotbeingorderBy排序字段,asc正序,desc倒序,nullCursorcursor=database.query("",newString[]{"name,age,phone"},"name=?",newString[]{"heima"},null,null,null);intid=Stringname=cursor.getString(1);System.out.println(id+"_"+name+"_"+}publicvoidDatabasedatabase=getDataBase();List< s=newArrayList< 該方法跟Cursorcursor= ",newnull,null,null,null,rsonp=new Stringname=intage=}}}跟MySql、Oracle等常用數(shù)據(jù)庫(kù)一樣, 數(shù)據(jù)庫(kù)也對(duì)事物有較好的支持。使用方法:beginTransaction() 結(jié)束事務(wù),包括提交和回滾,需要放在finally中執(zhí)行,否則事務(wù)只有到超時(shí)的時(shí)候才自動(dòng)結(jié)束,會(huì)降低數(shù)據(jù)庫(kù)并發(fā)效率執(zhí)行過(guò)程:beginTransactionendTransaction務(wù)的標(biāo)志是否為成功,如果程序執(zhí)行到endTransaction之前調(diào)用了setTransactionSuccessful方法設(shè)置事務(wù)的標(biāo)志為成功,則提交事務(wù);如果沒有調(diào)用setTransactionSuccessful方法則回滾事務(wù)。用本文檔7.2章節(jié)中的Android工程中的OpenHelperTest類即可。案例:銀行轉(zhuǎn)賬,需求:客戶lisi向zhangsan的賬戶上轉(zhuǎn)了100塊。publicpublicvoidOpenHelperonUpgradeOpenHelperhelper=OpenHelper(getContext(),null,Databasedatabase=try setbalance=balance-100name=?",new上面的扣除lsii的100元錢不會(huì)被真正執(zhí)行//inta1/0;注釋掉,才發(fā)現(xiàn)事務(wù)成功了,lisi100zhangsan100int setbalance=balance+100wherename=?",new功}提交事務(wù),如果}}在批量修改數(shù)據(jù)的時(shí)候,由于事務(wù)是在進(jìn)行事務(wù)提交時(shí)將要執(zhí)行的SQL操作打開數(shù)據(jù)庫(kù)連接執(zhí)行,其執(zhí)行速度比逐條執(zhí)行SQL語(yǔ)句的速度快了很多倍。因此當(dāng)我們開發(fā)的該案例依然使用本文檔7.2中的Android工程。OpenHelperOpenHelperhelper=OpenHelper(getContext(),null,Databasedatabase=longbeginTime=for(int }longendTime=不使用事務(wù)插入publicvoidbeginTime=for(inti=0;i<10000;i++){ }endTime=}執(zhí)行上面代碼,查看控制臺(tái),發(fā)現(xiàn)不使用事務(wù)耗時(shí)19397毫秒,使用事務(wù)耗時(shí)查看數(shù)據(jù)庫(kù)文查看數(shù)據(jù)庫(kù)有多種方法,上面章節(jié)的演示過(guò)程其實(shí)就是通過(guò)AndroidAPI的方 Expert工具2、通過(guò)Android3工具。通過(guò)Expert工Expert(/)是一款強(qiáng)大的 工具。從官網(wǎng)上的版本只能免費(fèi)試用30天,試用期過(guò)后如果繼續(xù)使用需要支付一定的在DDMS視圖中打開 然后打開Expert軟件, 數(shù)據(jù)拖拽到如下圖的左側(cè)區(qū)域即可Android提供了一個(gè)3.exe程序,位于sdk的tools 下,用于操作1、3數(shù)據(jù)庫(kù)名稱:進(jìn)入數(shù)據(jù)庫(kù)操作模式 eg:3contacts.db eg:.tables3、schema:查看查看庫(kù)中所有表的DDL語(yǔ)句eg:.schema4、help 5、headerson/off :顯示表頭,默認(rèn)off 6、modelist|column|insert|line|tabs|tcl|csv:改變輸出格式eg:.modecolumn NULL空值數(shù)據(jù)顯示問(wèn)題 eg:.nullValueNULL8、dump表名 生成形成表的SQLeq:.dump9、dump: 生成整個(gè)數(shù)據(jù)庫(kù)的SQLeq:.dump9、exit: 退出操作模式 eq:.exit 使用cd命令進(jìn)入數(shù)據(jù)庫(kù)所 (數(shù)據(jù)庫(kù)的路徑為”/data/data/應(yīng)用包名/databases/數(shù)據(jù)庫(kù)使用” 數(shù)據(jù)庫(kù)名”進(jìn)入數(shù)據(jù)庫(kù)操作模特點(diǎn)?不區(qū)分?jǐn)?shù)據(jù)類型等等,參照上邊的章節(jié)即可。數(shù)據(jù)庫(kù)如何?面試中有可能會(huì)被問(wèn)到,公司之前應(yīng)用的數(shù)據(jù)庫(kù)是如何的修改,就改下數(shù)據(jù)庫(kù)版本號(hào),然后在onUpgrade里調(diào)用即可。數(shù)據(jù)庫(kù)用事務(wù)么?每一個(gè)item對(duì)象。DataBase這個(gè)比較重要,每個(gè)應(yīng)用都會(huì)用到數(shù)據(jù)庫(kù),用到數(shù)據(jù)庫(kù)就要用到這個(gè)類。會(huì)使用增刪改查方法,事務(wù),以及execSQL即可。OpenHelper事務(wù) 重websql的開發(fā)人員,sql語(yǔ)句是必須要會(huì)的,所以大家一定要注意。多加練習(xí)!?。∪绻鹲qlListView的特點(diǎn):屏幕上可以展示幾個(gè)控件,ListView就初始化幾個(gè),節(jié)省內(nèi)存,防止內(nèi)存溢出。象個(gè)數(shù)為:屏幕顯示的條目的個(gè)數(shù)+1。ListView自帶ScrollView的功能,可以實(shí)現(xiàn)界面滾動(dòng)。ListView控件的設(shè)計(jì)遵循MVC設(shè)計(jì)模式:modeListViewview下面我們依然通過(guò)案例來(lái)演示ListViewActivityListViewListView。:布局文件的名字必須全部都是小寫創(chuàng)建ListView展示樣式布局文件,文件名為創(chuàng)建業(yè)務(wù)類操作數(shù)據(jù)庫(kù),在該工程中新創(chuàng) DaoOpenHelperhelper;helper= OpenHelper(context, ",null,}public > s=newArrayList< Cursorcursor=database.rawQuery("selectname,age,phonefromonp=new intage=cursor.getInt(1);} }}修改main_activity.xml>android:text="ListView中"使用并修改該工程默認(rèn) 類,MainActivity。該類的主要業(yè)務(wù)功能有調(diào)用Dao獲取ListViewBaseAdaptergetCountgetViewintgetCountListViewviewgetView(intposition,ViewconvertView,ViewGroupparent)第一個(gè):position:當(dāng)前要顯示的項(xiàng)在ListView第二個(gè):convertView:就是被拖出去的View對(duì)象,getView用這個(gè)對(duì)象使得拖出去即將銷毀的條目重用,即緩存對(duì)象。LisView中創(chuàng)建對(duì)象的個(gè)數(shù)=屏幕顯示的條目數(shù)+1為getView的參數(shù)傳遞進(jìn)來(lái)。只需修改此緩存對(duì)象的內(nèi)容,直接使用即可,而不需要再重新new一個(gè)新的對(duì)象出來(lái),節(jié)省了內(nèi)存,防止內(nèi)存溢出。在此方法的代碼中:ViewviewView.inflate(MainActivity.thisR.layout.item,null);通過(guò)這句代碼根據(jù)layout布局創(chuàng)建視圖view對(duì)象然后通過(guò)view.findViewById();可以獲取itemlayoutviewpublicObjectgetItem(intposition)return}publiclonggetItemId(intposition)return}publicViewgetView(intposition,ViewconvertView,ViewGroup{Viewif{view=}elseview=View.inflate(MainActivity.this,R.layout.listview_item,}TextViewtv_username=(TextView)view.findViewById(R.id.tv_username);TextViewtv_age=(TextView)view.findViewById(R.id.tv_age);TextViewtv_phone=(TextView)view.findViewById(R.id.tv_phone); return}}}至此,代碼和布局文件均已經(jīng)完成,運(yùn)行程序后效果圖如下ListView的OnItemClickListener條目點(diǎn)擊器實(shí)現(xiàn)此接口,重寫的方法:條目點(diǎn)擊publicvoidonItemClick(AdapterView<?>parent,Viewview,intposition,longparent:就是listview對(duì)象:可以通過(guò)parent.getItemAtPosition(position);獲取ListVIew適配器BaseAdapter的publicObjectgetItem(intposition)的返回值listview.setselection(item索引);//這樣可以定義到某個(gè)索引的itemListView的item條目數(shù):listView.getCount();復(fù)用舊的convertViewListView,在上下拖動(dòng)的時(shí)候,會(huì)不斷的加載View和銷毀View,我們可以復(fù)用if(convertViewnull//if(convertViewnull//viewview=}這個(gè)view對(duì)象為L(zhǎng)istView的適配器,getView返回的對(duì)象。減少view.findViewById(),查找控件的操作如果布局文件比較復(fù)雜,findviewById就比較耗時(shí)。在這里我們可以利用花名冊(cè)的辦法來(lái)減少查找操作:步驟:先定義記事本、花名冊(cè):staticclassview.setTag(objectidview分批加載:解決用戶體驗(yàn)問(wèn)題,不能解決內(nèi)存溢出(listView展示條目過(guò)多會(huì)出現(xiàn)內(nèi)存溢出),先加載幾十條,用戶拖動(dòng)到底部,顯示加載框,再去加載當(dāng)用戶拖到頁(yè)面底部:需要把下一次的部分?jǐn)?shù)據(jù)返回需要知道istview什么時(shí)候拖到底部isVeetOnSroLitener();設(shè)置滾動(dòng)器onSro()//滾動(dòng)的方法scroll_state_fling_idle_touch_scroll如果位置(從0開始)等于集合-1:說(shuō)明界面拖到最后一個(gè)元素,加載新數(shù)據(jù)arraylist.addall(newlist)adapter.分批加載并不能解決,內(nèi)存溢出問(wèn)題,只是改戶體 中使用的適配器有 BaseAdapter、ArrayAdapter、SimpleAdapter。8.1章節(jié)中我們演示了BaseAdapter的用法。下面通過(guò)兩個(gè)案例分別介紹ArrayAdapterSimpleAdapterArayAdapter不僅可以用于顯示簡(jiǎn)單的文本,也可以顯示樣式和內(nèi)容豐富的對(duì)象。在這里只演示其最簡(jiǎn)單的使用方法。為了方便演示,新創(chuàng)建一個(gè)Androd工程,工程名字就叫Adapter,使用該工程默認(rèn)的布局文件和Activity類。布局如下tools:context=".MainActivity">android:text="ArrayAdapter的使用MainActivity代碼如下packagepackageimportimportimportimportpublicclassMainActivityextendsActivityprivateListViewlv;{super.onCreate(savedInstanceState);lv=(ListView)findViewById(R.id.lv);Stringcitiesnew ","廣州","杭州ArrayAdapterArrayAdapter<String>myAdapter=newArrayAdapter<String>(this,android.R.layout.simple_list_item_1,cities);}}數(shù)據(jù)是以List<Map<String,?>>形式封裝數(shù)據(jù),List的每一節(jié)對(duì)應(yīng)ListView的每一行。HashMap的每個(gè)鍵值數(shù)據(jù)映射到布局文件中對(duì)應(yīng)id的組件上。因?yàn)橄到y(tǒng)沒有對(duì)應(yīng)的布局文件可用,我們可以自己定義一個(gè)布局文件。在本文檔中我們用TextView和ImageView組合來(lái)進(jìn)行布局以演示SimpleAdapter的用法。布局效果如下圖:tools:context=".MainActivity">tools:context=".MainActivity">>MainActivity類代碼publicpublicclassMainActivityextendsActivityprivateListViewlv;{super.onCreate(savedInstanceState);lv=(ListView)findViewById(R.id.lv);List<Map<String,Object>>list=newArrayList<Map<String,Object>>();Map<String,Object>map=newHashMap<String,Object>();map.put("icon",R.drawable.ic_launcher);map=newHashMap<String,map.put("text",map=newHashMap<String,map.put("text""廣州");map=newHashMap<String,Object>();map.put("text",map=newHashMap<String,map.put("text""杭州");SimpleAdapter第一個(gè)參數(shù)Context第二個(gè)參數(shù)dataidListView第四個(gè)參數(shù)String[]定義得Map中keyintidkeySimpleAdaptermyAdapter=newSimpleAdapter(this,list,newString[]{"icon","text"},newint[]{R.id.iv_icon,R.id.tv_text});}}Listview優(yōu)化Listview是重中之重,無(wú)論面試和工作,都常會(huì)涉及。具體如何優(yōu)化,上邊介紹的很ConvertViewxml減少如果只涉及到一個(gè)Item的某一個(gè)控件的更改,不應(yīng)該去刷新整個(gè)而是給這個(gè)控件使用setTag(Position)的方式設(shè)置不同的tag,然后使用ListView.findViewByTag,找到這個(gè)對(duì)應(yīng)的控件進(jìn)行更改(什么時(shí)候需要使用分批分頁(yè)加載當(dāng)然還有一些其他優(yōu)化,我在這里就不做闡述,可以自己去研究。適配器BaseAdapterListview優(yōu)化Android中的框Androd中常用的框有通知框、列表框、單選框、多選框以及其表選以由AertDilog.Buider建,進(jìn)度框由ProgressDilog創(chuàng)建。 設(shè)置框標(biāo)題欄左側(cè)的那個(gè)圖 設(shè)置框標(biāo)題欄的提示信 設(shè)置框主體部分的提示信 設(shè)置框在點(diǎn)擊返回鍵時(shí)是否會(huì)關(guān) 下面將通過(guò)案例分別介紹這五種框的用法。:為了方便演示,在這里需要?jiǎng)?chuàng)建一個(gè)新工程,工程名叫《框》。該工程的主界面有五個(gè)按鈕,這五個(gè)按鈕綁定了分別調(diào)用其對(duì)應(yīng)框的函數(shù),點(diǎn)擊不同的按鈕在其對(duì)應(yīng)的函數(shù)里展示不同的框。因此下面的操作默認(rèn)都是在該工程中實(shí)現(xiàn)的。該工程的布局文件如下通知框使用Builder創(chuàng)建,一般都會(huì)有個(gè)確認(rèn)和取消按鈕。當(dāng)通知框提示的信息是要求用戶必須且必須做出確定或者取消的選擇的時(shí)候,需要設(shè)置setCancelable屬性為false(默認(rèn)true),以防止用戶直接使用返回鍵關(guān)閉框。notifyDialog()方法代碼publicpublicvoidnotifyDialog(ViewBuilderbuilder=newBuilder(this); ,{publicvoidonClick(DialogInterfacedialog,intwhich){},{publicvoidonClick(DialogInterfacedialog,intwhich){} }列表框使用Builder來(lái)創(chuàng)建,只需調(diào)用Builder對(duì)象的setItems方法設(shè)置要展示}單選框使用Builder來(lái)創(chuàng)建,只需調(diào)用Builder對(duì)象的setSingleChoiceItems方 itemsintcheckedItemfinalOnClickListenerlistener)//選中選項(xiàng)觸發(fā)的點(diǎn)擊publicpublicvoidsingleDialog(ViewBuilderbuilder=newBuilder(this);finalString[]languages=new*器builder.setSingleChoiceItems(languages,0,newOnClickListener()publicvoidonClick(DialogInterfacedialog,int{Stringlanguage="+language,0).show();},{publicvoidonClick(DialogInterfacedialog,intwhich),}publicpublicvoidonClick(DialogInterfacedialog,intwhich),}}:該種類型的框在點(diǎn)擊選項(xiàng)的時(shí)候Toast即輸出您點(diǎn)擊的條目,但是此時(shí)該目后框自動(dòng)就。多選框使用Builder來(lái)創(chuàng)建,只需調(diào)用Builder對(duì)象的setMultiChoiceItems方法,setMultiChoiceItems(CharSequence[]items,//要展示的多選列表項(xiàng)finalOnMultiChoiceClickListenerlistener)//點(diǎn)擊,}}的框builder.setPositiveButton("確定"}框了消息機(jī)制Handler來(lái)進(jìn)行處理,所以它可以直接在子線程中進(jìn)行修改,無(wú)需再單獨(dú)設(shè)置Handler來(lái)修改UI。}}}}至此,常見的框都已經(jīng)演示完畢!當(dāng)然還有其他的一些框創(chuàng)建通知Toast.makeText(Contextcontext,CharSequencetext,intduration)Toast.makeText(Contextcontext,intresId,intduration)創(chuàng)建通知通過(guò)構(gòu)造函數(shù)創(chuàng)建:Notification(inticon,CharSequencetickerText,icon:通知的資源when:時(shí)間 ode,Intentintcontext ode:請(qǐng)求碼intentflagsPendingIntent中提供了常量選擇設(shè)置通知點(diǎn)擊調(diào)用Notification對(duì)象方法:setLatestEventInfo(Contextcontext,CharSequencecontentTitleCharSequencecontentTextPendingIntentcontextcontentTitle:標(biāo)題contentText:內(nèi)容contentIntent設(shè)置通知點(diǎn)擊后清除Notification對(duì)象屬性n.flagsc獲取系統(tǒng)通知服務(wù) tytmS發(fā)送消息Id是這個(gè)通知的id,如果id一樣,則只能發(fā)送一次通知具體代Notificationn=Notificationn=newNotification(R.drawable.feq," PendingIntentpi=PendingIntent.getActivity(this, newResultActivity.class),PendingIntent.FLAG_ONE_SHOT);n.setLatestEventInfo(this," 完成","FeiQ.exe n.flags=Notification.FLAG_AUTO_CANCEL;manager.notify(0,n);框知識(shí)點(diǎn)重點(diǎn)ctiviy,彈出框時(shí),生命周期方法:onpaue()、onReume()方法不會(huì)執(zhí)行因?yàn)榭蚴莄tvty的一部分。所以:構(gòu)造框的Builder(context),這個(gè)context是指定這個(gè)框掛載在哪activity獲取的是子類的activity,當(dāng)前activity的因?yàn)間etApplicationContext獲取的是父類的activity一般情況:可以用activity.this.代替activitydestorygetApplicationContextgetContext();測(cè)試框架類里獲取上下文,獲取到的是一個(gè)虛模擬的虛上下文dialog.setView();//根據(jù)View來(lái)顯示框那么就創(chuàng)建view相對(duì)應(yīng)的layot文件取消:dialog.dismiss()或者dialog.cancle()內(nèi)部調(diào)用*框publicvoidshowSetupPwdDialog()AlertDialog.Builderbuilder=newfinalViewview=View.inflate(this,R.layout.dialog_setup_pwd,//需要顯示創(chuàng)建dialog(一般調(diào)用show時(shí),會(huì)先判斷有木有 finalAlertDialogdialog=Buttonbtn_confirm=(Button)view.findViewById(R.id.btn_dialog_confirm);Buttonbtn_cancle=(Button)view.findViewById(R.id.btn_dialog_cancle);{publicvoidonClick(Viewv)StringToast.makeText(getApplicationContext(),"和再次不能為空",Toast.LENGTH_SHORT).show();return}t(),"兩次必須一致",return}Editoredit=sp.edit();}{publicvoidonClick(View{}}框的layoutActivityToast通知如何顯示任意時(shí)長(zhǎng) Toast?這個(gè)工作中也會(huì)碰到這樣的需求////顯示任意時(shí)長(zhǎng)的privatevoidlowAnyTimeToastAnyTimeToast.makeText(mContextwarnMsg);lowAnyTimeToast.show(60);//toast顯示時(shí)長(zhǎng)}}如何解決Toast在我們做項(xiàng)目時(shí),有時(shí)會(huì)用到Toast來(lái)給用戶提示某些信息,可當(dāng)用戶時(shí),連續(xù)重復(fù)的操作就會(huì)讓Toast不停的在頁(yè)面上顯示,很是影響用戶體驗(yàn)。解不用計(jì)算Toast的時(shí)間之類的,就是定義一個(gè)全局的成員變量Toast,這個(gè)Toast不為null的時(shí)候才去make,否則直接setText.為了按返回鍵后立即使ToastActivity的onBackPressedcancel你的Toast即可.通知框這個(gè)框用的會(huì)最多,但是其他的了解會(huì)用即可。通知 通知、狀態(tài)欄通知用的比較多需要掌握。自定義框有很多公司會(huì)要求不同風(fēng)格的框,所以需要自定義框。需要掌握在本章節(jié)中我們將用介紹ProgressBar、Spinner pleteTextView:為了便于演示我們新創(chuàng)建一個(gè)項(xiàng)目,項(xiàng)目名《常用控件》。使用默認(rèn)的布局文件和默認(rèn)的Activity類。tools:context=".MainActivity">"進(jìn)度條<!--android:maxandroid:progress下拉列表框<!--android:entriesandroid:text="自動(dòng)提示文本 <!--pletionThreshold21也 android:text="多個(gè)自動(dòng)提示文本 <!--pletionThresholdpletionThreshold21也 :在上面布局文件中Spinner控件有個(gè)比較特殊的屬性需要引入外部文件。加的字符串常量,作為Spinner<?<?xmlversion="1.0"encoding="utf-<string<string o<string-array MainActivity代碼如下importimportandroid.os.Bundle;importandroid.view.View;importimportimportimportandr importandroid.w importandroid.widget.ProgressBar;importimportpublicclassMainActivityextends{privateProgressBarprivateSpinner pleteTextView pleteTextView{super.onCreate(savedInstanceState);*progressBar=(ProgressBar)findViewById(R.gressBar);auto_tv=( pleteTextView)findViewById(R.id.auto_tv);multi_tv=( spinner=(Spinner)findViewById(R.id.spinner);*給spinner綁定選 *第三個(gè)參數(shù)positionpublicvoidonItemSelected(AdapterView<?>parent,Viewview,intlongid)

StringStringcity=(String)spinner.getItemAtPosition(position);Toast.makeText(MainActivity.this您選擇的是:city0).show();}*publicvoidonNothingSelected(AdapterView<?>{,"",}StringbooksnewString[]{"JavaScript網(wǎng)頁(yè)開發(fā)","Android源碼分析","深入理解JVM","Android-隨堂筆記","Android-面試寶典","JavaEE"};ArrayAdapter<String>ArrayAdapter<String>adapter=}*voidshowProgressBar()newThread(newRunnable()publicvoidrun()while(true)for(inti=0;i<100;i++)}}}}}進(jìn)度條進(jìn)度條,與進(jìn)度框有著類似的功能,也可以直接在子線程中控制其進(jìn)度的改變。同的是進(jìn)度條一般嵌入在我們自定義的布局文件中,而進(jìn)度框則單獨(dú)占據(jù)一個(gè)布局(該布局系統(tǒng)自帶提供)。下拉列表框ViewGroupAndroidAdapter自動(dòng)提示文本 pleteTextViewEditText 多個(gè)自動(dòng)提示文本 pleteTextView只能提示一次, pleteTextView使用不是很合適, pleteTextView.setTokenizer方法為此控件設(shè)置一個(gè)值與值之間的分 pleteTextView類似。Android中的樣式和fontColor、fontSize、layout_width、layout_heightXML文件中,并設(shè)置樣式的名稱。AndroidStyleCSS渲染Button控件的顯示效果。我們新創(chuàng)建一個(gè)Android工程,工程名稱《樣式和》。直接使用默認(rèn)布局文件和默認(rèn)Activity類。打開工程中res->values->styles.xml<<style<item<item<item<item <stylename="btn_style_child"<item在默認(rèn)布局文件中使用上面的自定義樣式。我們只需在如下布局文件中給一個(gè)stye屬性,那么所有屬性都會(huì)作用在該Button上tools:context=".MainActivity">android:text="Android中的樣式 "</Lar的定義與樣式的定義相同,都是定義在styles.xmlparent屬性來(lái)繼承一個(gè)父樣式,不同之處在于是作用在Activity上的通過(guò)定義AndroidManifest.xml文件中的<application>和<activity>節(jié)點(diǎn)下的”android:theme”屬性作用在整個(gè)應(yīng)用或者某個(gè)Activity,對(duì)整個(gè)應(yīng)用或某個(gè)Activity進(jìn)行全局性影響。如果一個(gè)應(yīng)用使用了,同時(shí)應(yīng)用下的view也使用了樣式,android系統(tǒng)也定義了一些主題,例如:<activity題,可以在文檔的reference-->android-->R.style中查看。繼續(xù)使用本文檔11.1中創(chuàng)建的工程。在res->values->styles.xml<style<!--window<item<!--window<stylename="them_noTitle_full"<item在AndroidManifest.xml中給添加樣式,如下圖黃色部分<!--<!--applicationactivity都適用<!--在activity中引 則當(dāng)前Activity適用--android:label="@string/app_name"><category也可以在Activity類中通過(guò)JavapublicpublicclassMainActivityextendsActivity{super.onCreate(savedInstanceState);//Activity}} 以上代碼中設(shè)置的是全屏功能,那么全屏通過(guò)代碼如何設(shè)置:activity中直接調(diào)用工作中會(huì)經(jīng)常用到樣式和,能看懂 后會(huì)修改即可Android實(shí)現(xiàn)的英文單詞是Internationalization,因?yàn)檫@個(gè)單詞太長(zhǎng)了,有時(shí)也簡(jiǎn)稱為I,18N后一個(gè)字母。所以,I18N也就是的意思。Android程序,也就是程序可以根據(jù)系統(tǒng)所使用的語(yǔ)言,將界面中的文字翻譯成與之對(duì)應(yīng)的語(yǔ)言。這樣,可以讓程序更加通用。Android可以通過(guò)資源文件非常方便的實(shí)現(xiàn)程序的。12.1Android在編寫Android項(xiàng)目時(shí),通常都是將程序中要使用的字符串資源放置在res/values目錄下的strings.xml文件中,為了給這些字符串資源實(shí)現(xiàn),可以在Android項(xiàng)目的res下,創(chuàng)建對(duì)應(yīng)于各個(gè)語(yǔ)言的資源文件夾(例如,為了讓程序兼容簡(jiǎn)體中文、繁體中 、values-zh-rTW和values-en-rUS的文件夾),然后在每個(gè)文件夾中創(chuàng)建一個(gè)對(duì)應(yīng)的strings.xml文件,并在該文件中定義對(duì)也可以進(jìn)行,同字符串的類似,只需根據(jù)程序要兼容的語(yǔ)言版本,分別 ,drawable-zh-rTW這樣的文件夾,將資源存放在文12.2.示下面通過(guò)一個(gè)案例來(lái)演示的使用方法在res文件下分別創(chuàng)建 下創(chuàng)建strings.xml文件。 /settings.xml添加內(nèi)容如下<?<?xmlversion="1.0"encoding="utf-<string<string 給values-zh-rTW/settings.xml<?<?xmlversion="1.0"encoding="utf-<string 在res文件下分別創(chuàng)建 和drawable-zh-rTW文件夾,向里面各自添加一個(gè)flag.jpg的。第一個(gè)為為五星、第二個(gè)為白日旗。的名字tools:context=".MainActivity"> o_world"設(shè)置模擬器的語(yǔ)言為簡(jiǎn)體中文 -12.3 在android3.0中又引入了一個(gè)新的動(dòng)畫系統(tǒng):propertyanimation,這三種動(dòng)畫模式在SDK中被稱為propertyanimation,viewanimation,drawableanimation。在本文檔中只介紹tweenanimation和frameanimation。FrameAnimation(幀動(dòng)畫):創(chuàng)建一個(gè)Drawable序列,這些Drawable可以按照指定的時(shí)間間隔一個(gè)一個(gè)的顯示,也就是順序事先做好的圖像TweenAnimation(漸變動(dòng)畫):通過(guò)對(duì)特定的對(duì)象做圖像變換如平移、縮放、旋轉(zhuǎn)、淡出/淡入等產(chǎn)生動(dòng)畫效果。幀動(dòng)畫DrawableAnimation(FrameAnimation):幀動(dòng)畫,就像GIF,通過(guò)一系下面通過(guò)一個(gè)案例來(lái)演示幀動(dòng)畫的使用方法。新創(chuàng)建一個(gè)工程《Android將準(zhǔn)備好的文件放到res/drawable- 中如果大家缺乏資源可以隨便放進(jìn)去幾張就行,只要起到練習(xí)代碼的作用就行在項(xiàng)目的res下創(chuàng)建文件夾drawable,然后在文件夾下面定義動(dòng)畫XML文件,文件名稱可以自定義(AnimationDrawable效果),這里給改xml文件起名為frame_anim.xml。xmlanimation-list>,可以在此根節(jié)點(diǎn)中設(shè)置在根節(jié)點(diǎn)<animation-list>下為幀動(dòng)畫的每幅圖片添加一個(gè)<item>節(jié)點(diǎn),節(jié)點(diǎn)的”android:drawable”屬性是的資源id,”android:duration”屬性指定展示的時(shí)間(一般每秒展示5-8張就可以感受到動(dòng)畫的效果)。<<itemandroid:drawable="@drawable/a2" item不再展 編寫默認(rèn)的ActivitypublicpublicclassMainActivityextendsActivityprivateImageView{super.onCreate(savedInstanceState);iv=(ImageView)findViewById(R.id.iv);animationDrawable= }publicvoidstartAnimation(Viewview){//}}:在動(dòng)畫start()之前要先stop(),不然在第一次動(dòng)畫之后會(huì)停在最后一幀,這樣動(dòng)最后一點(diǎn)是SDK中提到的,不要在onCreate中調(diào)用start,因?yàn)锳nimationDrawable還沒有完全跟Window相關(guān)聯(lián),如果想要界面顯示時(shí)就開始動(dòng)畫的話,可以在onWindowFoucsChanged()中調(diào)用start()。漸變動(dòng)畫漸變包括:包括平移、縮放、旋轉(zhuǎn)、改變動(dòng)畫效果的定義可以采用XML來(lái)做也可以采用java代碼來(lái)做。補(bǔ)間動(dòng)畫有4Animation: 指定重復(fù)的模式(如:反轉(zhuǎn) ImageView: startAnimation(Animationa)讓ImageViewAlpha漸變動(dòng)畫漸變動(dòng)畫在代碼中使用的是AphAnimation類來(lái)定義,在XML文件中使用<apha>節(jié)點(diǎn)來(lái)定義。XMLJavaAlpha用本文檔13.1章節(jié)中的工程。使用XML文件實(shí)現(xiàn)Alpha在 下創(chuàng)建anim文件在anim文件夾中創(chuàng)建alpha_anim.xml編輯alpha_anim.xml文件,文件如下<?<?xmlversion="1.0"encoding="utf-<alphaxmlns:android="http://s>JavaAnimationUtilsxmlstartAnimationImageViewpublicvoidstartAlphaAnimation(ViewAnimationanimation=AnimationUtils.loadAnimationpublicvoidstartAlphaAnimation(ViewAnimatio

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論