編輯:關於Android編程
在由Eclipse轉到Android Studio之後,第一個讓我感到困惑的是build.gradle這個文件了,實在話,當時我並不知道這麼寫是幾個意思。
apply plugin: 'com.android.application' android { compileSdkVersion 21 buildToolsVersion "21.1.2" defaultConfig { applicationId "com.example.test" minSdkVersion 17 targetSdkVersion 21 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:21.0.3' }
如上就是建立一個as工程生成的基本構建文件了,暫且不需要知道他底層怎麼實現,至少要知道這麼寫是幾個意思,為何要這麼寫,我們需要一步一步來揭穿它。
一:Gradle 是基於Groovy語言來構建的,第一點就得了解什麼是Groovy語言,以及它的語法。
Groovy是一種動態語言,是從Java語言進化而來,可以說是Java的加強,它能運行於JVM上,具體的一些介紹可以自行谷歌了解,這裡只是為了簡單的看懂Groovy和基本使用。
開發環境:
Eclipse Groovy開發插件 http://dist.springsource.org/release/GRECLIPSE/e4.4 後邊的e4.x要自己對照自己的eclipse版本,否則可能出現無法安裝的問題,我的是4.4。
第一個Groovy程序:
右鍵,新建一個Groovy工程,添加一個groovy資源包(只是為了區分),然後在src下先新建一個JavaTest.java類,勾選main方法,關在方法裡寫下一行代碼打印一個字符串 Hello groovy!
public class JavaTest { public static void main(String[] args) { System.out.println("Hello groovy!"); } }
上面是一個很簡單的Java類,運行之後將會在控制台輸出Hello groovy!
然後同理,我們在groovy資源包下新建一個GroovyTest.groovy 選擇新建-other-Grooovy Class
class GroovyTest { static main(args) { println "Hello groovy!" } }
右鍵使用Groovy運行後,也會在控制台上打印出 Hello groovy!
相比於JavaTest.java我們發現,GroovyTest.groovy。似乎和JavaTest.java長得很像,只不過是將JavaTest.java去掉了一些內容,如class的修飾符public ,打印的System.out ,參數args的類型String[]。下面我們對GroovyTest.groovy做一些改動:
class GroovyTest { static main(args) { System.out.println "Hello groovy!" } }
運行之後發現一樣能輸入Hello groovy!, 有意思,有意思,那我們再給args加上String[]的類型能,
class GroovyTest { static main(String[] args) { System.out.println.println "Hello groovy!" } }
發現一樣能運行,並且同樣輸入Hello groovy! ,有趣了,是不是說我把java裡面的代碼都拷過來也能運行呢,這時變成這樣:
public class GroovyTest { public static void main(String[] args) { System.out.println("Hello groovy!"); } }
和你想的結果一樣,他也准確無語的輸出了Hello groovy!,哦,原來和我們看到的一些說明是正確的,groovy和java代碼是一樣的,它只不過是對java代碼進行簡化了。
不是說簡化嗎,假如我把GroovyTest類的代碼簡化成這樣:
println "Hello groovy!"
運行後,發現居然可以輸出來Hello groovy!
下面是一些說明:
Groovy類和java類一樣,完全可以用標准java bean的語法定義一個Groovy類。但作為另一種語言,可以使用更Groovy的方式定義類,這樣的好處是,可以少寫一半以上的javabean代碼。 (1)不需public修飾符 如前面所言,Groovy的默認訪問修飾符就是public,如果Groovy類成員需要public修飾,則根本不用寫它。 (2)不需要類型說明 同樣前面也說過,Groovy也不關心變量和方法參數的具體類型。 (3)不需要getter/setter方法 在很多ide(如eclipse)早就可以為程序員自動產生getter/setter方法了,在Groovy中,不需要getter/setter方法--所有類成員(如果是默認的public)根本不用通過getter/setter方法引用它們(當然,如果一定要通過getter/setter方法訪問成員屬性,Groovy也提供了它們)。 (4)不需要構造函數 不再需要程序員聲明任何構造函數,因為實際上只需要兩個構造函數(1個不帶參數的默認構造函數,1個只帶一個map參數的構造函數--由於是map類型,通過這個參數可以構造對象時任意初始化它的成員變量)。 (5)不需要return Groovy中,方法不需要return來返回值。 (6)不需要() Groovy中方法調用可以省略()(構造函數除外)。
因為groovy是動態語言,就跟js一樣,Groovy對於類型的定義都用def這個關鍵字來聲明,它在底層會自動判斷當前的變量是一個什麼類型:
我們在上面也看到GroovyTest.groovy文件中,只寫了一個println "Hello groovy!" 也是可以正常運行的,所以以下我們都用最簡化直接在文件中輸入這些代碼。
定義一個字符串
def aa="Hello" println aa
假如把打印跟定義換個位置,將會報錯
println aa def aa="Hello"
由此看來,groovy也是由上到下來運行的,看起來像是把這些都放到main之中去運行。
//先定義再賦值
def str str="r" println str
定義一個整形
def num=10 println num
定義一個整形數組集合
def colum=[2,3,4,5] println colum[0]
因為groovy已經重載了<<所以我們可以用<<來向集合加入一個值
def strArry=["jin","mu","shui"] strArry.add("huo") strArry << "tu" println strArry //輸出:[jin, mu, shui, huo, tu]
定義一個Map類型
def map=[key:"name",value:"mjk"] println map["key"] println map["value"]
輸出:
name
mjk
只要看到是 key:value都是map類型,因為key會自動轉換成string,所以你可以寫成def map=["key":"name","value":"mjk"]也可以寫成def map=[key:"name",value:"mjk"]
如果想知道當前這個變量是一個什麼類型可以用 .class來打印
def str="I am string" println str.class
輸出:class java.lang.String
循環的使用:
def arry=["a","b","c","d"] for(a in arry){ println a }
定義一個方法,接收兩個參數,輸出它們的和
def num=10 def method(a,b){ println a+b } method num,9
當然使用method(num,9)是一樣的,只是去掉了括號,參數之間用逗號隔開
在定義一個map類型的時候,一定要加[],如果不加會報錯,而在方法調用時,可以不加[],如果方法調用的map參數要加[],則必須在外部加()
如:
//打印 map值 def printMap(map){ println map["key"] } printMap key:"name"
輸出:name
//定義一個方法,打印接收到的值
def printStr(str){ println str } printStr "Hello groovy!"
定義閉包:
閉包是Groovy裡面一個很重要的特性,這裡要著重講,
先看一個groovy對集合本身的實現了的一個包含閉包的方法each
def acoll = ["媽媽", "爸爸", "我"] acoll.each{ println it }
輸出:
媽媽
爸爸
我
acoll是一個字符串的集合,這個集合裡面有一個方法叫each,接收一個參數,這個參數是一個閉包,因為閉包也是一種類型,所以它也能像變量一樣當參數傳遞給方法使用。我們這裡簡單的理解,閉包是一個用花括號{}括起來的代碼塊,這個代碼塊在被觸發的時候調用。
上面each中的it是一個關鍵字,它保存了返回到這個閉包中的一個值。下面我們來用自己的方法實現這個each
//定義一個方法,這個方法接收一個集合參數跟一個閉包,當方法被調用時,遍歷集合裡面的值,並把值傳回給閉包
def myEach(arry,block){ for(i in arry){ block(i) } } def arr=["爸爸","媽媽","我"]//字符串集合 //調用myEach方法 myEach(arr,{ println it });
輸出:
爸爸
媽媽
我
原來流程是這樣,當我們調用myEach方法時,要傳入一個集合arr,和閉包。當方法,myEach在遍歷集合的時候,每得到一個值 就會回調一下這個閉包並把值傳給它,從這裡看是不是覺得,這個閉包既像一個變量參數,又像一個方法呢。
定義一個閉包並調用它:
//因為閉包是一種類型,所以在定義的時候要用=來給它賦值,這是跟方法有本質的區別
def block={ println "調用block" } block() 輸出:調用block 定義一個閉包並傳入一個參數 def block={ println "調用block"+it } block("--並傳入參數")
輸出:調用block--並傳入參數
要是我們不想用it這個關鍵字,也是可以定義自己的關鍵字的,只是我們要使用->來告訴它,是用我們自己定義的變量來接收值,而不用it
def block={param -> println "調用block"+param } block("--並傳入參數") //兩個參數 def block={param1,param2-> println "調用block"+param1+param2 } block("--參數1","參數2")
下面我們定義一個block,這個block是用來打印接收到的值,目的是去遍歷給定的集合
def block={data-> println "value="+data } //定義一個方法,這個方法接收一個集合參數跟一個閉包,當方法被調用時,遍歷集合裡面的值,並把值傳回給閉包 def myEach(arry,block){ for(i in arry){ block(i) } } def arr=["爸爸","媽媽","我"]//字符串集合 //調用myEach方法 myEach(arr,block)
輸出:
value=爸爸
value=媽媽
value=我
我們知道方法的括號是可以去掉的,如果上面調用方法時我們去掉括號就變成了:
//原來的是:myEach(arr,block)
myEach arr,block
而如果只是接收一個閉包的方法就可以寫成:
myEach block
如果block是匿名的,那就成為:
myEach {
}
所以我們可以知道,集合的each方法是怎麼實現遍歷的,當我們的這個集合已經知道了裡面的值,調用each時,只需要傳入一個閉包參數,就可以得到每一個值。
一般來說,如果有多個參數,而最後一個為閉包的時候,調用方法的時候習慣寫成:
myEach(param1,param2,param3){
}
實例:
//定義一個方法,這個方法接收一個集合參數跟一個閉包,當方法被調用時,遍歷集合裡面的值,並把值傳回給閉包 def myEach(arry,block){ for(i in arry){ block(i) } } def arr=["爸爸","媽媽","我"]//字符串集合 //調用myEach方法,並傳入一個集合跟一個匿名的閉包 myEach (arr){data-> println "value="+data }
到此差不多把groovy裡面的一些基本的語法說完了。下面講一下gradle
二:gradle
Gradle是一個構建工具,感興趣的可以去官網上了解,它的構建是基於一個一個的任務,task。我覺得把groovy弄懂了,對於gradle只是多去看一下開發指南就行,這裡不再說明。
三:回到build.gradle
講完了上面,這個時候可以把開篇的build.gradle貼到這裡說了,直接在代碼裡面加解釋:
//這一行,一看就知道調用了一個方法叫apply 傳入一個map類型的參數,key是plugin ,plugin的值是"com.android.application"說明是一個android應用工程 //在gradle中有介紹把你自己的一組代碼,構建做成一個plugin,如果把plugin的值改成"com.android.library"就說明這是一個庫工程 apply plugin: 'com.android.application' //android這個方法接收一個閉包,在閉包裡,調用的compileSdkVersion, buildToolsVersion等方法並給他們傳值,並且還調用了defaultConfig這個方法來做一些配置,這個方法也是接收一個閉包,可以想象,通過閉包回調可以對值進行設置,當調用defaultConfig方法的時候,方法裡面會先調用傳入的這個閉包來初始化一些值,然後再進行別的其他操作。這也就是閉包的魅力所在。 android { compileSdkVersion 21 buildToolsVersion "21.1.2" defaultConfig { applicationId "com.example.test" minSdkVersion 17 targetSdkVersion 21 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:21.0.3' }
通過以上這些講解,希望讀者們能對build.gadle文件有一些認識,這樣你也可以自己修改build.gadle文件來完成你自己想要的構建流程。
另外大家可以在這裡找到關於Gradle一些內置的方法還有他們的功能,以及AS為android工程提供的一些方法:
http://google.github.io/android-gradle-dsl/current/
Android-搭建簡單服務端+ListView異步加載數據2014年5月6日 本篇博文帶給大家的是教大家如何在MyEclipse中搭建一個服務端,並通過手機端與其通信,
動畫在Material Design設計中給用戶反饋放用戶點擊時,並且在程序用戶界面中提供連貫的視覺。Material主題為按鈕(Button)和activity的轉換提
ListView是Android軟件開發中十分常用也十分重要的一個UI控件。ListView的每一個子項可以是一個簡單的字符串,也可以是一組View的組合,開發者完全可以
本文實例講述了Android編程實現自定義系統菜單背景的方法。分享給大家供大家參考,具體如下:不多說,上圖,見代碼。package lab.sodino.menutest