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