黑馬程序員:三大框架Struts2-day01筆記
第1章 框架概述
什么是框架,為什么使用框架,框架優(yōu)點(diǎn)
框架(framework)是一個(gè)基本概念上的結(jié)構(gòu),用于去解決或者處理復(fù)雜的問(wèn)題
框架,即framework。其實(shí)就是某種應(yīng)用的半成品,就是一組組件,供你選用完成你自己的系統(tǒng)。簡(jiǎn)單說(shuō)就是使用別人搭好的舞臺(tái),你來(lái)做表演。框架是在特定的領(lǐng)域內(nèi)解決問(wèn)題。優(yōu)點(diǎn)
重用代碼大大增加,軟件生產(chǎn)效率和質(zhì)量也得到了提高
使用框架開(kāi)發(fā),它提供統(tǒng)一的標(biāo)準(zhǔn),大大降低了我們的后期維護(hù)。學(xué)習(xí)框架重點(diǎn):了解框架做了什么,我們要在這個(gè)基礎(chǔ)上在做什么事情。
第2章 java開(kāi)發(fā)中常用框架
SSH
(SSM SSI)SSH struts2 spring hibernate SSM(SSI)springmvc spring mybatis(ibatis)
SSH 它是企業(yè)開(kāi)發(fā)中比較主流的一套架構(gòu)。SSH框架在開(kāi)發(fā)中所處的位置:
黑馬程序員鄭州中心 編著
第3章 Struts2框架介紹
什么是struts2框架,學(xué)習(xí)struts2框架的核心。
Struts2是一個(gè)基于MVC設(shè)計(jì)模式的Web應(yīng)用框架,它本質(zhì)上相當(dāng)于一個(gè)servlet,在MVC設(shè)計(jì)模式中,Struts2作為控制器(Controller)來(lái)建立模型與視圖的數(shù)據(jù)交互
Struts2=struts1+webwork
問(wèn)題:struts2是一個(gè)mvc框架,它的mvc是什么?
javaweb開(kāi)發(fā)中的mvc,是在jsp的model2模式中提過(guò) Model------javabean View--------jsp Controller----servlet
黑馬程序員鄭州中心 編著
核心點(diǎn): 1.攔截器 interceptor 2.Action 3.ognl與valueStack
在現(xiàn)在開(kāi)發(fā)中與struts2比較類(lèi)似的框架有哪些? Struts1 webwork springmvc jsf
Struts2框架流程
黑馬程序員鄭州中心 編著
第4章 今天內(nèi)容介紹與重點(diǎn)
今天內(nèi)容:
一個(gè)簡(jiǎn)單的登錄案例
在這個(gè)案例中,我們要使用struts2框架怎樣解決
重點(diǎn): 1.struts2框架如何完成原來(lái)由servlet完成的工作。2.Struts2框架如何完成請(qǐng)求參數(shù)的封裝處理 3.Struts2框架如何完成頁(yè)面跳轉(zhuǎn)。
黑馬程序員鄭州中心 編著
第5章 簡(jiǎn)單登錄案例原型
需要三個(gè)jsp頁(yè)面
login.jsp
success.jsp failer.jsp 還需要一個(gè)servlet
LoginServlet 主要完成的是業(yè)務(wù)邏輯操作。
login.jsp
LoginServlet
黑馬程序員鄭州中心 編著
第6章 Struts2框架來(lái)完成登錄操作
6.1 問(wèn)題:為什么使用struts2框架?
Struts2框架它是一個(gè)在web中應(yīng)用的mvc框架。我們使用strtus2框架來(lái)完成web開(kāi)發(fā)有什么優(yōu)勢(shì)?
6.2 問(wèn)題:怎樣使用strtuts2框架
首先要上網(wǎng)下載它的jar包。步驟: 1.導(dǎo)入相關(guān)的jar文件
2.需要在web.xml文件中配置一個(gè)Filter(只有配置了它才可以使用struts2框架)
黑馬程序員鄭州中心 編著
3.struts.xml配置
4.創(chuàng)建Action來(lái)完成邏輯操作
6.3 快速入門(mén)
我們使用的是struts2 2.3.24版本
我們使用strtus2框架不是直接將它的lib包下的所有的jar文件copy到項(xiàng)目中,而是使用其中的一部分。
我們可以參考它的示例代碼:
1.導(dǎo)入13個(gè)jar包
2.需要在web.xml文件中配置StrutsPrepareAndExecuteFilter 3.創(chuàng)建一個(gè)struts.xml文件,它的位置是可以放置在src下。
黑馬程序員鄭州中心 編著
6.3.1 代碼實(shí)現(xiàn) 6.3.1.1 jsp頁(yè)面
6.3.1.2 Action
6.3.1.3 struts.xml文件配置
6.3.2 流程分析
黑馬程序員鄭州中心 編著
6.4 使用struts2完成簡(jiǎn)單登錄操作
1.login.jsp頁(yè)面不變動(dòng)
2.創(chuàng)建一個(gè)LoginAction來(lái)完成邏輯操作 3.在struts.xml文件中完成配置操作
問(wèn)題1:在LoginAction中如何得到username與password 可以直接在Action類(lèi)中提供成員屬性,并為其提供get/set方法。就可以得到請(qǐng)求參數(shù)
問(wèn)題2:如果實(shí)現(xiàn)路徑跳轉(zhuǎn)?
1.我們可以給action中的方法添加一個(gè)String返回值
2.在struts.xml配置文件中,在其對(duì)應(yīng)的action配置上通過(guò)來(lái)確定跳轉(zhuǎn)的路徑。
黑馬程序員鄭州中心 編著
第7章 Struts2框架執(zhí)行流程
7.1 Struts2源碼導(dǎo)入
對(duì)于struts2框架它的源代碼我們主要使用三部分 1.struts2核心部分源代碼
org.apache.struts2xx
srccoresrcmainjava
2.struts2的xwork核心部分源代碼
srcxwork-coresrcmainjavacomopensymphonyxwork2 3.struts2的插件的源代碼
srcplugins 7.2 關(guān)于struts.xml配置文件中提示問(wèn)題
第一步
在eclipse的window下首選面中查找xml catalog 第二步
Location:配置本地的dtd文件路徑 key type:選擇URI
黑馬程序員鄭州中心 編著
Key: http://struts.apache.org/dtds/struts-2.3.dtd
注意版本要對(duì)應(yīng),如果你可以上網(wǎng),那么會(huì)自動(dòng)緩存dtd,具有提示功能。
7.3 執(zhí)行流程介紹
1.當(dāng)通過(guò)瀏覽器發(fā)送一個(gè)請(qǐng)求
2.會(huì)被StrutsPrepareAndExecuteFilter攔截
3.會(huì)調(diào)用strtus2框架默認(rèn)的攔截器(interceptor)完成部分功能 4.在執(zhí)行Action中操作
5.根據(jù)Action中方法的執(zhí)行結(jié)果來(lái)選擇來(lái)跳轉(zhuǎn)頁(yè)面Resutl視圖
一般管StrutsPrepareAndExecuteFilter 叫做前端控制器(核心控制器),只有配置了這個(gè)filter我們的strtus2框架才能使用。
黑馬程序員鄭州中心 編著
Strtus2的默認(rèn)攔截器(interceptor)它們是在struts-default.xml文件中配置 注意:這上x(chóng)ml文件是在strtus-core.jar包中。默認(rèn)的攔截器是在defaultStack中定義的。
第8章 Struts2配置詳解
8.1 Struts2配置文件加載順序
第一個(gè)加載的是default.properties文件
位置:strtus2-core.jar包
org.apache.struts2包下 作用:主要是聲明了struts2框架的常量
第二個(gè)加載的是一批配置文件
Strtus-default.xml 位置:struts2-corl.jar
作用:聲明了interceptor result bean Strtus-plugin.xml 位置:在strtus2的插件包中 作用:主要用于插件的配置聲明 Strtus.xml
黑馬程序員鄭州中心 編著
位置:在我們自己的工程中
作用:用于我們自己工程使用strtus2框架的配置 第三個(gè)加載的是自定義的strtus.properties 位置:都是在自己工程的src下 作用:定制常量 第四自定義配置提供
第五加載的是web.xml配置文件
主要是加載strtus2框架在web.xml文件中的相關(guān)配置.第六 bean相關(guān)配置
重點(diǎn)掌握: 1.Default.properties 2.Struts-default.xml 3.Struts-plugin.xml 4.Strtus.xml 5.web.xml
8.2 struts.xml文件配置介紹
8.2.1 package配置
1.name屬性
作用:定義一個(gè)包的名稱(chēng),它必須唯一。
黑馬程序員鄭州中心 編著
2.namespace屬性 作用:主要是與action標(biāo)簽的name屬性聯(lián)合使用來(lái)確定一個(gè)action 的訪(fǎng)問(wèn)路徑
3.extends屬性 作用:指定繼承自哪個(gè)包。一般值是strtus-default strtus-default包是在strtus-default.xml文件中聲明的。
4.abstruct屬性 它代表當(dāng)前包是一個(gè)抽象的,主要是用于被繼承
8.2.2 action配置
1.name屬性 作用:主要是與package的namespace聯(lián)合使用來(lái)確定一個(gè)action的訪(fǎng)問(wèn)路 徑
2.class屬性
作用:用于指示當(dāng)前的action類(lèi)
3.method屬性
作用:用于指示當(dāng)前的action類(lèi)中的哪個(gè)方法執(zhí)行
8.2.3 result配置
它主要是用于指示結(jié)果視圖
1.name屬性 作用是與action類(lèi)的method方法的返回值進(jìn)行匹配,來(lái)確定跳轉(zhuǎn)路徑 2.type屬性 作用是用于指定跳轉(zhuǎn)方式
8.2.4 擴(kuò)展
關(guān)于action配置中的class與method的默認(rèn)值以及result中的name與type 默認(rèn)值問(wèn)題
原因:strtus-default.xml文件中配置
黑馬程序員鄭州中心 編著
它的作用就是當(dāng)一個(gè)請(qǐng)求來(lái)時(shí),如果查找不到指定的class及對(duì)應(yīng)的method就會(huì)執(zhí)行 ActionSupport類(lèi)中的execute方法。
在這個(gè)類(lèi)的execute方法中默認(rèn)返回的是”success”
也就是說(shuō),result的name屬性默認(rèn)值是success,默認(rèn)的跳轉(zhuǎn)方式是請(qǐng)求轉(zhuǎn)發(fā) dispatcher
8.3 常量配置
default.properties文件中定義了struts2框架常用常量.問(wèn)題:我們?cè)鯓涌梢远x常量
1.可以在src下創(chuàng)建一個(gè)strtus.properties配置文件 2.可以在web.xml文件中配置
3.可以直接在strtus.xml文件中定義常量(推薦)
注意:后加載的配置文件中的常量會(huì)將先加載的常量覆蓋
第9章 Struts2的Action詳解
Struts2中的action,主要是完成業(yè)務(wù)邏輯操作。Action替代在servlet中完成的作用。
黑馬程序員鄭州中心 編著
Action的學(xué)習(xí)主要有兩點(diǎn)
1.如何創(chuàng)建一個(gè)struts2的action 2.如果訪(fǎng)問(wèn)一個(gè)struts2的action
1. Action類(lèi)創(chuàng)建方式(三種)1.創(chuàng)建一個(gè)pojo類(lèi)
Pojo(plani Ordinary java object)簡(jiǎn)單的java對(duì)象 Pojo類(lèi)就是沒(méi)有實(shí)現(xiàn)任何接口沒(méi)有繼承任何類(lèi) 優(yōu)點(diǎn):無(wú)耦合
缺點(diǎn):所有的功能都要自己完成
2.創(chuàng)建一個(gè)類(lèi)實(shí)現(xiàn)一個(gè)Action接口
com.opensymphony.xwork2.Action
在Action接口中定義了五個(gè)常量,一個(gè)execute方法 五個(gè)常量:它們是默認(rèn)的五個(gè)結(jié)果視圖: ERROR : 錯(cuò)誤視圖
INPUT: 它是struts2框架中interceptor中發(fā)現(xiàn)問(wèn)題后會(huì)訪(fǎng)問(wèn)的一個(gè)視圖 LOGIN:它是一個(gè)登錄視圖,可以在權(quán)限操作中使用
黑馬程序員鄭州中心 編著
NONE:它代表的是null,什么都不做(也不會(huì)做跳轉(zhuǎn)操作)SUCCESS:這是一個(gè)成功視圖 優(yōu)點(diǎn):耦合度低
缺點(diǎn):還是需要自己來(lái)完成功能
3.創(chuàng)建一個(gè)類(lèi)繼承ActionSupport類(lèi)
com.opensymphony.xwork2.ActionSupport ActionSupport類(lèi)也實(shí)現(xiàn)了Action接口。我們?cè)陂_(kāi)發(fā)中一般會(huì)使用這種方案: 優(yōu)點(diǎn):具有豐富的功能,例如
表單校驗(yàn) 錯(cuò)誤信息設(shè)置
國(guó)際化 缺點(diǎn):耦合度高
9.1 action的訪(fǎng)問(wèn)方式
1.直接通過(guò)標(biāo)簽來(lái)配置,通過(guò)method來(lái)指定訪(fǎng)問(wèn)的方法,如果method沒(méi)有,默認(rèn)訪(fǎng)問(wèn)的是execute方法。
2.簡(jiǎn)化的action訪(fǎng)問(wèn)方式,可以使用*通配符來(lái)訪(fǎng)問(wèn)。
這種方式的缺點(diǎn):不建議使用過(guò)多的*號(hào),它帶來(lái)程序閱讀障礙,不便于理解 使用*來(lái)簡(jiǎn)化操作方案,它對(duì)名稱(chēng)規(guī)范必須進(jìn)行一個(gè)統(tǒng)一。
黑馬程序員鄭州中心 編著
9.2 擴(kuò)展--動(dòng)態(tài)方法調(diào)用
這是strtus2提供的動(dòng)態(tài)方法調(diào)用。
注意:對(duì)于strtus2的動(dòng)態(tài)方法調(diào)用,要想使用我們必須配置一個(gè)常量來(lái)開(kāi)啟動(dòng)態(tài)方法調(diào)用
這代表動(dòng)態(tài)方法調(diào)用沒(méi)有開(kāi)啟
黑馬程序員鄭州中心 編著
個(gè)人不建議使用動(dòng)態(tài)方法調(diào)用
第10章 Struts2框架封裝數(shù)據(jù)
主要解決的問(wèn)題:是在action中如果獲取請(qǐng)求參數(shù)
主要有兩種方式: 1.屬性驅(qū)動(dòng)
a.直接在action類(lèi)中提供與請(qǐng)求參數(shù)匹配屬性,提供get/set方法
b.在action類(lèi)中創(chuàng)始一個(gè)javaBean,對(duì)其提供get/set,在請(qǐng)求時(shí)頁(yè)面上要進(jìn)行修改,例如 user.username user.password ,要使用ognl表達(dá)式
以上兩種方式的優(yōu)缺點(diǎn): 第一種比較簡(jiǎn)單,在實(shí)際操作我們需要將action的屬性在賦值給模型(javaBean)去操作 第二種:不需要在直接將值給javaBean過(guò)程,因?yàn)橹苯訉?shù)據(jù)封裝到了中。它要求在頁(yè)面上必須使用ognl表達(dá)式,就存在頁(yè)面不通用問(wèn)題。javaBean
2.模型驅(qū)動(dòng)
步驟: 1.讓Action類(lèi)要實(shí)現(xiàn)一個(gè)指定接口ModelDriven 2.實(shí)例化模型對(duì)象(就是要new出來(lái)javaBean)3.重寫(xiě)getModel方法將實(shí)例化的模型返回。
黑馬程序員鄭州中心 編著
對(duì)于模型驅(qū)動(dòng)它與屬性驅(qū)動(dòng)對(duì)比,在實(shí)際開(kāi)發(fā)中使用比較多,模型驅(qū)動(dòng)缺點(diǎn),它只能對(duì)
一個(gè)模型數(shù)據(jù)進(jìn)行封裝。
第11章 總結(jié)
今天主要內(nèi)容是圍繞著簡(jiǎn)單的登錄案例來(lái)講解: 1.關(guān)于strtus2框架的環(huán)境搭建 2.關(guān)于strtus2框架配置 3.關(guān)于strtus2框架請(qǐng)求參數(shù)封裝 4.關(guān)于strtus2框架的路徑跳轉(zhuǎn)
關(guān)于action訪(fǎng)問(wèn)的配置
黑馬程序員鄭州中心 編著
namespace=””
extends=””> class=””
method=””>
路徑
關(guān)于路徑跳轉(zhuǎn)問(wèn)題: 是通過(guò)來(lái)配置跳轉(zhuǎn)的路徑.它的name屬性是與action中的方法的返回值進(jìn)行對(duì)比的。它的type屬性可以取哪些值?
默認(rèn)值是dispatcher 它代表的是請(qǐng)求轉(zhuǎn)發(fā)。針對(duì)于jsp頁(yè)面 redirect 它代表的是重定向
針對(duì)于jsp頁(yè)面
chain 它類(lèi)似于請(qǐng)示轉(zhuǎn)發(fā),只不過(guò)它是針對(duì)于action跳轉(zhuǎn).redirectAction 它類(lèi)似于重定向
針對(duì)于action 關(guān)于路徑跳轉(zhuǎn)的配置
可以直接在
下創(chuàng)建全局的result
黑馬程序員鄭州中心 編著
黑馬程序員鄭州中心 編著
【黑馬程序員】Java基礎(chǔ) : Java語(yǔ)句筆記
摘要: Java基礎(chǔ)—java語(yǔ)句這些是黑馬程序員java基礎(chǔ)入門(mén)的一個(gè)很重要的內(nèi)容。今天主要給大家簡(jiǎn)單講解一下Java基礎(chǔ)—java語(yǔ)句,以后會(huì)慢慢講解黑馬程序員的課程內(nèi)容!
關(guān)鍵語(yǔ)句介紹
一、while 語(yǔ)句 一般形式:
whi l e(條件表達(dá)式){ 語(yǔ)句體 ……… } 執(zhí)行過(guò)程:
條件表達(dá)式為真,執(zhí)行語(yǔ)句體。否則,退出!
二、do while 語(yǔ)句 一般形式: do { 語(yǔ)句體 …….} while(條件表達(dá)式);執(zhí)行過(guò)程:
先執(zhí)行一次語(yǔ)句體,判斷 條件表達(dá)式是否為真,為真再執(zhí)行do語(yǔ)句中的語(yǔ)句體。為假,退出。
需要注意:與whi l e語(yǔ)句區(qū)別
黑馬程序員合肥中心 編著
1.while(條件表達(dá)式)后面有分號(hào);2.不管條件表達(dá)式是否為真,語(yǔ)句體均會(huì)執(zhí)行一次。
三、for 語(yǔ)句 一般形式:
for(子句 1;子句 2;子句 3){ 語(yǔ)句體 …… } 執(zhí)行過(guò)程:
四、break、cont inue 語(yǔ)句 break 退出所在循環(huán) : int stopHere = 5;for(int i=1;i<8;i++){ if(i == stopHere){ break;} System.out.println(“i = ” + i);
黑馬程序員合肥中心 編著
} //打印結(jié)果:5,6,7,8均沒(méi)有打印出來(lái)。
需要注意的一個(gè)問(wèn)題: int stopHere = 5;for(int i = 1;i < 8;i + +){ if(i = = stopHere){ / /語(yǔ)句體 } break;System.out.println(“i = ” + i);} 這個(gè)時(shí)候編譯器會(huì)報(bào)錯(cuò):無(wú)效的 System.out 輸出語(yǔ)句。冷靜分析一下:
break 語(yǔ)句會(huì)結(jié)束循環(huán),所以不會(huì)再去執(zhí)行 System.out 輸出語(yǔ)句。編譯會(huì)認(rèn)為你在多此一舉,sorry 報(bào)個(gè)錯(cuò)!
continue 退出本次循環(huán),不會(huì)退出整個(gè)循環(huán): int skipHere = 5;for(int i = 1;i < 8;i + +){ if(i = = skipHere){ continue;}
黑馬程序員合肥中心 編著
System.out.println(“i = ” + i);} / /打印結(jié)果:除了5沒(méi)有打印出來(lái)。
i = 1 i = 2
五、switch 語(yǔ)句 一般形式: switch(常量){ case 表達(dá)式1:語(yǔ)句體1;break;case 表達(dá)式2:語(yǔ)句體2;break;.....default : 語(yǔ)句體n;break;}
執(zhí)行過(guò)程: 執(zhí)行過(guò)程:
case 根據(jù)自己的表達(dá)式看是否匹配常量,如果匹配就執(zhí)行語(yǔ)句體,否則執(zhí)行 default 語(yǔ)句。
case 執(zhí)行類(lèi)似于并行操作,不是順序操作。所以各個(gè)表達(dá)式的值不可以相同。
黑馬程序員合肥中心 編著
哪個(gè) case 匹配常量就會(huì)執(zhí)行自己的語(yǔ)句體,不會(huì)再去尋找其他 case 語(yǔ)句。注意:
<1> case 穿透:省去break關(guān)鍵字
[AppleScript] 純文本查看 復(fù)制代碼 ?
01 /**
02 * @author 傳智播客 03 */
04 int i = 10;05 switch(i){ 06 case 10:
07 System.out.println(“ A”);08 //break;09 case 5: System.out.println(“ B”);11 //break;12 case 7: System.out.println(“ C”);14 //break;15 default : System.out.println(“ error”);17 break;18 }//打印結(jié)果:A B C error
<2> 在 Java 編程中 switch 括號(hào)中的常量的數(shù)據(jù)類(lèi)型只可以為 int 類(lèi)型或者是 byte、char、short(因?yàn)?byte、char、short 可以自動(dòng)提升為 int),常量類(lèi)型不可以是 long、float 和 double 等數(shù)據(jù)類(lèi)型。<3> 多個(gè) case 可以合并 , 相當(dāng)于 “ 或 ”,例如下面 i 等于 10、5、7 都可以執(zhí)行打印語(yǔ)句。
[AppleScript] 純文本查看 復(fù)制代碼 ?
01 /**
02 * @author 傳智播客 03 */
04 int i = 5;05 switch(i){ 06 case 10: 07 case 5: 08 case 7:
09 System.out.println(“ C”);10 break;11 default : System.out.println(“ error”);13 break;
黑馬程序員合肥中心 編著 }//打印結(jié)果:C <4> default 語(yǔ)句可以省,但是不推薦,他后面的 break 可省 <5> case 或者 default 子句中可以寫(xiě)多條語(yǔ)句 case 7: System.out.println(“ C”);if(i == 5){ System.out.println(“ i = ” +i);} break;<6> case 或者 default 子句中還可以嵌套 switch 或者其他語(yǔ)句
六、return 語(yǔ)句
終止方法的運(yùn)行并指定要返回的數(shù)據(jù)。兩種形式:
<1> return 表達(dá)式;
<2> return ;沒(méi)有任何數(shù)據(jù)直接返回,結(jié)束函數(shù)(方法)的執(zhí)行。
七、if 語(yǔ)句
一般形式:
1.if(條件表達(dá)式){ 語(yǔ)句體} 2.if(條件表達(dá)式){ 語(yǔ)句體} else{語(yǔ)句體 } 3. if(條件表達(dá)式1){ 語(yǔ)句體} else if(條件表達(dá)式2){語(yǔ)句體 } else {語(yǔ)句體 }
特別注意:形式3,else與其最近的上個(gè)if 配對(duì)。例子:
[AppleScript] 純文本查看 復(fù)制代碼 ?
黑馬程序員合肥中心 編著
01 /**
02 * @author 傳智播客 03 */
04 public class TestIF {
05 public static void main(String[] args){ 06 int i = 30;07 if(i < 20){
08 System.out.println(“<20”);09 } else if(i < 50){ System.out.println(“<50”);11 } else if(i < 80){ System.out.println(“<80”);13 } else System.out.println(“>=80”);15 System.out.println(“黑馬程序員!”);16 }
如果大家想學(xué)習(xí)java基礎(chǔ)的知識(shí),歡迎大家可以去傳智播客官網(wǎng)http://004km.cn/去了解java基礎(chǔ)知識(shí)!
黑馬程序員合肥中心 編著
01、什么是3G 02、android系統(tǒng)簡(jiǎn)介 03、android背景介紹 04、android的framewor簡(jiǎn)介 05、兩種虛擬機(jī)的比較 06、sdk的下載以及簡(jiǎn)介 07、創(chuàng)建android模擬器 08、ddms簡(jiǎn)介
09、platform-tools的簡(jiǎn)介及常見(jiàn)adb指令
10、android項(xiàng)目的目錄結(jié)構(gòu)
11、android下apk安裝的過(guò)程
12、常見(jiàn)的adb指令介紹
13、創(chuàng)建模擬器遇到的常見(jiàn)錯(cuò)誤
14、電話(huà)撥號(hào)器
15、點(diǎn)擊事件的四種寫(xiě)法
16、短信發(fā)送器
17、相對(duì)布局&單位介紹
18、現(xiàn)形布局&布局的組合
19、表格布局&絕對(duì)布局 20、幀布局
21、測(cè)試相關(guān)概念
22、android下junit測(cè)試框架配置
23、logcat簡(jiǎn)介
24、保存文件到手機(jī)內(nèi)存
25、android下文件訪(fǎng)問(wèn)的權(quán)限
26、保存文件到SD卡中
27、分析setting源代碼獲取SD卡大小
28、_sharePreference入門(mén)
29、xml文件的序列化 30、采用pull解析xml文件
31、采用斷電調(diào)試的方法觀察pull解析的的流程
32、android下創(chuàng)建一個(gè)sqllite數(shù)據(jù)庫(kù)
33、sql語(yǔ)句實(shí)現(xiàn)數(shù)據(jù)庫(kù)的增刪改查
34、系統(tǒng)api實(shí)現(xiàn)數(shù)據(jù)庫(kù)的增刪改查&Sqlite3工具的使用
35、數(shù)據(jù)庫(kù)的事物
36、listView入門(mén)
37、采用layoutInflater打氣筒創(chuàng)建一個(gè)view對(duì)象
38、采用數(shù)據(jù)適配器ArryAdapter
39、常用數(shù)據(jù)適配器simpleAdapter 40、數(shù)據(jù)適配器總結(jié)
41、內(nèi)容提供者簡(jiǎn)介
42、內(nèi)容提供者的實(shí)現(xiàn)
43、短信的備份
44、插入一條記錄到系統(tǒng)短信應(yīng)用
45、內(nèi)容觀察者
46、獲取系統(tǒng)的聯(lián)系人信息
47、保存聯(lián)系人到系統(tǒng)通訊錄
48、讀取聯(lián)系人的一個(gè)小細(xì)節(jié)
49、網(wǎng)絡(luò)圖片查看器
50、anr產(chǎn)生的原理&如何避免
51、android消息機(jī)制入門(mén)
52、網(wǎng)絡(luò)html查看器
53、字符亂碼問(wèn)題的處理
54、采用get方式提交數(shù)據(jù)到服務(wù)器
55、采用post方式提交數(shù)據(jù)到服務(wù)器
56、提交數(shù)據(jù)到服務(wù)器中文亂碼問(wèn)題的處理
57、采用httpclient提交數(shù)據(jù)到服務(wù)器
58、異步http框架簡(jiǎn)介&實(shí)現(xiàn)原理
59、異步http框架提交數(shù)據(jù)到服務(wù)器 60、上傳文件到服務(wù)器
61、smartimageview&常見(jiàn)開(kāi)源代碼 62、多線(xiàn)程下載的原理 63、多線(xiàn)程斷點(diǎn)下載的原理
64、多線(xiàn)程java代碼移植到android 65、多線(xiàn)程下載文本頁(yè)面的更新 66、顯示意圖激活另一個(gè)activity 67、隱式意圖激活另一個(gè)activity 68、隱式意圖的配置
69、隱式意圖和顯示意圖的使用場(chǎng)景 70、在不同activity之間數(shù)據(jù)傳遞 71、activity的聲明周期 72、activity的啟動(dòng)模式
73、activity橫豎屏切換的聲明周期 74、開(kāi)啟新的activity獲取他的返回值 75、請(qǐng)求碼和結(jié)果碼的作用 76、利用廣播實(shí)現(xiàn)ip撥號(hào) 77、短信竊聽(tīng)器
78、自定義廣播時(shí)間&發(fā)送自定義廣播&廣播接受者優(yōu)先級(jí) 79、采用服務(wù)執(zhí)行長(zhǎng)期后臺(tái)操作 80、采用服務(wù)竊聽(tīng)電話(huà)&服務(wù)的聲明周期 81、android進(jìn)程優(yōu)先級(jí)&為什么使用服務(wù) 82、綁定方式開(kāi)啟服務(wù)&調(diào)用服務(wù)的方法 83、服務(wù)的聲明周期(混合開(kāi)啟 84、采用aidl綁定遠(yuǎn)程服務(wù)
85、代碼注冊(cè)廣播接受者&利用廣播調(diào)用服務(wù)的辦法 86、加載大圖片到內(nèi)存 87、獲取圖片exif信息 88、從gallery獲取圖片 89、圖片畫(huà)畫(huà)板 90、扒開(kāi)美女衣服 91、圖片的縮放 92、圖片的旋轉(zhuǎn)
93、圖片的平移&鏡面&倒影效果 94、圖片的合成 95、圖片的顏色處理 96、多媒體播放api簡(jiǎn)介 97、人臉識(shí)別
98、mediaplayer的生命周期 99、soundpoo簡(jiǎn)介
100、sufaceview的生命周期 101、播放在線(xiàn)視頻
102、視頻播放器進(jìn)度的處理 103、調(diào)用系統(tǒng)照相機(jī)拍照和錄像 104、采用camera拍照 105、常見(jiàn)對(duì)話(huà)框 106、notification入門(mén) 107、菜單
108、android下的樣式 109、android下的主題
110、代碼編寫(xiě)ui 111、html創(chuàng)建ui 112、幀動(dòng)畫(huà)
113、代碼創(chuàng)建創(chuàng)建的tween動(dòng)畫(huà) 114、xml文件定義動(dòng)畫(huà) 115、傳感器簡(jiǎn)介 116、117、殺死進(jìn)程 118、apk的安裝 119、應(yīng)用程序的反編譯 120、動(dòng)態(tài)創(chuàng)建fragment 121、用fragment創(chuàng)建一個(gè)選項(xiàng)卡 122、fragment的向下兼容性 123、fragment的生命周期 124、fragment之間的通訊 125、應(yīng)用程序國(guó)際化
04、android的framewor簡(jiǎn)介
Wap:wait and play Wireless Makeup Language(WML)精簡(jiǎn)的html語(yǔ)言 Applications:android自帶的基本上層應(yīng)用 Aplication framework:應(yīng)用程序框架 Librarics: Linux lernel:
05、兩種虛擬機(jī)的比較
編譯后文件格式:
jvm:.java->.class->.jar dalvik vm:.java->.dex->.odex 基于的架構(gòu):
jvm:基于棧的架構(gòu)
dalvik vm:基于寄存器的架構(gòu)
Cpu直接訪(fǎng)問(wèn)寄存器因此dalvik虛擬機(jī)的效率比jvm高
06、sdk的下載以及簡(jiǎn)介
->獲取sdk工具包(sdk:standard develope kits)->ADT(android develop tools,實(shí)際上是eclipse的插件)SDK具體內(nèi)容
Android 4.2.2(API16)
->SDK Plateform:開(kāi)發(fā)時(shí)使用到的jar包->Samples for sdk:
->ARM EABI V7a System Image:模擬器運(yùn)行時(shí)的鏡像->Intel n86 Aton System:模擬器運(yùn)行時(shí)的鏡像->MIPS System Image:模擬器運(yùn)行時(shí)的鏡像->google APIs:google提供的jar包,可以直接使用google提供的一些API->source for android SDK:SDK全部的源代碼 Extrals:
->tools:開(kāi)發(fā)的工具
->support library:實(shí)現(xiàn)高版本的android向下的兼容->google Admed Ads SDK:gongle提供的廣告插件->Analyties App Irackiong SDK:應(yīng)用的用戶(hù)分析->cloud message:云消息
->gongle play service:收費(fèi)服務(wù)
->google USB Driver:真實(shí)的設(shè)備驅(qū)動(dòng)
開(kāi)發(fā)時(shí):基于4.0,兼容2.2、2.3.3
07、創(chuàng)建android模擬器
avd:android virture developer VGA:480*640(電視的標(biāo)準(zhǔn)分辨率)QVGA:240*320(四分之一)HVGA:320*480(一半)WVGA:480*800(width)FWVGA:480*854(更寬)
08、ddms簡(jiǎn)介
ddms:模擬器不支持中文,因此發(fā)送中文會(huì)顯示不出來(lái)
09、platform-tools的簡(jiǎn)介及常見(jiàn)adb指令
Android調(diào)試橋:內(nèi)部實(shí)現(xiàn)就是socket讓兩個(gè)系統(tǒng)之間實(shí)現(xiàn)數(shù)據(jù)交互
->reset adb:模擬器找不到時(shí)候可以重啟->adb device:列出所有的連接的設(shè)備->adb kill-server:殺死adb調(diào)試橋->adb start-server 啟動(dòng)adb調(diào)試橋 dx.bat:將.class文件打包
10、android項(xiàng)目的目錄結(jié)構(gòu)
一:SDK的目錄結(jié)構(gòu)
->Samples->Api demo:根據(jù)API demo(模擬器上面可以看見(jiàn))的效果可以在sample中看見(jiàn)
相應(yīng)的代碼
->Source:jar包所有的sdk源代碼都在這個(gè)文件夾里->SystemImage:系統(tǒng)鏡像
->temp:下載更新臨時(shí)存儲(chǔ)的文件夾,一般是空的->tools:emulater.ext 不同版本的模擬器
二:New Android Application->theme:留給以后作為擴(kuò)展,現(xiàn)在并沒(méi)有太大的作用->target SDK:一般選擇高版本,因?yàn)楦甙姹緦?duì)下兼容
->mark project as a library:一般不選擇,意思是將這個(gè)項(xiàng)目提供一個(gè)
jar包供別人使用 三:文件夾目錄
.setting:設(shè)置目錄
assets:資產(chǎn)目錄,存放一些文件,這些文件會(huì)被原封不動(dòng)打包到應(yīng)用程序的 apk中
bin:
gen:自動(dòng)生成的目錄
->builderConfig.java:生成的配置信息->R.java: Android 4.1.2->android.jar開(kāi)發(fā)環(huán)境,jar包
可以在properties中修改,jar包就是SDK
011、Android下apk的安裝過(guò)程
一、Android安裝過(guò)程分析:
->setContentView:甚至view的對(duì)象,把里面的xml文件加載到
->在project中選擇build automaticly會(huì)自動(dòng)把文件生成字節(jié)碼文件,.class $代表的class文件生成的是內(nèi)部類(lèi)->dex.bat文件會(huì)把.class文件生成.dex文件
->apk壓縮文件解壓內(nèi)部?jī)?nèi)容
->META-INF: 應(yīng)用程序的簽名
eclipse的調(diào)試簽名文件
->res:資源文件
->classes.dex:class文件
->resources.arsc:資源ID映射
->android軟件安裝的過(guò)程:
->拷貝xxx.apk帶/data/app/xxx-1.apk->在/data/data目錄下創(chuàng)建一個(gè)文件夾,文件夾名稱(chēng)當(dāng)前應(yīng)用程序的報(bào)名
012、常見(jiàn)adb指令
前提:
->設(shè)備連接上電腦而且驅(qū)動(dòng)安裝正常,如果安裝不正常的話(huà),會(huì)有黃色的問(wèn)號(hào)顯示;
->設(shè)備上打開(kāi)USB調(diào)試;
指令:
->adb device(如果啟動(dòng)發(fā)現(xiàn)這個(gè)程序沒(méi)有安裝會(huì)自動(dòng)安裝)->adb kill-server->adb start-server->adb uninstall <包名>->adb-s emulator-5554 install c:usersadministratorhello.apk 如果有多個(gè)設(shè)備的話(huà),如果不指定安裝的是哪個(gè)設(shè)備程序會(huì)報(bào)錯(cuò)->adb push haha.prop /sdcard/haha.txt 將文件移到
(360管家,豌豆莢之類(lèi)的軟件他們也是用的adb指令,倘若電腦上裝這些軟件的話(huà),會(huì)因?yàn)閮蓚€(gè)adb指令搶端口號(hào)而掛掉)(adb版本之間兼容不是很好,經(jīng)常報(bào)錯(cuò)可以考慮下版本的問(wèn)題)->adb shell:遠(yuǎn)程連接到了android的linux終端
ls:顯示文件夾
ps:顯示正在運(yùn)行的程序 ping:網(wǎng)絡(luò)連通性
013、創(chuàng)建模擬器遇到的常見(jiàn)錯(cuò)誤
->路徑最好不要有中文:
->應(yīng)用安裝不上,或者安裝模擬器的時(shí)候開(kāi)啟一個(gè)新的模擬器:
可能是模擬器的資源被占用,模擬器在運(yùn)行的時(shí)候其實(shí)占用著硬盤(pán)上面的一個(gè)文件,這個(gè)文件位于工作空間.android/avd/iphone.avd 里面會(huì)有鏡像文件,當(dāng)一個(gè)模擬器開(kāi)啟起來(lái)了,就給你創(chuàng)建一個(gè)文件夾.knock的文件夾,代表著這個(gè)模擬器被鎖定了,如果把模擬器關(guān)掉,就沒(méi)有程序占據(jù)這幾個(gè)鏡像資源了,那么這幾個(gè)程序就會(huì)被自動(dòng)刪除。通常情況下不會(huì)出問(wèn)題,開(kāi)啟時(shí)候創(chuàng)建文件,關(guān)閉時(shí)關(guān)閉文件,但是當(dāng)電腦出現(xiàn)不正常狀態(tài)時(shí):比如藍(lán)屏,停電關(guān)機(jī)時(shí)候這些資源還沒(méi)來(lái)得及刪除,模擬器就關(guān)閉了,因此開(kāi)啟時(shí)這些資源仍在,程序默認(rèn)模擬器被占用,因此會(huì)重新開(kāi)啟一個(gè)模擬器。
->模擬器沒(méi)有信號(hào):
模擬器用socket橋接在電腦上
終結(jié)解決方案是給電腦連上網(wǎng),分配一個(gè)IP->常見(jiàn)命令操作:
14、電話(huà)撥號(hào)器
->新建文件
->界面設(shè)置:文本框、點(diǎn)擊按鈕
-> :一旦獲得焦點(diǎn),會(huì)立刻彈出,輸入文本的軟鍵盤(pán)->ctrl+x刪除->ctrl+1提示
->設(shè)置點(diǎn)擊事件:找到空間,然后設(shè)置點(diǎn)擊事件,再點(diǎn)擊事件里面獲得了另外一
個(gè)空間的數(shù)據(jù),激活一個(gè)intent->獲得權(quán)限:清單文件中添加uses permision
15、點(diǎn)擊事件的四種寫(xiě)法
->電話(huà)撥號(hào)器的優(yōu)化:
每次撥打電話(huà)都會(huì)執(zhí)行的操作是:查找控件,然后找到控件的文本,撥打電
話(huà)。其實(shí)每次撥打電話(huà)文本控件已經(jīng)創(chuàng)建好了沒(méi)有必要每次查找按鈕之后再 查詢(xún)控件。
package cn.wqrt.mobile;
import android.app.Activity;import android.content.Intent;import android.net.Uri;import android.os.Bundle;import android.text.TextUtils;import android.view.Menu;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;
public class MainActivity extends Activity {
private EditText et_number;@Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button button =(Button)findViewById(R.id.bt_dial);et_number =(EditText)findViewById(R.id.et_number);button.setOnClickListener(new MyListener());}
private class MyListener implementsandroid.view.View.OnClickListener{
@Override
public void onClick(View arg0){
String number = et_number.getText().toString().trim();//去除回車(chē)和空格
if(TextUtils.isEmpty(number)){
Toast.makeText(MainActivity.this, “號(hào)碼不能為空”, Toast.LENGTH_SHORT).show();
return;
}
Intent intent = new Intent();
intent.setAction(intent.ACTION_CALL);
intent.setData(Uri.parse(“tel:”+number));
startActivity(intent);
}
}
@Override public boolean onCreateOptionsMenu(Menu menu){ // Inflate the menu;this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;} }
->
1、點(diǎn)擊事件的四種寫(xiě)法:
->給按鈕注冊(cè)點(diǎn)擊事件:創(chuàng)建一個(gè)內(nèi)部類(lèi)定義點(diǎn)擊事件。具體代碼見(jiàn)上
button.setOnClickListener(new MyListener());
->
2、采用匿名內(nèi)部類(lèi)創(chuàng)建點(diǎn)擊事件:
button.setOnClickListener(new OnClickListener()){
package cn.wqrt.mobile;
import android.app.Activity;import android.content.Intent;import android.net.Uri;import android.os.Bundle;import android.text.TextUtils;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;
public class MainActivity extends Activity {
private EditText et_number;@Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button button =(Button)findViewById(R.id.bt_dial);et_number =(EditText)findViewById(R.id.et_number);button.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View arg0){
// TODO 自動(dòng)生成的方法存根
callPhone();
}
});}
@Override public boolean onCreateOptionsMenu(Menu menu){ // Inflate the menu;this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}
private void callPhone(){
String number = et_number.getText().toString().trim();//去除回車(chē)和空格
if(TextUtils.isEmpty(number)){
Toast.makeText(MainActivity.this, “號(hào)碼不能為空”, Toast.LENGTH_SHORT).show();
return;
}
Intent intent = new Intent();
intent.setAction(intent.ACTION_CALL);
intent.setData(Uri.parse(“tel:”+number));
startActivity(intent);} } }
->
3、如果有很多的按鈕點(diǎn)擊事件,建議用這種方式:讓Activity實(shí)現(xiàn)點(diǎn)擊 事件的接口,每個(gè)按鈕點(diǎn)擊事件都設(shè)置成this,讓該類(lèi)實(shí)現(xiàn) OnClickListener然后進(jìn)行判斷。package cn.wqrt.mobile;
import android.app.Activity;import android.content.Intent;import android.net.Uri;import android.os.Bundle;import android.text.TextUtils;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;
public class MainActivity extends Activity implements OnClickListener {
private EditText et_number;@Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button button =(Button)findViewById(R.id.bt_dial);et_number =(EditText)findViewById(R.id.et_number);button.setOnClickListener(this);}
@Override public boolean onCreateOptionsMenu(Menu menu){ // Inflate the menu;this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}
private void callPhone(){
String number = et_number.getText().toString().trim();//去除回車(chē)和空格
if(TextUtils.isEmpty(number)){
Toast.makeText(MainActivity.this, “號(hào)碼不能為空”, Toast.LENGTH_SHORT).show();
return;
}
Intent intent = new Intent();
intent.setAction(intent.ACTION_CALL);
intent.setData(Uri.parse(“tel:”+number));
startActivity(intent);}
@Override public void onClick(View v){
// TODO 自動(dòng)生成的方法存根
switch(v.getId()){
case R.id.bt_dial:
callPhone();
break;
} } }->
4、在布局文件中綁定一個(gè)點(diǎn)擊的方法,如果點(diǎn)擊按鈕就會(huì)調(diào)用這個(gè)方法,通
過(guò)反射技術(shù)試圖調(diào)用這個(gè)方法
布局文件中設(shè)置: package cn.wqrt.mobile;
import android.app.Activity;import android.content.Intent;import android.net.Uri;import android.os.Bundle;import android.text.TextUtils;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;
public class MainActivity extends Activity {
private EditText et_number;@Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button button =(Button)findViewById(R.id.bt_dial);et_number =(EditText)findViewById(R.id.et_number);
}
@Override public boolean onCreateOptionsMenu(Menu menu){ // Inflate the menu;this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}
public void dialButtonClick(View v){ callPhone();}
private void callPhone(){
String number = et_number.getText().toString().trim();//去除回車(chē)和空格
if(TextUtils.isEmpty(number)){
Toast.makeText(MainActivity.this, “號(hào)碼不能為空”, Toast.LENGTH_SHORT).show();
return;
}
Intent intent = new Intent();
intent.setAction(Intent.ACTION_CALL);
intent.setData(Uri.parse(“tel:”+number));
startActivity(intent);} }
16、短信發(fā)送器
->界面的設(shè)計(jì):兩個(gè)large Text,一個(gè)Button
android:textColor 設(shè)置字體顏色
android:singleLine=“true” 設(shè)置是否是單行
android:lines=“5” 設(shè)置行數(shù)
windows下面的顏色是GBR,而android下需要輸入的格式確實(shí)
RGB,所以需要轉(zhuǎn)換
adb默認(rèn)設(shè)置time out為5秒->內(nèi)容設(shè)計(jì):按鈕-文本->判斷->發(fā)送
導(dǎo)包的時(shí)候千萬(wàn)別導(dǎo)到gsm包,否則會(huì)顯示過(guò)時(shí);
發(fā)送沒(méi)有歷史記錄 package com.example.sms;
import java.util.ArrayList;
import android.app.Activity;import android.os.Bundle;import android.telephony.SmsManager;import android.text.TextUtils;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;
public class MainActivity extends Activity implements OnClickListener {
private EditText et_number;private EditText et_content;
@Override protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button =(Button)findViewById(R.id.bt_send);
et_number =(EditText)findViewById(R.id.et_number);
et_content =(EditText)findViewById(R.id.et_content);
button.setOnClickListener(this);}
@Override public boolean onCreateOptionsMenu(Menu menu){
// Inflate the menu;this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);
return true;}
@Override public void onClick(View v){
// TODO 自動(dòng)生成的方法存根
switch(v.getId()){
case R.id.bt_send:
String number = et_number.getText().toString().trim();
String content = et_content.getText().toString().trim();
if(TextUtils.isEmpty(number)||TextUtils.isEmpty(content)){
Toast.makeText(this, “號(hào)碼或者內(nèi)容不能為空”,Toast.LENGTH_SHORT).show();
return;
}else{
SmsManager smsManager = SmsManager.getDefault();
ArrayList contents = smsManager.divideMessage(content);
for(String str:contents){
smsManager.sendTextMessage(number, null, str, null, null);
}
}
} } }
17、相對(duì)布局&單位介紹
->布局說(shuō)明:
->同級(jí)控件:
android:layout_toRightOf=“" android:layout_toLeftOf=”“ android:layout_below=”' android:layout_above=“" android:layout_maginBottom=”“
->相對(duì)父控件:
android:ayout_centerInParent=”“ android: layout_centerHorizontal=”“ android:layout_centerVertical=”“ android:layout_alignParentBottom=”“ android:layout_alignParentRight=”“->對(duì)齊方式:
->文本顏色:#00000000~#ff000000(argb)文字的透明度->單位介紹:
dp也就是dip:device independent pixels(設(shè)備獨(dú)立像素),是一種與密度無(wú)關(guān)的像素單位,在每英寸160點(diǎn)的屏幕上,1dp = 1px。不同設(shè)備有不同的顯示效果,這個(gè)和設(shè)備硬件有關(guān),一般我們?yōu)榱酥С諻VGA、HVGA和QVGA 推薦使用這個(gè),不依賴(lài)像素
1.2.android:layout_height=”wrap_content“
3.android:text=”@string/clickme“
4.android:layout_marginTop=”20dp“ />
scaled pixels(刻度像素).主要用于定義字體的大小,而從來(lái)不再layout上使用
o
1.2.android:layout_height=”wrap_content“
3.android:textSize=”20sp“ />
px:pixels(像素).不同設(shè)備顯示效果相同,一般我們HVGA代表320x480像素,這個(gè)用的比較多 總結(jié):dp也就是dip。這個(gè)和sp基本類(lèi)似。如果設(shè)置表示長(zhǎng)度、高度等屬性時(shí)可以使用dp或sp。但如果設(shè)置字體,需要使用sp。dp是與密度無(wú)關(guān),sp除了與密度無(wú)關(guān)外,還與scale無(wú)關(guān)。如果屏幕密度為160,這時(shí)dp和sp和px是一樣的。1dp=1sp=1px,但如果使用px作單位,如果屏幕大小不變(假設(shè)還是3.2寸),而屏幕密度變成了320。那么原來(lái)TextView的寬度設(shè)成160px,在密度為320的3.2寸屏幕里看要比在密度為160的3.2寸屏幕上看短了一半。但如果設(shè)置成160dp或160sp的話(huà)。系統(tǒng)會(huì)自動(dòng)將width屬性值設(shè)置成320px的。也就是160 * 320 / 160。其中320 / 160可稱(chēng)為密度比例因子。也就是說(shuō),如果使用dp和sp,系統(tǒng)會(huì)根據(jù)屏幕密度的變化自動(dòng)進(jìn)行轉(zhuǎn)換.附:px 和 dp 互轉(zhuǎn)換
1.package com.hujl.util;import android.content.Context;
public class DensityUtil {
/**
* 根據(jù)手機(jī)的分辨率從 dp 的單位轉(zhuǎn)成為 px(像素)
*/
public static int dip2px(Context context, float dpValue){
final float scale = context.getResources().getDisplayMetrics().density;
return(int)(dpValue * scale + 0.5f);
}
/**
* 根據(jù)手機(jī)的分辨率從 px(像素)的單位轉(zhuǎn)成為 dp
*/
public static int px2dip(Context context, float pxValue){
final float scale = context.getResources().getDisplayMetrics().density;
return(int)(pxValue / scale + 0.5f);
} }
18、線(xiàn)性布局&布局的組合
->線(xiàn)性布局:
->線(xiàn):就是view對(duì)象
android:layout_height=”1px“
android:background=”#ff0000“ > />
通常采用相對(duì)布局和絕對(duì)布局聯(lián)合使用的方式。
19、表格布局&絕對(duì)布局
->表格布局:渲染權(quán)重
->絕對(duì)布局:對(duì)控件位置任意擺放,需要計(jì)算不同屏幕中的位置,因?yàn)閍ndroid
軟件的屏幕大小實(shí)在太多,所以并不方便,不推薦使用。
20、幀布局
>幀布局:
->類(lèi)似于網(wǎng)頁(yè)布局中的div
android:visibility:”“ //顯示是否可見(jiàn),播放器最喜歡使用幀布局,暫停播放的時(shí)候,會(huì)在上面顯示一個(gè)按鈕
21、測(cè)試相關(guān)概念
->根據(jù)測(cè)試測(cè)試是否知道程序的源代碼:
->黑盒測(cè)試:不知道源代碼,只關(guān)心程序執(zhí)行的過(guò)程和程序的結(jié)果,一個(gè)資
深的黑盒程序人員工資很高,因?yàn)樗麄兒驼S脩?hù)的使用思維
不一樣
->白盒測(cè)試:根據(jù)源代碼寫(xiě)測(cè)試方法或者測(cè)試用例->根據(jù)測(cè)試的粒子度:
->方法測(cè)試:function test->單元測(cè)試:unit test->集成測(cè)試:intergration test->根據(jù)測(cè)試的次數(shù):
->冒煙測(cè)試:smoke test 反復(fù)不停的執(zhí)行,反復(fù)不停的使用(android猴子
來(lái)測(cè)試)
->adb shell
->monkey
->monkey 5000(點(diǎn)擊五千次)
->壓力測(cè)試:pressure test同時(shí)抗住多人的請(qǐng)求->
22、android下junit測(cè)試框架配置
23、logcat簡(jiǎn)介
->日志信息級(jí)別:
Verbose:提醒 黑色
Debug: 調(diào)試 藍(lán)色
Info: 信息 綠色
Warn: 警告 橙色
Error: 錯(cuò)誤 紅色
24、保存文件到手機(jī)內(nèi)存
->數(shù)據(jù)存儲(chǔ)與訪(fǎng)問(wèn)
->文件
->SharePreferences(參數(shù))
->SQLite數(shù)據(jù)庫(kù)
->內(nèi)容提供者(Content Provide)
->網(wǎng)絡(luò)
->LinearLayout一定要設(shè)置水平還是垂直->文件保存:
->javase中通過(guò)創(chuàng)建文件對(duì)象,但是在androi中這種存放方式會(huì)失敗,因
為會(huì)默認(rèn)為存儲(chǔ)在當(dāng)前目錄文件下
->android中創(chuàng)建一個(gè)包:com.itheima.login.service
創(chuàng)建一個(gè)類(lèi):LoginService.java
異常的處理:如果是返回值是boolean,那么拋出處理都可以,但是如果返回值是void,那么只能拋出了
->context:上下文就是一個(gè)類(lèi),這個(gè)類(lèi)提供了很多方便的API,可以得到應(yīng)用程
序的環(huán)境
環(huán)境包名 安裝路徑 文件的路徑 資源的路徑 資產(chǎn)的路徑
放到緩存文件夾里面:getCacheDir();->getAssest();->getResource();->getFilesDir();/data/data/包名
->getCacheDir();/data/data/包名/cache
->MainActivity.java package com.example.login;
import java.util.Map;
import android.app.Activity;import android.os.Bundle;import android.text.TextUtils;import android.view.Menu;import android.view.View;import android.widget.CheckBox;import android.widget.EditText;import android.widget.Toast;
import com.example.login.service.LoginService;
public class MainActivity extends Activity {
private EditText et_number;private EditText et_passwd;private CheckBox cb_remPass;
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);//首先要把頁(yè)面加載進(jìn)來(lái)然后才有控件的獲取
et_number =(EditText)findViewById(R.id.et_number);
et_passwd =(EditText)findViewById(R.id.et_passwd);
cb_remPass =(CheckBox)findViewById(R.id.cb_remPass);
Map map = LoginService.getSavaUserInfo(this);
if(map!= null){
et_number.setText((CharSequence)map.get(”username“));
et_passwd.setText((CharSequence)map.get(”passwd“));
} }
@Override public boolean onCreateOptionsMenu(Menu menu){
// Inflate the menu;this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);
return true;} public void login(View v){
String number = et_number.getText().toString().trim();
String passwd = et_passwd.getText().toString().trim();
if(TextUtils.isEmpty(number)||TextUtils.isEmpty(passwd)){
Toast.makeText(this, ”登錄名或者密碼不能為空“, Toast.LENGTH_SHORT).show();
return;
}else{
if(cb_remPass.isChecked()){
//如果選擇了保存用戶(hù)密碼,那么就保存用戶(hù)密碼
boolean results = LoginService.saveuserInfo(this,number, passwd);
if(results){
Toast.makeText(this, ”保存用戶(hù)信息成功“, Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(this, ”保存用戶(hù)信息失敗“, Toast.LENGTH_SHORT).show();
}
}
//登陸發(fā)送消息到服務(wù)器,服務(wù)器驗(yàn)證是否正確
if(”zhangsan“.equals(number)&&”123456“.equals(passwd)){
Toast.makeText(this, ”登陸成功“, Toast.LENGTH_LONG).show();
}else{
Toast.makeText(this, ”登錄失敗,用戶(hù)名或者密碼不正確“, Toast.LENGTH_LONG).show();
}
} } }
->LoginService.java package com.example.login.service;
import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStreamReader;import java.util.HashMap;import java.util.Map;
import android.content.Context;/* * 保存用戶(hù)名密碼的的業(yè)務(wù)方法 */ public class LoginService { public static boolean saveuserInfo(Context context,String userName,String passWord){//沒(méi)有使用任何類(lèi)的方法,推薦使用靜態(tài)方法
//File file = new File(”/data/data/com.example.login/info.txt“);
File file = new File(context.getFilesDir(),”info.txt“);
try {
FileOutputStream fos = new FileOutputStream(file);
fos.write((userName+”##“+passWord).getBytes());
fos.close();
return true;
} catch(FileNotFoundException e){
// TODO 自動(dòng)生成的 catch 塊
e.printStackTrace();
return false;
} catch(IOException e){
// TODO 自動(dòng)生成的 catch 塊
e.printStackTrace();
return false;
}
} /* * 獲取保存到的數(shù)據(jù)
*/ public static Map getSavaUserInfo(Context context){
File file = new File(context.getFilesDir(),”info.txt“);
Map map = new HashMap();;
try {
FileInputStream fis = new FileInputStream(file);
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(fis));
String str = bufferedReader.readLine();
String[] infos = str.split(”##“);
map.put(”username“, infos[0]);
map.put(”passwd“, infos[1]);
} catch(FileNotFoundException e){
// TODO 自動(dòng)生成的 catch 塊
e.printStackTrace();
return null;
} catch(IOException e){
// TODO 自動(dòng)生成的 catch 塊
e.printStackTrace();
return null;
}
return map;} }
->activity_main.xml
android:id=”@+id/bt_login“
android:onClick=”login“
android:layout_width=”100dp“
android:layout_height=”wrap_content“
android:layout_alignParentRight=”true“
android:text=”@string/bt_login“
/>
android:id=”@+id/cb_remPass“
android:layout_width=”wrap_content“
android:layout_height=”wrap_content“
android:layout_alignParentLeft=”true“
android:layout_alignParentTop=”true“
android:layout_alignBottom=”@id/bt_login“
android:text=”@string/remPass“
android:checked=”true“ />
25、android下文件訪(fǎng)問(wèn)的權(quán)限
->private、readable、writeable、public
26、保存文件到SD卡中
->存儲(chǔ)空間:
->手機(jī)的內(nèi)部存儲(chǔ)空間:小硬盤(pán) /data/data->外部存儲(chǔ)空間:SD卡 路徑/mnt/sdcard 可以簡(jiǎn)寫(xiě)成/sdcard/
需要權(quán)限WRITE_EXTER_STORAGE
操作SD卡必須要權(quán)限
->保存數(shù)據(jù)到SD卡只需要把路徑改為SD卡,讀不需要權(quán)限,否則需要權(quán)限
在4.0以前的版本讀SD卡不需要權(quán)限,但是在4.0以
后讀寫(xiě)SD卡可以設(shè)置SD卡保護(hù),讀就需要權(quán)限 READ_EXTER_STORAGE->判斷是否存在SD卡:Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState());
->為了保證程序的兼容性,有些SD卡可能路徑會(huì)改變,因此系統(tǒng)提供了獲取SD 卡的路徑的方法
Environment.getExternalStorageDirectory()
27、分析setting源代碼獲取SD卡大小
->source的源代碼是SDK的源代碼,是jar里面的源代碼->導(dǎo)入通用的文件項(xiàng)目eclipse要求必須要有setting文件->ctrl+h搜索文件夾
package com.example.sdsize;
import java.io.File;
import android.app.Activity;import android.os.Bundle;import android.os.Environment;import android.os.StatFs;import android.text.format.Formatter;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.TextView;import android.widget.Toast;
public class MainActivity extends Activity {
private TextView tv_SDsize;protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button =(Button)findViewById(R.id.bt_find);tv_SDsize =(TextView)findViewById(R.id.tv_SDSize);
button.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View arg0){
// TODO 自動(dòng)生成的方法存根
StringBuilder memorySizeInfo = new StringBuilder();
if(Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())){
memorySizeInfo.append(getExternalSize());
}else{
Toast.makeText(MainActivity.this,”無(wú)內(nèi)存卡“, Toast.LENGTH_SHORT).show();
}
memorySizeInfo.append(getRomSpaceInfo());
tv_SDsize.setText(memorySizeInfo.toString());
}
});} /* * 獲取SD卡的存儲(chǔ)信息 */ public String getExternalSize(){
File path = Environment.getExternalStorageDirectory();
StatFs stat = new StatFs(path.getPath());
long blockSize = stat.getBlockSize();
long totalBlocks = stat.getBlockCount();
long availableBlocks = stat.getAvailableBlocks();
long totalSize = blockSize*totalBlocks;
long availSize = blockSize*availableBlocks;
String totalStr = Formatter.formatFileSize(this, totalSize);
String availStr = Formatter.formatFileSize(this, availSize);
String ExternalSize = ”SD總存儲(chǔ)空間:“+ totalStr + ”可使用的空間:“ + availStr;
return ExternalSize;} /* * 獲取可用的內(nèi)部存儲(chǔ) */ public String getRomSpaceInfo(){
File path = Environment.getDataDirectory();
StatFs stat = new StatFs(path.getPath());
long internalblockSize = stat.getBlockSize();
long internalblockcounts = stat.getBlockCount();
long internaltotalSize = internalblockSize*internalblockcounts;
String totalStr = Formatter.formatFileSize(this, internaltotalSize);
String RomSpaceInfo = ”可用的內(nèi)存“+ totalStr;
} return RomSpaceInfo;} @Override public boolean onCreateOptionsMenu(Menu menu){ // Inflate the menu;this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}
28、sharedPreferences入門(mén)
->數(shù)據(jù)存儲(chǔ)的API:用##分割用戶(hù)名和密碼的缺陷,真實(shí)存
儲(chǔ)的話(huà)必須要把##轉(zhuǎn)移成其他字符,sharePreferences
(共享參數(shù))提供了一種方便存儲(chǔ)數(shù)據(jù)的方式。
->在data目錄下創(chuàng)建了一個(gè)xml文件,根節(jié)點(diǎn)是map,其實(shí)是以map集合來(lái)存
儲(chǔ)的用戶(hù)名和密碼的對(duì)特殊字符進(jìn)行了轉(zhuǎn)義
package loginsharedPreference.service;
import android.content.Context;import android.content.SharedPreferences;import android.content.SharedPreferences.Editor;
/* * 保存用戶(hù)名密碼的的業(yè)務(wù)方法 */ public class LoginService { public static void SavaUserInfo(Context context,String username,String passwd){
//拿到上下文之后,有個(gè)方法叫g(shù)etSharedPreferences
SharedPreferences sharedPreferences = context.getSharedPreferences(”config“, Context.MODE_PRIVATE);
Editor editor = sharedPreferences.edit();//得到sharedPreferences的編輯器
}
editor.putString(”username“,username);editor.putString(”passwd“,passwd);//類(lèi)似于數(shù)據(jù)庫(kù)的事物
editor.commit();//當(dāng)前方法不會(huì)存在異常,所以設(shè)置為void } package loginsharedPreference;
import java.util.Map;
import loginsharedPreference.service.LoginService;import android.app.Activity;import android.content.SharedPreferences;import android.os.Bundle;import android.text.TextUtils;import android.view.Menu;import android.view.View;import android.widget.CheckBox;import android.widget.EditText;import android.widget.Toast;
import com.example.login.R;
public class MainActivity extends Activity {
private EditText et_number;private EditText et_passwd;private CheckBox cb_remPass;
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);//首先要把頁(yè)面加載進(jìn)來(lái)然后才有控件的獲取
et_number =(EditText)findViewById(R.id.et_number);
et_passwd =(EditText)findViewById(R.id.et_passwd);
cb_remPass =(CheckBox)findViewById(R.id.cb_remPass);
SharedPreferences sharedPreferences = getSharedPreferences(”config“,MODE_PRIVATE);
String username = sharedPreferences.getString(”username“, ”“);
String passwd = sharedPreferences.getString(”passwd“, ”“);
et_number.setText(username);
et_passwd.setText(passwd);
}
@Override public boolean onCreateOptionsMenu(Menu menu){
// Inflate the menu;this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);
return true;} public void login(View v){
String number = et_number.getText().toString().trim();
String passwd = et_passwd.getText().toString().trim();
if(TextUtils.isEmpty(number)||TextUtils.isEmpty(passwd)){
Toast.makeText(this, ”登錄名或者密碼不能為空“, Toast.LENGTH_SHORT).show();
return;
}else{
if(cb_remPass.isChecked()){
//如果選擇了保存用戶(hù)密碼,那么就保存用戶(hù)密碼
LoginService.SavaUserInfo(this,number, passwd);
Toast.makeText(this, ”保存用戶(hù)信息成功“, Toast.LENGTH_SHORT).show();
}
//登陸發(fā)送消息到服務(wù)器,服務(wù)器驗(yàn)證是否正確
if(”zhangsan“.equals(number)&&”123456“.equals(passwd)){
Toast.makeText(this, ”登陸成功“, Toast.LENGTH_LONG).show();
}else{
Toast.makeText(this, ”登錄失敗,用戶(hù)名或者密碼不正確“, Toast.LENGTH_LONG).show();
}
} } }
29、xml文件的序列化
->一個(gè)小異常:如果沒(méi)有識(shí)別這個(gè)設(shè)備,重啟的話(huà)要記得吧adb殺掉->自己手動(dòng)添加,這種方式效率低,容易出錯(cuò)->XmlSerializer:XML序列化生成器
30、采用pull解析xml文件
->用于對(duì)象的持久化,將對(duì)象寫(xiě)到硬盤(pán)中,需要用的時(shí)候再反序列化取出來(lái)。
所謂序列化其實(shí)就是將程序中的數(shù)據(jù)(對(duì)象)通過(guò)某種方式,保存到本地中。然后可以在程序關(guān)閉之后還保存程序的某個(gè)執(zhí)行狀態(tài),方便在程序下次
執(zhí)行的時(shí)候通過(guò)”反序列化“讀取出來(lái),并且能夠還原數(shù)據(jù)的類(lèi)型,從而延續(xù)程序退出時(shí)的狀態(tài)。
一般來(lái)說(shuō),我們會(huì)使用序列化保存一些需要持久化的數(shù)據(jù),當(dāng)然如果這個(gè)數(shù)據(jù)會(huì)比較龐大的話(huà),我們就直接使用數(shù)據(jù)庫(kù)了!所以,序列化實(shí)際上目前很多領(lǐng)域用的已經(jīng)不多了,大部分使用 都已被數(shù)據(jù)庫(kù)替代了!
序列化就是一種用來(lái)處理對(duì)象流的機(jī)制,所謂對(duì)象流也就是將對(duì)象的內(nèi)容進(jìn)行流化??梢詫?duì)流化后的對(duì)象進(jìn)行讀寫(xiě)操作,也可將流化后的對(duì)象傳輸于網(wǎng)絡(luò)之間。序列化是為了解決在對(duì)對(duì)象流進(jìn)行讀寫(xiě)操作時(shí)所引發(fā)的問(wèn)題。序列化的實(shí)現(xiàn):將需要被序列化的類(lèi)實(shí)現(xiàn)Serializable接口,該接口沒(méi)有需要實(shí)現(xiàn)的方法,implements Serializable只是為了標(biāo)注該對(duì)象是可被序列化的,然后使用一個(gè)輸出流(如:FileOutputStream)來(lái)構(gòu)造一個(gè)ObjectOutputStrea
->xml文件的解析方式:
->DOM一次將XML文件加載進(jìn)內(nèi)存,生成樹(shù)狀結(jié)構(gòu),在內(nèi)存中對(duì)樹(shù)狀結(jié)構(gòu)進(jìn)
行操作,缺點(diǎn)是消耗內(nèi)存大,->SAX解析:基于事件的方式,自上而下,事件下去了就不能解析了,優(yōu)點(diǎn)
是速度快,效率高,缺點(diǎn)是不能倒退;
->android下增加了一種解析xml文件的方式,pull解析,類(lèi)似于SAX解析,定義了一個(gè)指針,指向了文檔的開(kāi)頭,得到指針,一個(gè)tag一個(gè)tag的解析下去
->利用類(lèi)加載器走到文件->創(chuàng)建一個(gè)解析器:pullParse0
具體代碼:
(MainActivity.java)package com.example.xml;
import java.util.List;
import org.w3c.dom.Text;
import com.example.xml.domain.WeatherInfo;import com.example.xml.service.WeatherService;
import android.support.v7.app.ActionBarActivity;import android.support.v7.app.ActionBar;import android.support.v4.app.Fragment;import android.app.Activity;import android.os.Bundle;import android.view.LayoutInflater;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.ViewGroup;import android.widget.TextView;import android.os.Build;
public class MainActivity extends Activity {
@Override protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv =(TextView)findViewById(R.id.tv);
List weatherInfos = WeatherService.getWeatherInfos(MainActivity.class.getClassLoader().getResourceAsStream(”weather.xml“));
StringBuilder sb = new StringBuilder();
for(WeatherInfo info:weatherInfos){
sb.append(info.toString()+”n“);
}
tv.setText(sb.toString());}
@Override public boolean onCreateOptionsMenu(Menu menu){
// Inflate the menu;this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);
return true;} }
(WeatherInfo.java)/** * */ package com.example.xml.domain;
import android.R.integer;/** * @author yonghen * */ public class WeatherInfo { private int id;private String name;private String wind;private String weather;private String temp;private String pm;/*(non-Javadoc)* @see java.lang.Object#toString()*/ @Override public String toString(){
return ”WeatherInfos [id=“ + id + ”, name=“ + name + ”, wind=“ + wind
+ ”, weather=“ + weather + ”, temp=“ + temp + ”, pm=“ + pm
+ ”]“;}
/** * @param id * @param name * @param wind * @param weather
* @param temp * @param pm */ public WeatherInfo(){ super();} public WeatherInfo(int id, String name, String wind, String weather,String temp, String pm){ super();this.id = id;this.name = name;this.wind = wind;this.weather = weather;this.temp = temp;this.pm = pm;} /** * @return the id */ public int getId(){ return id;} /** * @param id the id to set */ public void setId(int id){ this.id = id;} /** * @return the name */ public String getName(){ return name;} /** * @param name the name to set */ public void setName(String name){ this.name = name;} /** * @return the wind */
public String getWind(){ return wind;} /** * @param wind the wind to set */ public void setWind(String wind){ this.wind = wind;} /** * @return the weather */ public String getWeather(){ return weather;} /** * @param weather the weather to set */ public void setWeather(String weather){ this.weather = weather;} /** * @return the temp */ public String getTemp(){ return temp;} /** * @param temp the temp to set */ public void setTemp(String temp){ this.temp = temp;} /** * @return the pm */ public String getPm(){ return pm;} /** * @param pm the pm to set */ public void setPm(String pm){ this.pm = pm;
}
}
(WeatherService.java)/** * */ package com.example.xml.service;
import java.io.IOException;import java.io.InputStream;import java.util.ArrayList;import java.util.List;
import org.xmlpull.v1.XmlPullParser;import org.xmlpull.v1.XmlPullParserException;
import android.R.integer;import android.util.Xml;
import com.example.xml.domain.WeatherInfo;/** * @author yonghen * */ public class WeatherService { public static List getWeatherInfos(InputStream inputStream){
XmlPullParser xmlPullParser = Xml.newPullParser();
WeatherInfo weatherInfo = null;
List weatherInfos = null;
try {
xmlPullParser.setInput(inputStream, ”utf-8“);
int type = xmlPullParser.getEventType();//拿到的是當(dāng)前的事件類(lèi)型:
while(type!= xmlPullParser.END_DOCUMENT){
switch(type){
case XmlPullParser.START_TAG:
if(”info“.equals(xmlPullParser.getName())){//解析到全局開(kāi)始的標(biāo)簽
weatherInfos = new ArrayList();
}else if(”city“.equals(xmlPullParser.getName())){
weatherInfo = new WeatherInfo();
String idString = xmlPullParser.getAttributeName(0);
weatherInfo.setId(Integer.parseInt(idString));//字符串轉(zhuǎn)化成整型數(shù)據(jù)
}else if(”temp“.equals(xmlPullParser.getName())){
String temp = xmlPullParser.nextText();
weatherInfo.setTemp(temp);
}else if(”wind“.equals(xmlPullParser.getName())){
String wind = xmlPullParser.nextText();
weatherInfo.setWind(wind);
}else if(”name“.equals(xmlPullParser.getName())){
String name = xmlPullParser.nextText();
weatherInfo.setName(name);
}else if(”weather“.equals(xmlPullParser.getName())){
String weather = xmlPullParser.nextText();
weatherInfo.setName(weather);
}else if(”pm“.equals(xmlPullParser.getName())){
String pm = xmlPullParser.nextText();
weatherInfo.setPm(pm);
}
break;
case XmlPullParser.END_TAG:
if(”city“.equals(xmlPullParser.getName())){
weatherInfos.add(weatherInfo);
weatherInfo=null;
}
break;
}
type = xmlPullParser.next();
}
} catch(XmlPullParserException e){
// TODO Auto-generated catch block
e.printStackTrace();
} catch(IOException e){
// TODO Auto-generated catch block
e.printStackTrace();
}
return weatherInfos;} }(Weather.xml)
20/30
5月20日 多云轉(zhuǎn)晴
南風(fēng)3-4
上海
200
20/30
5月19日 多云轉(zhuǎn)晴
南風(fēng)3-4
上海
200
20/30
5月18日 多云轉(zhuǎn)晴
南風(fēng)3-4
上海
200
20/30
5月17日 多云轉(zhuǎn)晴
南風(fēng)3-4
上海
200
31、采用斷點(diǎn)調(diào)試的方法觀察pull解析的的流程
->現(xiàn)在代碼雙單擊添加斷點(diǎn)
->debug as Android Application->然后打開(kāi)調(diào)試視圖
32、android下創(chuàng)建一個(gè)sqllite數(shù)據(jù)庫(kù)
->SQLiteOpenHelper(數(shù)據(jù)庫(kù)大概幫助類(lèi)):數(shù)據(jù)庫(kù)創(chuàng)建和打開(kāi)的幫助類(lèi)->
->PersonSQLiteOpenHelper.java /** * */ package com.example.sqlite;
import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteDatabase.CursorFactory;import android.database.sqlite.SQLiteOpenHelper;/** * @author yonghen * */ public class PersonSQLiteHelper extends SQLiteOpenHelper {
/**
* @數(shù)據(jù)庫(kù)的構(gòu)造方法,用來(lái)定義數(shù)據(jù)庫(kù)的名稱(chēng),數(shù)據(jù)庫(kù)查詢(xún)的結(jié)果集,數(shù)據(jù)庫(kù)的版本 */ public PersonSQLiteHelper(Context context){//Context:上下文告訴數(shù)據(jù)庫(kù)存放在什么位置,String name:數(shù)據(jù)庫(kù)名,factory一般為null,設(shè)置系統(tǒng)默認(rèn)的游標(biāo)工廠,super(context, ”P(pán)erson.db“, null, 1);
} /* * 數(shù)據(jù)庫(kù)第一次被創(chuàng)建的時(shí)候調(diào)用的方法,db創(chuàng)建的數(shù)據(jù)庫(kù) */ @Override public void onCreate(SQLiteDatabase db){
db.execSQL(”create table person id integer primary antoincrement,name varchar(20),number varchar(20)");//底層存儲(chǔ)類(lèi)型都是String,(20)都是給程序員看的,其實(shí)沒(méi)有影響
}
/*(non-Javadoc)* @see android.database.sqlite.SQLiteOpenHelper#onUpgrade(android.database.sqlite.SQLiteDatabase, int, int)*/ @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){ } }
->TestPersonDB.java /** * */ package com.example.sqlite;
import android.database.sqlite.SQLiteAbortException;import android.database.sqlite.SQLiteDatabase;import android.test.AndroidTestCase;/** * @author yonghen * */ public class TestPersonDB extends AndroidTestCase { public void testCreateDB(){ PersonSQLiteHelper personSQLiteHelper = new PersonSQLiteHelper(getContext());//new出來(lái)一個(gè)對(duì)象,實(shí)際上數(shù)據(jù)庫(kù)并未被真正的創(chuàng)建,測(cè)試框架提供了一個(gè)獲取Context的方法
personSQLiteHelper.getWritableDatabase();//數(shù)據(jù)庫(kù)才會(huì)被真正的創(chuàng)建出來(lái), } }
33、sql語(yǔ)句實(shí)現(xiàn)數(shù)據(jù)庫(kù)的增刪改查
->javaweb:
->加載到j(luò)dbc的驅(qū)動(dòng);//android已經(jīng)集成在framework->鏈接到數(shù)據(jù)庫(kù);//只要拿到數(shù)據(jù)庫(kù)的引用
->準(zhǔn)備sql語(yǔ)句 增刪改查
->增加:insert into person(name,number)values('zhang','110')->刪除:delete from person where name = 'zhangsan'->修改:update person set number = '119' where name = 'zhangsan'->查找:select * from person->查找具體:select * from person where name = 'zhangsan'
->PersonSQLiteHelper.java /** * */ package com.example.sqlite;
import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteDatabase.CursorFactory;import android.database.sqlite.SQLiteOpenHelper;/** * @author yonghen * */ public class PersonSQLiteHelper extends SQLiteOpenHelper {
/** * @數(shù)據(jù)庫(kù)的構(gòu)造方法,用來(lái)定義數(shù)據(jù)庫(kù)的名稱(chēng),數(shù)據(jù)庫(kù)查詢(xún)的結(jié)果集,數(shù)據(jù)庫(kù)的版本
*/ public PersonSQLiteHelper(Context context){//Context:上下文告訴數(shù)據(jù)庫(kù)存放在什么位置,String name:數(shù)據(jù)庫(kù)名,factory一般為null,設(shè)置系統(tǒng)默認(rèn)的游標(biāo)工廠,
【黑馬程序員】PHP課程同步筆記day18:PHP函數(shù)
PHP函數(shù) 1.概念
將一段常用的功能代碼,進(jìn)行封裝,然后起個(gè)名字,叫”函數(shù)” 使用函數(shù),可以減少我們的工作量。對(duì)于后期的項(xiàng)目維護(hù),十分方便。2.函數(shù)定義格式
Function functionName(形參1,形參2,形參3......){
函數(shù)的功能代碼
[return 參數(shù)r] } 函數(shù)語(yǔ)法格式說(shuō)明:
Function是系統(tǒng)關(guān)鍵字,不分大小寫(xiě)。
functionName是自定義的函數(shù)名稱(chēng)。函數(shù)名的命名規(guī)則與變量一樣,只是不加$符號(hào)。
()定義函數(shù)時(shí)的參數(shù),該參數(shù)又稱(chēng)為”形參”。
形式參數(shù):主要用來(lái)接收調(diào)用函數(shù)者,傳遞過(guò)來(lái)的數(shù)據(jù)。
形參可以是多個(gè),多個(gè)形參之間用逗號(hào)隔開(kāi),也可以沒(méi)有形參
形參其實(shí)就是一個(gè)變量的名稱(chēng),主要用來(lái)臨時(shí)存儲(chǔ)數(shù)據(jù)的。{}是函數(shù)的功能代碼。Return語(yǔ)句:
向誰(shuí)返回內(nèi)容?誰(shuí)調(diào)用了該函數(shù),就向誰(shuí)返回。
返回什么內(nèi)容?該內(nèi)容的類(lèi)型不限制,可以是任何數(shù)據(jù)類(lèi)型
黑馬程序員濟(jì)南中心 編著
Return語(yǔ)句,一旦執(zhí)行,函數(shù)將中止。也就是return語(yǔ)句之后的函數(shù)代碼不再執(zhí)行。
Return 語(yǔ)句返回一個(gè)值,并退出函數(shù)。
3.函數(shù)調(diào)用
函數(shù)定義是不會(huì)自動(dòng)執(zhí)行的。函數(shù)必須要經(jīng)過(guò)調(diào)用,才能看到結(jié)果 調(diào)用函數(shù)和定義函數(shù)不分順序。4.函數(shù)參數(shù)
a)形式參數(shù)(形參):形參主要用來(lái)接收調(diào)用函數(shù)傳遞過(guò)來(lái)的數(shù)據(jù)。
i.形參一般是變量,不能是具體的值
ii.形參只能在函數(shù)內(nèi)部使用
b)實(shí)際參數(shù)(實(shí)參):向定義函數(shù)傳遞的數(shù)據(jù)
i.實(shí)參可以是具體值,也可以是一個(gè)變量
c)形參和實(shí)參的個(gè)數(shù),一般情況下必須一致 Function showInfo($a){ Echo “OK”;} $a = 100;showInfo($a);函數(shù)參數(shù)傳遞 1.值傳遞(拷貝傳值)將一個(gè)變量的值,”拷貝”一份,傳給形參
黑馬程序員濟(jì)南中心 編著
在函數(shù)內(nèi)部,對(duì)形參進(jìn)行了修改,而函數(shù)外的這個(gè)變量不會(huì)改變 函數(shù)內(nèi)的形參,與函數(shù)外的實(shí)參,是相互獨(dú)立的,沒(méi)有任何聯(lián)系的
在PHP中,默認(rèn)”值傳遞”的有:字符型、整型、浮點(diǎn)型、布爾型、數(shù)組、NULL
2.引用傳遞
將一個(gè)變量的地址傳給形參,即形參與變量指向的是”同一物”.變量和參數(shù)之間是相互聯(lián)系,修改一個(gè),另一個(gè)會(huì)跟著變。
參數(shù)在使用引用傳遞時(shí),需要在”形參”前加一個(gè)”&”符號(hào)?!睂?shí)參”前不能添加。
默認(rèn)引用傳地址:資源和對(duì)象
黑馬程序員濟(jì)南中心 編著
3.默認(rèn)參數(shù)
PHP支持默認(rèn)參數(shù)。
當(dāng)實(shí)參格式少于形參個(gè)數(shù)時(shí),那么少的那個(gè)實(shí)參可以用末日的形參來(lái)代替
匿名函數(shù)
1.概念
沒(méi)有名字的函數(shù)就是匿名函數(shù),它不能單獨(dú)定義也不能單獨(dú)調(diào)用 匿名函數(shù)一般用來(lái)給其他變量賦值的。
黑馬程序員濟(jì)南中心 編著
2.匿名函數(shù)的兩種用法
i.將匿名函數(shù)當(dāng)成一個(gè)數(shù)據(jù),賦給其他變量
ii.將匿名函數(shù)作為函數(shù)的參數(shù)來(lái)使用
變量作用域
變量作用域:就是變量生效的范圍
在PHP中三種變量作用域:全局變量、局部變量、超全局變量。1.全局變量
全局變量:在函數(shù)外部定義的變量,稱(chēng)為”全局變量”。
黑馬程序員濟(jì)南中心 編著
全局變量,在網(wǎng)頁(yè)執(zhí)行完畢,就消失了。在JS中,全局變量,可以直接在函數(shù)內(nèi)部來(lái)使用 在PHP中,全局變量不能直接在函數(shù)內(nèi)部使用 2.局部變量
局部變量:在函數(shù)內(nèi)部定義的變量,稱(chēng)為”局部變量”。局部變量,只能在函數(shù)內(nèi)部來(lái)使用 局部變量,在函數(shù)執(zhí)行完畢后就消失了。3.在局部作用域中訪(fǎng)問(wèn)全局變量---global關(guān)鍵字
Global關(guān)鍵字,只能在函數(shù)內(nèi)部來(lái)使用
不能在使用global關(guān)鍵字時(shí),直接給變量賦值。只能是先聲明為全局,再賦值。
$GLOBALS超全局?jǐn)?shù)組
“超全局?jǐn)?shù)組變量”可以在網(wǎng)頁(yè)的任何地方使用,包括函數(shù)內(nèi)部和函數(shù)外部。$GLOBALS超全局?jǐn)?shù)組中包含的內(nèi)容有:$_GET、$_POST、$_COOKIE、$_FILES
黑馬程序員濟(jì)南中心 編著
【黑馬程序員】PHP課程同步筆記day17:數(shù)組介紹
數(shù)組 1.數(shù)組的概念
數(shù)組是一組值的集合,變量是單個(gè)值的容器,而數(shù)組是多個(gè)值的容器 2.數(shù)組的分類(lèi)
1.枚舉數(shù)組:數(shù)組的下標(biāo)是從0開(kāi)始的正整數(shù)
2.關(guān)聯(lián)數(shù)組:數(shù)組的下標(biāo)可以是字符串
$arr = array(“db_host” => “l(fā)ocalhost”, “db_user” => “root”, “db_pwd” =>”root”,);
3.混合數(shù)組:下標(biāo)既有整型的,也有字符串的
$arr = array(“db_host” => “l(fā)ocalhost”, “db_user” => “root”, “db_pwd” =>”root”, “黑馬程序員”, “濟(jì)南分校”);
4.多維數(shù)組:數(shù)組的元素的值的類(lèi)型是一個(gè)數(shù)組。數(shù)組套數(shù)組。數(shù)組元素的下標(biāo)只能是正整數(shù)和字符串。數(shù)組元素的值,可以是任何類(lèi)型,當(dāng)然可以是數(shù)組。
黑馬程序員濟(jì)南中心 編著
$arr = array(Array(10,11,12,13), Array(20,21,22), Array(30,31), TRUE,NULL);3.數(shù)組的創(chuàng)建
a)使用array()來(lái)創(chuàng)建數(shù)組 $arr = array([$key=>]$value, [$key=>]$value, [$key=>]$value,.....);語(yǔ)法說(shuō)明:
$key代表數(shù)組元素的下標(biāo),可以省略。
$key的類(lèi)型可以是整型和字符型,如果$key省略,默認(rèn)的數(shù)組應(yīng)該是枚舉數(shù)組。$value代表數(shù)組元素的值,值可以是任何類(lèi)型?!?>”重載下標(biāo),或者重新指定下標(biāo)。多個(gè)數(shù)組元素之間用英文下的逗號(hào)隔開(kāi)。b)使用[]創(chuàng)建數(shù)組的語(yǔ)法
語(yǔ)法1:$arr[] = $value
黑馬程序員濟(jì)南中心 編著
說(shuō)明: 1)如果數(shù)組不存在,則會(huì)創(chuàng)建一個(gè)數(shù)組 2)第一個(gè)元素就是下標(biāo)為0的元素 3)如果數(shù)組存在,則相當(dāng)于添加一個(gè)新元素 4)新元素的下標(biāo),應(yīng)該是最大整數(shù)下標(biāo)+1 語(yǔ)法2: $arr[$key] = $value 說(shuō)明:
1)同時(shí)指定下標(biāo),指定的下標(biāo)是多少,就是多少。2)如果指定的數(shù)組不存在,也會(huì)創(chuàng)建一個(gè)數(shù)組 3)如果指定的數(shù)組存在,則添加一個(gè)新元素 $arr[] = 100;$arr[] = 200;$arr[5] = 500;$arr[“a”] = “abc”;多維數(shù)組
1、使用array()來(lái)創(chuàng)建多維數(shù)組
$arr = array(Array(10,11,12,13,14), Array(20,21,22,23), Array(30,31,32), Array(Array(40,41),黑馬程序員濟(jì)南中心 編著
Array(42,43)));
2、使用[]來(lái)創(chuàng)建多維數(shù)組
$arr[“name”] = “Mary”;$arr[“sex”] = “男”;$arr[“contact”][“tel”] = “11111111111”;$arr[“contact”][“qq”] = “11233321”;$arr[] = array(10,20,30);實(shí)例:用表格輸出二維數(shù)組 $arr = array(Array(“10010”,”Mary”,”大專(zhuān)”,”傳智專(zhuān)修學(xué)院”), Array(“10020”,”Kate”,”大專(zhuān)”,”傳智專(zhuān)修學(xué)院”), Array(“10030”,”James”,”大專(zhuān)”,”傳智專(zhuān)修學(xué)院”), Array(“10040”,”Kobe”,”大專(zhuān)”,”傳智專(zhuān)修學(xué)院”),);$str = “”;$str.= “
” For($i = 0;$i”;For($j=0;$j”.$arr[$i][$j].””;黑馬程序員濟(jì)南中心 編著
} $str.= “”;} $str.= “
”;Echo $str;數(shù)組操作函數(shù) 1.print_r()a)描述:打印變量信息
b)語(yǔ)法:print_r(mixed $expression)c)說(shuō)明:如果給出的是string、interger或float,將打印變量值本身。如果給出的是array,將會(huì)按照一定格式顯示鍵和元素
2.Count()a)描述:統(tǒng)計(jì)數(shù)組有效數(shù)據(jù)的個(gè)數(shù)
b)說(shuō)明:計(jì)算數(shù)組中的單元數(shù)目或?qū)ο笾械膶傩詡€(gè)數(shù)。c)語(yǔ)法:int count(mixed $var)d)參數(shù):$mode是否統(tǒng)計(jì)多維數(shù)組中的個(gè)數(shù) 3.Unset()a)描述:刪除變量或數(shù)組元素或者對(duì)象屬性 b)語(yǔ)法:void unset(mixed $var)c)返回值:無(wú)
d)注意:如果刪除變量的話(huà),只是刪除變量名稱(chēng)和到值之間的指向。如果刪除數(shù)組元素的話(huà),值會(huì)被刪除,而下標(biāo)還在。如果刪除整個(gè)數(shù)組的話(huà),而整個(gè)數(shù)組都不存在黑馬程序員濟(jì)南中心 編著
了。
實(shí)例:求一維數(shù)組中元素的平均值 $arr = array(1,2,3,4,5,6,7,8);$num = 0;$len = count($arr);For($i=0;$i<$len;++$i){ $sum += $arr[$i];} Echo “平均值為:”.$sum/$len;實(shí)例:求二維數(shù)組中元素的平均值 $arr = array(Array(10,11,12,13,14), Array(20,21,22,23), Array(30,31,32), Array(40,41), Array(50));$sum = 0;$len = 0;For($i = 0;$i黑馬程序員濟(jì)南中心 編著
$len ++;} } Echo “平均值:”.round($sum/$len,2);實(shí)例:求一維數(shù)組中的最大值 $arr = array(9,2,3,45,5,7);$max = $arr[0];For($i=0;$iIf($max<$arr[$i]){
黑馬程序員濟(jì)南中心 編著
$max = $arr[$i];$max_index = $i;} //最小值
If($min>$arr[$i]){ $min = $arr[$i];$min_index = $i;} } //交換最大值和最小值的位置 $arr[$max_index] = $min;$arr[$min_index] = $max;數(shù)組遍歷:foreach 語(yǔ)法結(jié)構(gòu):
Foreach($arr as [$key=>]$value){循環(huán)體代碼} 語(yǔ)法結(jié)構(gòu)說(shuō)明:
$arr代表當(dāng)前要遍歷的數(shù)組名稱(chēng) As是系統(tǒng)關(guān)鍵字
$key表示每一次取到元素的鍵名,可以省略 $value表示每一次取到元素的鍵值 如果數(shù)組指針指到數(shù)組的末端,則退出循環(huán) 實(shí)例:foreach遍歷一維數(shù)組
黑馬程序員濟(jì)南中心 編著
$arr = array(“name” => “Mary”, “sex” => “男”, “age” => 24);Foreach($arr as $key=>$value){ Echo “$arr[$key]=$value ”;} 實(shí)例:foreach遍歷二維數(shù)組 $arr = array(“a” =>array(“10010”,”Mary”,”男”,24), “b”=>array(“10020”,”Kate”,”女”,20), “c” => array(“10030”,”Kobe”,”男”,40));$str = “”;$str.=”
”;Foreach($arr as $arr2){ $str.=””;Foreach($arr2 as $value){ $str.=”$value ”;} $str.=” ”;黑馬程序員濟(jì)南中心 編著
} $str.=”
”;Echo $str;實(shí)例:foreach 中的$value引用傳地址 $arr = array(1,2,3,4,5,6,7,8);Foreach($arr as &$value){ $value *=2;} Var_dump($arr);數(shù)組操作函數(shù) 1.each()a)描述:返回?cái)?shù)組中當(dāng)前的鍵/值對(duì)(數(shù)組元素)并將數(shù)組指針向前移動(dòng)一步 b)語(yǔ)法:array each(array &$array)c)返回值:返回array數(shù)組中當(dāng)前指針位置的鍵/值對(duì)并向前移動(dòng)數(shù)組指針。鍵值對(duì)被返回四個(gè)單元的數(shù)組。單元0和key包含有數(shù)組單元的鍵名,1和value包含有數(shù)據(jù)。
2.List()a)描述:把數(shù)組中的值(前幾個(gè)值)賦給一些變量 b)語(yǔ)法:array list(mixed $varname)c)舉例:list($name,$sex,$age)= array(“Kobe”,”男”,24,”高中”);i.說(shuō)明:將數(shù)組中前三個(gè)元素的值,賦給list函數(shù)中的三個(gè)變量。
ii.數(shù)組中多余的值不需要
黑馬程序員濟(jì)南中心 編著
iii.要求數(shù)組必須是枚舉數(shù)組,下標(biāo)必須是從0開(kāi)始的正整數(shù) iv.下標(biāo)必須是連續(xù)的,中間不能斷檔。
黑馬程序員濟(jì)南中心 編著