《第一行代碼》讀書筆記一

一:java

1:項目文件android

開發中常常用到的有:數組

app目錄:存放項目代碼、資源文件緩存

build.gradle:項目全局gradle腳本。app

 

2:app目錄ide

libs:放到libs目錄下的第三方jar包會自動添加到項目構建路徑。工具

java:存放java代碼的地方。佈局

res:資源文件目錄,包括:圖片、佈局、字符串、顏色、樣式、菜單等。gradle

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"//編譯的Tools版本
    defaultConfig {//默認配置
        applicationId "com.nd.famlink"//應用程序的包名
        minSdkVersion 8//支持的最低版本
        targetSdkVersion 19//支持的目標版本
        versionCode 52//版本號
        versionName "3.0.1"//版本名
    }
    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"//密鑰文件密碼
            keyAlias "fk"//key別名
            keyPassword "123"//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中的限定符有:

相關文章
相關標籤/搜索