《第一行代码》读书笔记一
一:
1:項(xiàng)目文件
開發(fā)中經(jīng)常用到的有:
app目錄:存放項(xiàng)目代碼、資源文件
build.gradle:項(xiàng)目全局gradle腳本。
2:app目錄
libs:放到libs目錄下的第三方j(luò)ar包會(huì)自動(dòng)添加到項(xiàng)目構(gòu)建路徑。
java:存放java代碼的地方。
res:資源文件目錄,包括:圖片、布局、字符串、顏色、樣式、菜單等。
AndroidManifest.xml:項(xiàng)目配置文件。多用于注冊(cè)四大組、添加權(quán)限等。
proguard-rules.pro:項(xiàng)目代碼混淆規(guī)則。
3:build.gradle逐項(xiàng)解析
apply plugin: 'com.android.application'//說(shuō)明module的類型,com.android.application為程序,com.android.library為庫(kù)
android {
compileSdkVersion 22//編譯的SDK版本
buildToolsVersion "22.0.1"http://編譯的Tools版本
defaultConfig {//默認(rèn)配置
applicationId "com.nd.famlink"http://應(yīng)用程序的包名
minSdkVersion 8//支持的最低版本
targetSdkVersion 19//支持的目標(biāo)版本
versionCode 52//版本號(hào)
versionName "3.0.1"http://版本名
}
sourceSets {//目錄指向配置
main {
manifest.srcFile 'AndroidManifest.xml'//指定AndroidManifest文件
java.srcDirs = ['src']//指定source目錄
resources.srcDirs = ['src']//指定source目錄
aidl.srcDirs = ['src']//指定source目錄
renderscript.srcDirs = ['src']//指定source目錄
res.srcDirs = ['res']//指定資源目錄
assets.srcDirs = ['assets']//指定assets目錄
jniLibs.srcDirs = ['libs']//指定lib庫(kù)目錄
}
debug.setRoot('build-types/debug')//指定debug模式的路徑
release.setRoot('build-types/release')//指定release模式的路徑
}
signingConfigs {//簽名配置
release {//發(fā)布版簽名配置
storeFile file("fk.keystore")//密鑰文件路徑
storePassword "123"http://密鑰文件密碼
keyAlias "fk"http://key別名
keyPassword "123"http://key密碼
}
debug {//debug版簽名配置
storeFile file("fk.keystore")
storePassword "123"
keyAlias "fk"
keyPassword "123"
}
}
buildTypes {//build類型
release {//發(fā)布
minifyEnabled true//混淆開啟
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt'//指定混淆規(guī)則文件
signingConfig signingConfigs.release//設(shè)置簽名信息
}
debug {//調(diào)試
signingConfig signingConfigs.release
}
}
packagingOptions {
exclude 'META-INF/ASL2.0'
exclude 'META-INF/LICENSE'
exclude 'META-INF/NOTICE'
exclude 'META-INF/MANIFEST.MF'
}
lintOptions {
abortOnError false//lint時(shí)候終止錯(cuò)誤上報(bào),防止編譯的時(shí)候莫名的失敗
}
}
dependencies {
compile fileTree(dir: 'libs', exclude: ['android-support*.jar'], include: ['*.jar']) //編譯lib目錄下的.jar文件
compile project(':Easylink')//編譯附加的項(xiàng)目
compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.3'//編譯來(lái)自Jcenter的第三方開源庫(kù)
}
4:菜單
菜單有多種:optionMenu、上下文菜單、彈出菜單等。
菜單可以在代碼中動(dòng)態(tài)添加,也可以在xml中定義好菜單項(xiàng),在代碼中加載。
菜單可以分組管理菜單項(xiàng),也可以擁有子菜單。
5:Intent
Intent可以用于啟動(dòng)四大組件,可以攜帶數(shù)據(jù),不過(guò)只能通過(guò)鍵值對(duì)的形式攜帶基本類型數(shù)據(jù)。
Intent有兩種:顯式Intent和隱式Intent。
隱式Intent通過(guò)添加action、category、data等附加內(nèi)容,來(lái)匹配系統(tǒng)中符合要求(注冊(cè)時(shí)配置 intent-filter)的活動(dòng)、服務(wù)等。
6:返回?cái)?shù)據(jù)的跳轉(zhuǎn)
啟動(dòng)另一個(gè)活動(dòng)可以有兩種方法,其中startActivityForResult(intent,請(qǐng)求碼)啟動(dòng)的跳轉(zhuǎn),可以在活動(dòng)中重寫回調(diào)方法onActivityResult(請(qǐng)求碼,結(jié)果碼,intent)來(lái)獲取返回?cái)?shù)據(jù),通過(guò)請(qǐng)求碼匹配具體請(qǐng)求的返回、通過(guò)結(jié)果碼判斷結(jié)果的類型,通過(guò)intent提取返回的數(shù)據(jù)。
7:保存Activity中的數(shù)據(jù)
活動(dòng)跳轉(zhuǎn)后,之前的活動(dòng)可能會(huì)被回收,若想保存之前的活動(dòng)的數(shù)據(jù),使得返回這個(gè)活動(dòng)時(shí)數(shù)據(jù)仍在,可以在活動(dòng)中重寫 onSaveInstanceState(bundle)回調(diào)方法,這個(gè)方法會(huì)在活動(dòng)被回收之前調(diào)用,把數(shù)據(jù)存在budle中,那么下一次該活動(dòng)重建時(shí),可以在onCreate(bundle)中通過(guò)bundle取回?cái)?shù)據(jù)。
8:精確定位活動(dòng)
可以定義一個(gè)BaseActivity,繼承自AppCompatActivity,然后定義一些通用的方法、操作,如:打印當(dāng)前活動(dòng)信息。
另其他活動(dòng)繼承BaseActivity,即可在項(xiàng)目運(yùn)行時(shí)知道哪個(gè)頁(yè)面對(duì)應(yīng)哪個(gè)活動(dòng)了。
9:批量管理活動(dòng)
可以定義一個(gè)工具類,其中維護(hù)一個(gè)活動(dòng)list:
public class ActivityCollector {
public static List<Activity> activities = new ArrayList<>();
public static void addActivity(Activity activity){
activities.add(activity);
}
public static void removeActivity(Activity activity){
activities.remove(activity);
}
public static void finishAll(){
for(Activity activity:activities){
if(!activity.isFinishing()){
activity.finish();
}
}
activities.clear();
}
然后,定義一個(gè)父Activity,作為其他activity的基類:
public class BaseActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityCollector.addActivity(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
ActivityCollector.removeActivity(this);
}
}
其他Activity繼承BaseActivity,那么每當(dāng)活動(dòng)創(chuàng)建時(shí)就會(huì)被添加到list中,銷毀就移除。在任何需要批量銷毀活動(dòng),完全退出程序時(shí),只需通過(guò) ActivityCollector.finishAll() 銷毀所有活動(dòng)即可。
二:UI
1:android:gravity:控件中內(nèi)容的對(duì)齊方式。
2:android:layout_gravity:控件本身在父容器中的對(duì)齊方式。
3:進(jìn)度條
有兩種,其中:圓形的用于顯示耗時(shí)操作,通過(guò)visibility控制可見性來(lái)顯示或隱藏;水平進(jìn)度條則可以通過(guò)在代碼中動(dòng)態(tài)設(shè)置progress來(lái)更改進(jìn)度值,多用于下載等操作。
4:彈窗
AlertDialog的使用步驟為:創(chuàng)建builder——通過(guò)builder.setXX()設(shè)置彈窗標(biāo)題、內(nèi)容、按鈕點(diǎn)擊事件等——最后顯示彈窗
5:進(jìn)度彈窗
不同于一般的環(huán)形進(jìn)度條,ProgressDialog還額外顯示文字內(nèi)容,以告知用戶當(dāng)前正在執(zhí)行什么耗時(shí)操作。
創(chuàng)建progressdialog——設(shè)置標(biāo)題、內(nèi)容等——show()顯示——通過(guò)dismiss()關(guān)閉
6:布局
線性布局中的比例布局:設(shè)置哪個(gè)方向上按比例布局,則該方向上大小設(shè)置為0dp,然后通過(guò)layout_weight設(shè)置權(quán)重。
相對(duì)布局:控件與父容器的相對(duì)、控件與已有控件的相對(duì),布局的位置規(guī)律為:相對(duì)于參照物的上下左右中。
幀布局:幀布局中的控件末日左上角對(duì)齊,并且后定義的控件會(huì)覆蓋在最上面。幀布局可以用于自定義一些需要重合在一起的視圖元素,比如:自定義帶文字的圖片按鈕、帶有文字提示的視頻播放界面、浮動(dòng)在圖片或視頻播放控件之上的字幕等。
百分比布局:可以使用第三方擴(kuò)展庫(kù)。
7:自定義控件
方法一:使用布局定義好一個(gè)視圖效果,然后在其他布局文件中include。
方法二:繼承android內(nèi)置控件類定義新的控件類,在控件類的構(gòu)造方法中inflate定義好的layout文件,然后在其他布局文件中通過(guò)新控件類的完整路徑來(lái)使用該控件。
8:ListView的使用步驟
定義數(shù)據(jù)類——定義列表項(xiàng)視圖布局——繼承Adapter,定義adapter類,重寫getview方法:獲取當(dāng)前數(shù)據(jù)項(xiàng)、inflate列表項(xiàng)布局文件、為列表項(xiàng)控件賦值、返回view
在活動(dòng)代碼中,創(chuàng)建數(shù)據(jù)數(shù)組——創(chuàng)建adapter,把上下文、列表項(xiàng)布局文件id、數(shù)據(jù)數(shù)組作為參數(shù)——為activity視圖中的listview設(shè)置adapter
9:listview的優(yōu)化
初步優(yōu)化,使用convertView緩存之前加載的布局;
進(jìn)一步優(yōu)化,創(chuàng)建一個(gè)內(nèi)部類ViewHolder,里面的成員變量和view中所包含的組件個(gè)數(shù)、類型相同,在convertview為null的時(shí)候,把findviewbyId找到的控件賦給ViewHolder中對(duì)應(yīng)的變量,就相當(dāng)于先把它們裝進(jìn)一個(gè)容器,下次要用的時(shí)候,直接從容器中獲取。
10:RecyclerView的使用
定義適配器類,重寫其中的三個(gè)方法——在activity代碼中創(chuàng)建數(shù)據(jù)數(shù)組——創(chuàng)建layoutmanager,通過(guò)layoutmanager設(shè)置布局方式,并設(shè)置給recyclerview控件——創(chuàng)建adapter——為activity布局文件中的recyclerview控件設(shè)置adapter
【我們看到,RecyclerView不僅需要adapter,還需要layoutmanager。通過(guò)layoutManeger,我們可以設(shè)置RecyclerView的布局排列方式:垂直、水平、網(wǎng)格、瀑布流】
【列表項(xiàng)的點(diǎn)擊事件在adapater中定義,可以定義列表項(xiàng)整體點(diǎn)擊、列表項(xiàng)中不同空間元素點(diǎn)擊 的事件響應(yīng)】
【常用的RecyclerView開源庫(kù)整理:http://www.jianshu.com/p/154891851fe2 http://blog.csdn.net/mynameishuangshuai/article/details/51153978】
三:碎片
1:碎片的使用步驟
定義布局文件——創(chuàng)建碎片類,繼承自Fragment,重寫onCreateView方法,在其中inflate對(duì)應(yīng)的布局文件——在activity的布局文件中通過(guò)路徑使用碎片、在代碼中動(dòng)態(tài)使用碎片
2:在代碼中動(dòng)態(tài)使用碎片
創(chuàng)建碎片實(shí)例——獲取FragmentManager——beginTransaction()——add、replace、remove動(dòng)態(tài)使用碎片實(shí)例——commit()
3:模擬返回棧
把碎片的使用歷史加入返回棧中,點(diǎn)擊返回按鈕時(shí)返回上一個(gè)碎片而不是退出當(dāng)前activity。
創(chuàng)建碎片實(shí)例——獲取FragmentManager——創(chuàng)建transaction——add、replace、remove動(dòng)態(tài)使用碎片實(shí)例——transaction.addToBackStack(null)——commit()
4:碎片與活動(dòng)之間的通信調(diào)用
活動(dòng)中調(diào)用碎片:在activity代碼中通過(guò)findFragmentById(id)獲取活動(dòng)布局中的碎片實(shí)例,然后通過(guò)該實(shí)例調(diào)用碎片類中的方法、為碎片中的控件賦值等
碎片中調(diào)用活動(dòng):碎片代碼中國(guó)年通過(guò)getActivity()方法獲取與當(dāng)前碎片相關(guān)聯(lián)的活動(dòng)實(shí)例,然后通過(guò)該實(shí)例調(diào)用方法、操作控件
碎片之間的調(diào)用:在一個(gè)碎片中獲取關(guān)聯(lián)的活動(dòng)實(shí)例,然后通過(guò)活動(dòng)實(shí)例獲取另一個(gè)碎片實(shí)例,通過(guò)另一個(gè)碎片實(shí)例即可進(jìn)行調(diào)用。
5:碎片保存臨時(shí)數(shù)據(jù)
類似于activity實(shí)例,碎片也可以通過(guò)onSaveInstanceState()方法保存數(shù)據(jù),之后在碎片的onCreateView等方法中都可以通過(guò)參數(shù)bundle重新提取。
6:碎片的適配
在res目錄下新建 layout-限定符文件夾,在其中定義布局文件,那么程序在運(yùn)行時(shí),就會(huì)根據(jù)屏幕的尺寸,自動(dòng)加載符合格式的文件夾下的視圖文件。
android中的限定符有:
總結(jié)
以上是生活随笔為你收集整理的《第一行代码》读书笔记一的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: [JavaWeb-Servlet]Ser
- 下一篇: tcping端口检测工具使用