#### ç®å½
* [为ä»ä¹æ²¡æç¨ MVP](#为ä»ä¹æ²¡æç¨-mvp)
* [为ä»ä¹æ²¡æç¨ ButterKnife](#为ä»ä¹æ²¡æç¨-butterknife)
* [为ä»ä¹æ²¡æç¨ ViewBinding](#为ä»ä¹æ²¡æç¨-viewbinding)
* [为ä»ä¹æ²¡æç¨ DataBinding](#为ä»ä¹æ²¡æç¨-databinding)
* [为ä»ä¹æ²¡æç¨ç»ä»¶å](#为ä»ä¹æ²¡æç¨ç»ä»¶å)
* [为ä»ä¹æ²¡æéæçé¢ä¾§æ»åè½](#为ä»ä¹æ²¡æéæçé¢ä¾§æ»åè½)
* [为ä»ä¹æ²¡æç¨ä»æ¥å¤´æ¡çéé
æ¹æ¡](#为ä»ä¹æ²¡æç¨ä»æ¥å¤´æ¡çéé
æ¹æ¡)
* [åä½å¤§å°ä¸ºä»ä¹ä¸ç¨ dp èç¨ sp](#åä½å¤§å°ä¸ºä»ä¹ä¸ç¨-dp-èç¨-sp)
* [为ä»ä¹æ²¡æç¨ DialogFragment æ¥é²æ¢å
åæ³æ¼](#为ä»ä¹æ²¡æç¨-dialogfragment-æ¥é²æ¢å
åæ³æ¼)
* [为ä»ä¹æ²¡æç¨è
¾è®¯ X5 WebView](#为ä»ä¹æ²¡æç¨è
¾è®¯-x5-webview)
* [为ä»ä¹æ²¡æç¨å Activity å¤ Fragment](#为ä»ä¹æ²¡æç¨å-activity-å¤-fragment)
* [为ä»ä¹æ²¡æç¨ ConstraintLayout æ¥åå¸å±](#为ä»ä¹æ²¡æç¨-constraintlayout-æ¥åå¸å±)
* [为ä»ä¹ä¸ææå¤ä¸ªæ¡æ¶æ¥åè¿ä»¶äº](#为ä»ä¹ä¸ææå¤ä¸ªæ¡æ¶æ¥åè¿ä»¶äº)
* [为ä»ä¹æä½å
¼å®¹å° Android 5](#为ä»ä¹æä½å
¼å®¹å°-android-5)
* [为ä»ä¹ä¸å å
¥æ«æäºç»´ç åè½](#为ä»ä¹ä¸å å
¥æ«æäºç»´ç åè½)
* [为ä»ä¹ä¸å å
¥ EventBus](#为ä»ä¹ä¸å å
¥-eventbus)
* [为ä»ä¹æ²¡æç¨ Retrofit å RxJava](#为ä»ä¹æ²¡æç¨-retrofit-å-rxjava)
* [为ä»ä¹æ²¡æç¨ Jetpack å
¨å®¶æ¡¶](#为ä»ä¹æ²¡æç¨-jetpack-å
¨å®¶æ¡¶)
* [为ä»ä¹ä¸å¯¹å¾çå è½½æ¡æ¶è¿è¡å次å°è£
](#为ä»ä¹ä¸å¯¹å¾çå è½½æ¡æ¶è¿è¡å次å°è£
)
* [æ¨¡æ¿ æ¶æ ææ¯ä¸å°æä»ä¹åºå«](#模æ¿-æ¶æ-ææ¯ä¸å°æä»ä¹åºå«)
* [为ä»ä¹ä¸æä¸å¡æ¥ååå
å](#为ä»ä¹ä¸æä¸å¡æ¥ååå
å)
* [为ä»ä¹æ²¡æå
³äºåè¡¨å¤ type çå°è£
](#为ä»ä¹æ²¡æå
³äºå表å¤-type-çå°è£
)
* [è¿ä¸å°±æ¯ä¸ä¸ªæ¨¡æ¿å·¥ç¨æ¢ææä¹è½åä¸ä¸ª](#è¿ä¸å°±æ¯ä¸ä¸ªæ¨¡æ¿å·¥ç¨æ¢ææä¹è½åä¸ä¸ª)
* [å设 AndroidProject æ´æ°äºè¯¥æä¹å级å®](#å设-androidproject-æ´æ°äºè¯¥æä¹å级å®)
* [为ä»ä¹ä¸ç¨è°·æ ActivityResultContracts](#为ä»ä¹ä¸ç¨è°·æ-activityresultcontracts)
* [è½®åå¥ä½ æä¹çå¾
å±åºä¸ç©·çæ°ææ¯](#è½®åå¥ä½ æä¹çå¾
å±åºä¸ç©·çæ°ææ¯)
#### 为ä»ä¹æ²¡æç¨ MVP



* AndroidProject èå¼ MVP çæå¤§ä¸ä¸ªåå ï¼éè¦ååç§ç±»ï¼åç§åè°ï¼å¦æè¿ä¸ªé¡µé¢æ¯è¾ç®åçè¯ï¼ä½¿ç¨ MVP ä¼è®©åæ¬ç®åç代ç å夿ï¼å¯¼è´åç»å¼ååç»´æ¤ææ¬æ¯é常é«ï¼åæä»åºç代价ååæçç»´æ¤ä¸ææ£æ¯å
³ç³»ï¼å½ç¶è¿ç§è¯´æ³åªéç¨äºåç§ä¸å°å项ç®ï¼å¤§åçé¡¹ç®æè¿æ²¡æç»åè¿ï¼ä¸è¿æè§å¾ï¼æ è®ºæ¯ MVCãMVPãMVVMï¼å®ä»¬åºç°çç®çæ¯ä¸ºäºè§£å³ä»£ç å¤å¹¶ä¸ä¹±çé®é¢ï¼ä½ç¨å°±æ¯ç»ä»£ç ååç±»ï¼ä½æ¯å¯ä»¥è·å¤§å®¶å享æçå¿å¾ï¼æå¹¶ä¸ç好 MVPï¼å 为å®è®©æå¼ååç»´æ¤é½å¾çè¦ï¼æä»¥æå°±ç´æ¥å°å®ä» AndroidProject ç§»é¤ï¼ç®çä¹å¾ç®åï¼ä¸æ¨è大家使ç¨ï¼å 为 MVP ä¸éå大夿°é¡¹ç®çå¼ååç»´æ¤ãææ´æ¨èå¤§å®¶ç´æ¥å°ä»£ç åå¨ Activityï¼ä½æ¯æä¸ä¸ªåææ¡ä»¶éè¦å¤§å®¶éµå®ï¼å¤§å®¶è¦å好代ç å°è£
åéå¤ä»£ç çæ½åï¼å°½é让 Activity æä¸ºåªæä¸å¡ä»£ç çç±»ï¼è¿æ ·ä¸ä¸ªé¡¹ç®éé¢ç大夿° Activity 代ç éé½è½å¾å¥½æ§å¶å¨ 1000 è¡ä»£ç 以å
ã使¯è¿ç§çä¼¼ç®åçæä½ï¼ä½æ¯å®é
è¦åå°æ¯ä¸ä»¶ä¸å®¹æçäºæ
ï¼è¿éé¢ä¸ä»
è¦è§£å³ä»£ç 带æ¥çé®é¢ï¼è¿è¦è§£å³å¸¦æ¥çåç§äººæ§çç¾ï¼å°é¾ééï¼è¿ç§æ³æ³ç»è¿å¾é¿ä¸æ®µæ¶é´çæèï¼è½ç¶åæ³å¨å¼ååç»´æ¤ä¸æçæ¯é常é«çï¼ä½æ¯ä¸è¢«å¤§å¤æ°äººè®¤å¯ï¼å¤§å®¶æ´æ¿æç¸ä¿¡ MVCãMVPãMVVMï¼èå¾å°æäººçè§£è¿ä¸ç§æ¨¡å¼çæ¬è´¨æ¯ä»ä¹ï¼å°±æ¯ä¸ºäºç»ä»£ç ååç±»ï¼ä½è¿ä¸ç§æ¨¡å¼é½ä¸å¤çµæ´»ï¼å¾ç硬ï¼åæ¯ä¸å¥å¥è§åï¼èè¿æ ·ç代ç åç±»ï¼åªä¼è®©å¤§å¤æ°äººçå¼åè¶æ¥è¶å¤´ç¼ã
#### 为ä»ä¹æ²¡æç¨ ButterKnife
* éç AndroidProject ç䏿ä¼åï¼ButterKnife åè½å¾å¼ºå¤§ï¼ä½æ¯å®é
å¼åä¸ï¼å¤§å¤æ°äººåªç¨å°äº BindView å OnClick 注解ï¼å¨ OnClick æ³¨è§£å¨æç项ç®ä¸åç°ä¸ä¸ª Bugï¼å°±æ¯ææ¶åä¸ä¼ååºç¹å»äºä»¶ï¼è¿ä¸ªé®é¢å¹¶ä¸æ¯å¿
ç°çãè¿æ BindView æ³¨è§£åªæ¯å¨è§è§ä¸é¢å° View å ID çå
³ç³»æ´ææ¾äºï¼å®å
¶å®ä¸è½ä¸ºæä»¬ç®å代ç ï¼å ä¸ºä½¿ç¨ BindView å findViewById ç代ç 鿝䏿 ·çã
* ButterKnife æå¤§çç¼ºç¹æ¯è¿ä¼èªå¨çæ ViewBinding ç±»ï¼å°±ç®å¨ç±»ä¸åªä½¿ç¨äºä¸ä¸ª BindViewï¼å®ä¹ä¼çæè¿ä¸ªç±»ï¼å
¶å®è¿æ ·æ¯ä¸å¤ªå¥½çã
* å¦å¤ä¸ä¸ªç¹ï¼å° Android Studio åçº§å° 4.1 ä¹åï¼ä¼åºç°ä»¥ä¸æç¤ºï¼è¿ä¸ªæ¯å 为 Gradle å¨ 5.0 ä¹åççæ¬ï¼View ID å°ä¸ä¼ä»¥å¸¸éçå½¢å¼åå¨ï¼æä»¥ä¸è½å°å
¶å®ä¹å¨ `BindView` 注解æè
å¨ `switch case` åä¸ã
```text
Resource IDs will be non-final in Android Gradle Plugin version 5.0, avoid using them as annotation
Resource IDs will be non-final in Android Gradle Plugin version 5.0, avoid using them in switch case statements
```
* èèå°è¿äºæ
åµï¼æå¨æ°çç AndroidProject ä¸é¢ç§»é¤äº ButterKnife æ¡æ¶ï¼å
¶å® findViewById ä¸ç´æºå¥½ï¼åªæ¯æä»¬æ²¡æè®¤çæèè¿èå·²ã
* å¦å¤å¤§å®¶å¦æä¸æ³å findViewByIdï¼æå¯ä»¥æ¨è䏿¬¾èªå¨çæ findViewById çæä»¶ç»å¤§å®¶ï¼[FindViewByMe](https://plugins.jetbrains.com/plugin/8261-findviewbyme)
#### 为ä»ä¹æ²¡æç¨ ViewBinding
* é¦å
ViewBinding å ButterKnife æä¸ä¸ªç¸åçæ¯ç
ï¼å°±æ¯èªå¨çæä¸ä¸ªç±»ï¼ç¶åå¨è¿ä¸ªç±»éé¢è¿è¡ findViewByIdï¼ä½æ¯æä¸ä¸ªè´å½ç缺ç¹ï¼æ¯ä¸ª `Activity / Fragment / Dialog / Adapter` é½éè¦å
åå§å ViewBinding 对象ï¼å ä¸ºæ¯æ¬¡çæçç±»å齿¯ä¸åºå®çï¼æä»¥æ æ³å¨åºç±»ä¸å°è£
å¤çï¼å¹¶ä¸æ¯æ¬¡é½è¦å `binding.xxx` æè½æä½æ§ä»¶ã
```java
ActivityXxxxBinding.inflate binding = ActivityXxxxBinding.inflate(getLayoutInflater());
binding.tv_data_name.setText("å符串");
```
* å¦å¤ä¸ä¸ªå®ä¼æ ¹æ®æ§ä»¶ id ä½ä¸ºå±æ§çåç§°ï¼è¿æ ·ä¼å¯¼è´ä¸ä¸ªä»£ç ä¸è§èçé®é¢ï¼å¦æå¨ xml 䏿§ä»¶ç id å½å符åè§èäºï¼ä¼å¯¼è´å¨ Java 代ç ä¸çå½åä¸è§èï¼å¦æå¨ Java 代ç ä¸çå½åè§èäºï¼åä¼å¯¼è´ xml ç id ä¸ç¬¦åè§èäºãè代ç è§èå
³ç³»å°åç»ç代ç ç»´æ¤ï¼æ¯ä¸ä¸ªå¾éè¦çé®é¢ï¼ä¸å®¹å¿½è§ã
* è½ç¶ ViewBinding æ¯è°·æå®æ¹æ¨èçï¼ä½æ¯æè§å¾å¹¶ä¸å®ç¾ï¼è§£å³äº findViewById çåæ¶å带æ¥äºå
¶ä»çé®é¢ï¼å¨å
³é®é®é¢ä¸æé®é¢åçç¾ï¼ç´ç½ç¹è¯´è¿äºé®é¢é½æ¯ç¡¬ä¼¤ã
* æ£å¦æä¸é¢æè¯´çï¼findViewById ä¸ç´æºå¥½ï¼åªæ¯æä»¬æ²¡æè®¤çæèè¿èå·²ã
* å¦å¤å¤§å®¶å¦æä¸æ³å findViewByIdï¼æå¯ä»¥æ¨è䏿¬¾èªå¨çæ findViewById çæä»¶ç»å¤§å®¶ï¼[FindViewByMe](https://plugins.jetbrains.com/plugin/8261-findviewbyme)
#### 为ä»ä¹æ²¡æç¨ DataBinding
* DataBinding æå¤§çä¼å¿å¨äºï¼å 为å®å¯ä»¥å¨ xml ç´æ¥ç» View èµå¼ï¼ä½å®çä¼ç¹æ£æ¯å®æè´å½ç缺ç¹ï¼å½ä¸å¡é»è¾ç®åæ¶ï¼ä¼æ¾å¾æ ¼å¤ç¾å¥½ï¼ä½æ¯ä¸æ¦å¤ææ¡ä»¶å¤æèµ·æ¥ï¼ç±äº xml 屿§ä¸è½æ¢è¡çç¹æ§ï¼ä¼å¯¼è´æ æ³å¨ xml ç´æ¥èµå¼åæè
å¾é¿ç䏿®µä»£ç å å¨å¸å±ä¸ï¼é´æ¥å¯¼è´ CodeReview æ¶å¼å¸¸è°é¾ï¼æ´å«è¯´å¨åæçåºç¡ä¸ç»§ç»æ´æ°è¿ä»£ï¼è¿å¯¹æ¯ä¸ä¸ªå¼åè
æ¥è®²æ çæ¯ä¸ä¸ªå·¨å¤§çç¾é¾ã
* è¿æä¸ä¸ªæ¯ DataBinding çå¦ä¹ ææ¬æ¯è¾é«ï¼å
¶æ¬¡ææ¬ä¹æºé«ï¼ä½¿ç¨åéè¦åå¾å¤å°è£
ï¼å¦å¤æ¯æ¬¡ä½¿ç¨æ¶é½éè¦æ·»å `layout` å `data` èç¹ï¼ç¶åå¨ Java 代ç ä¸åå§å DataBinding å¯¹è±¡ï¼æ æ³å¨åºç±»ä¸å°è£
å¤çï¼æ¯æ¬¡é½è¦å `binding.xxx` æè½æä½æ§ä»¶ï¼å ViewBinding çé®é¢å·®ä¸å¤ã
```java
ActivityXxxxBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_xxxx);
```
#### 为ä»ä¹æ²¡æç¨ç»ä»¶å
* å
æ¥è¯´è¯´ç»ä»¶åçä¼ç¹ï¼è½å¤æä¸åçä¸å¡ä»£ç è¿è¡é离ï¼è¾¾å°å®å
¨è§£è¦çææï¼åæ¶ä¹è½æåç¼è¯åæå
é度ã使¯è¿ä¸¤ä¸ªä¼ç¹åªæé¡¹ç®ä¸å¡åå¾å¤§å¹¶ä¸å¤æçæ
åµä¸æè½äº§çä»·å¼ï¼å¦åä»·å¼å¹¶ä¸å¤§ï¼å¨æçæ¥ï¼ä»£ç è§£è¦å
¶å®æ¯æåååï¼è§£è¦çè¿ç¨ç¸å¯¹æ¯è¾éº»ç¦ï¼è¿ä¼ç´æ¥å 大åæå¼åçå·¥ä½éï¼å¹¶ä¸ä¸äºè§£è¦çæ¹å¼å¯è½ä¼å¯¼è´ä»£ç éå¤ï¼ä¾å¦ AndroidManifest æ¸
åæä»¶ï¼éè¦åæ¶é
置两份æä»¶ï¼åææ¹å¨ä¹éè¦æ¹ä¸¤éï¼å¦å¤ä¸ä¸ªæ¯è·¯ç±è·³è½¬ï¼ç°å¨å¤§å¤æ°è·¯ç±æ¡æ¶é½æ¯éè¿ APT çæä¸å¼ æ å°è¡¨ï¼è¿ä¸ªéè¦æä»¬æ¯åä¸ä¸ª Activity é½è¦åä¸ä¸ªè·¯å¾ç注解ï¼è¿ä¸ªä¸ä»
åèµ·æ¥éº»ç¦ï¼ç®¡çèµ·æ¥ä¹ä¼å¾éº»ç¦ï¼å¦å¤å¯¹æ¯ä¸ªä¸å¡æ¨¡åç SDK åå§åæä½åæ°æ®åå¨äº¤äºä¸å该å¦ä½å¤çåè§£è¦ï¼è¿äºé½æ¯ç»ä»¶åæåå¨çé®é¢ï¼çåç¾å该å¦ä½ææ©ï¼
* ç»ä»¶åå
¶å®æ¯ä¸ä¸ªå¾å¥½çææ³ï¼ä½æ¯å®å¹¶ä¸éç¨äºä¸å°å项ç®ï¼å 为è¿äºé¡¹ç®å¹¶æ²¡æé£ä¹å¤æï¼å¤§é¨åä¸å¡æ¨¡åé½å¾å°ï¼å¤§çä¸å¡æ¨¡åå
¶å®ä¹ä¸å¤ï¼å½ç¶æä¸ªäººå»ºè®®å¯ä»¥å°å¤§ç¹ç模ä¸å¡è¿è¡æ¨¡ååï¼ä½æ¯æ²¡æå¿
è¦åç»ä»¶åï¼å ä¸ºä¸æ¦æ¶åï¼ä»ç»ä»¶åä¸å¾å°å¼ä¼å¤§äºå©ãèå¨ä¸äºå¤§åç项ç®ä¸ï¼å¤§å¤§å°å°ç模åé常å¤ï¼ä¸æ¬¡æå
ç¼è¯å¯è½è¦åä¸ªå°æ¶çè³æ´ä¹
ï¼è¯·æ³¨æå¤§åççµèåºæ¬é½æ¯é«é
æè
é¡¶é
ï¼ï¼ç¸æ¯è¾è¿ç§æ
åµä¹ä¸ï¼ç»ä»¶åçä¼ç¹å°±å·²ç»å¤§äºäºå®ç缺ç¹ï¼åæ¶ä»ä»¬ä¹æå
è¶³ç人ååè¿ç¡¬çææ¯ï¼å¹¶ä¸è½é¿ææå
¥å·¨å¤§çæ¶é´åç²¾åæ¥åè¿ä»¶äºã
* AndroidProject é¢å¯¹çæ¯å¤§ä¼å¼åè
ï¼æä»¥æ´å¾åä¸å°åç项ç®ä»£ç ç设计ï¼è½ç¶ææ²¡æåè¿å¤§åç项ç®ï¼ä½æ¯å¨æçæ¥æ¯å·®ä¸å¤çï¼æå¤§çä¸åå¯è½æ¯ä»£ç åç±»æ¹å¼çä¸åï¼è¯¥åçäºæ
ä¸ä¼å°ï¼è¯¥åç代ç ä¹ä¸ä¼å°ï¼å°±æ¯ä¸å¡å代ç çä½é䏿¯æä»¬å¤§ï¼æä»¥ä»ä»¬è¦å¤çä½é大æå¸¦æ¥ççé®é¢ã
#### 为ä»ä¹æ²¡æéæçé¢ä¾§æ»åè½
* AndroidProject å
¶å®æå å
¥è¿è¿ä¸ªåè½ï¼ä½æ¯å¨ [v9.0 çæ¬](https://github.com/getActivity/AndroidProject/releases/tag/9.0) 就移é¤äºï¼åå æ¯ç¬¬ä¸æ¹ä¾§æ»æ¡æ¶ [BGASwipeBackLayout](https://github.com/bingoogolapple/BGASwipeBackLayout-Android) å¨ Android 9.0 ä¸é¢ä¼[éªå±](https://github.com/bingoogolapple/BGASwipeBackLayout-Android/issues/173)ï¼å¹¶ä¸è¿æ¯ **100% å¿
ç°**ï¼**ç¨æ·ä½éªæå·®**ï¼æä¹è·ä½è
åé¦è¿è¿ä¸ªé®é¢ï¼ä½ç»æä¸äºäºä¹ï¼æä»¥ä¸å¾ä¸ç§»é¤ã使¯å°äº [v10.0 çæ¬](https://github.com/getActivity/AndroidProject/releases/tag/10.0)ï¼æåå ä¸çé¢ä¾§æ»åè½äºï¼ä¸è¿è¿æ¬¡ææ¢æäº [SmartSwipe](https://github.com/luckybilly/SmartSwipe) æ¥åï¼ä½æ¯æåå䏿¬¡å¤±æäºï¼è¿ä¸ªæ¡æ¶å¨ Android 11 ä¸é¢ï¼å¦æ Activity 䏿 WindowManager æ£å¨æ¾ç¤ºï¼ç¶å使ç¨çé¢ä¾§æ»ï¼é£ä¹ä¼åºç°éªå±çæ
åµï¼å
·ä½ææå¦ä¸å¾ï¼

* å°±è¿ä¸ªæ
嵿ä¹èç³»è¿ä½è
ï¼å¹¶è¯¦ç»éè¿°äºäº§ççåå åå
·ä½çå¤ç°æ¥éª¤ï¼ä½æ¯æçäºä¸å¤©è¿ä¸ªåå¤é½æ²¡æï¼å®å±æäºè®©æå¿å¯ï¼å¨çå¾
çæé´æçå° Github ç issue å·²ç»åºæ¬æ²¡æåå¤äºï¼å¹¶ä¸æå䏿¬¡æäº¤æ¯å¨ 13 个æåäºï¼ç§ç§è¿¹è±¡é½å·²ç»è¡¨æï¼æä»¥ç»è¿æ
éèèï¼æç»å³å®å¨ [v12.1 çæ¬](https://github.com/getActivity/AndroidProject/releases/tag/12.1) ç§»é¤çé¢ä¾§æ»åè½ã
#### 为ä»ä¹æ²¡æç¨ä»æ¥å¤´æ¡çéé
æ¹æ¡
* å
³äºå±å¹éé
æ¹æ¡ï¼å
¶å®ä¸è½è¯´å¤´æ¡çæ¹æ¡å°±æ¯æå¥½çï¼å
¶å®è°·æå·²ç»é对å±å¹éé
åäºå¤çï¼å°±æ¯ dp å sp ï¼è dp ç计ç®è½¬æ¢æ¯ç±å±å¹çåç´ å³å®ï¼ç³»ç»åªè®¤ px åä½ï¼ dp éè¦è¿è¡è½¬æ¢ï¼æ¯å¦ 1dp çäºå 个 px ï¼è¿ä¸ªæ¶åå°±éè¦åºæ°è¿è¡è½¬æ¢ï¼æ¯å¦ 1dp = 2pxï¼è¿ä¸ªåºæ°å°±æ¯ 2ã
```text
ldpiï¼1dp=0.75px
mdpiï¼1dp=1px
hdpiï¼1dp=1.5px
xhdpiï¼1dp=2px
xxhdpiï¼1dp=3px
xxxhdpiï¼1dp=4px
```
* è¿ä¸ªæ¯è°·æå¯¹å±å¹éé
çä¸ç§é»è®¤æ¹å¼ï¼ååä¹å¯ä»¥æ ¹æ®éè¦å»ä¿®æ¹é»è®¤çåºæ°ï¼ä»èè¾¾å°æä¼çæ¾ç¤ºææã
* è°·æçå±å¹éé
æ¹æ¡ä¹ä¸æ¯ç¾åä¹ä¸ç¾å®ç¾çï¼å
¶å®ä¼åå¨ä¸äºéæ±ä¸è½æ»¡è¶³çé®é¢ãè°·æç设计ç念æ¯å±å¹è¶å¤§æ¾ç¤ºçä¸è¥¿è¶å¤ï¼è¿ç§æ³æ³å¹¶æ²¡æéï¼ä½æäº App å¯è½å¯¹è¿åä¼æè¦æ±ï¼å¸ææ ¹æ®å±å¹å¤§å°å¯¹æ§ä»¶è¿è¡ç¾åæ¯å缩ãè¿ä¸ªæ¶åè°·æé£å¥éé
æ¹æ¡ç设计已ç»åéæ±å®å
¨ä¸ä¸è´äºã
* é£ä»ä¹æ ·ç App æä¼æé£æ ·çéæ±å¢ï¼ç°å¨ææºçå±å¹å¤§å¤å¨ 5 - 6寸ï¼èå¹³æ¿å¤§å¤å¨ 8 - 10 寸ï¼ä¹å°±æ¯è¯´æä»¬åªéé
ææºçè¯ï¼åªéè¦é对 5 - 6 寸çï¼å¹¶ä¸å®ä»¬çå辨çé½å·®ä¸å¤ï¼å
¶å®ç¨è°·æé£ç§æ¹æ¡æ¯æä¼çï¼å¦ææä»¬éè¦éé
å¹³æ¿çè¯ï¼ä¸è¬é½ä¼è¦æ±å¯¹æ§ä»¶è¿è¡ç¾åæ¯å缩ï¼è¿ä¸ªæ¶åè°·æé£å¥æ¹æ¡ä¼æåå
å¨ææºæ¾ç¤ºçæ§ä»¶å¨å¹³æ¿ä¸é¢å大ä¸ç¹ï¼è¿æ ·å°±ä¼å¯¼è´å±å¹å©ä½ç空é´è¿å¤§ï¼å¯¼è´æ§ä»¶æ¾ç¤ºåºæ¥çæææ¯è¾å°ï¼è妿éç¨ç¾åæ¯å¯¹æ§ä»¶åç¼©çæ¹å¼ï¼è½æ¯è¾å¥½å°æ§å¶ App å¨ä¸åå±å¹ä¸æ¾ç¤ºçææã
* å¦å¤è°è°æçç»åï¼æèªå·±ä¹åçå
¬å¸ä¸»è¦æ¯åå¹³æ¿ä¸é¢çåºç¨ï¼æä»¥ä¹ç¨è¿ [AutoSize æ¡æ¶](https://github.com/JessYanCoding/AndroidAutoSize)ï¼ä¸å¹´å¤ç使ç¨ä½éªä¸æ¥ï¼åç°è¿ä¸ªæ¡æ¶ Bug è¿ç®æ¯æ¯è¾å¤çï¼ä¾å¦æ¡æ¶ä¼å¶å°åºç°æºåéé
失æï¼éåäº **getResources** æ¹æ³æ
åµä¹ååºç°çæ
åµå°äºä¸äºï¼ä½æ¯ä»ç¶è¿æä¸äºå¥å¥æªæªçé®é¢ï¼è¿éå°±ä¸ä¸ä¸ä¸¾ä¾äºï¼æåæ»ç»ä¸æ¥å°±æ¯æ¡æ¶è¿ä¸å¤æçï¼ä½æ¯æ¡æ¶çææ³è¿æ¯å¾ä¸éçãæå颿¢äºä¸å®¶å
¬å¸ï¼ä¹æ¯åå¹³æ¿åºç¨ï¼é¡¹ç®ç¨çæ¯ç¨[éé
符çéé
æ¹æ¡](https://github.com/wildma/ScreenAdaptation)ï¼è· AutoSize ç¸å¯¹æ¯ï¼æ²¡æäºé£äºå¥å¥æªæªçé®é¢ï¼ä½æ¯ä»£ç çä¾µå
¥æ§æ¯è¾é«ãè¿ä¸¤ç§æ¹æ¡åæä¼ç¼ºç¹ï¼å¤§å®¶ççéæ©ã

* å¨è¿åæä¹åèµ·è¿ç¾¤æç¥¨ï¼ç¸æ¯è°·æçéé
æ¹æ¡ï¼å¤§å¤æ°äººæ´è®¤åé£ç§ç¾åæ¯éé
æ¹æ¡ï¼ç§æ¿çå°æ°æä»å¤æ°ççå¿µï¼æå¨ AndroidProject [v13.0 çæ¬](https://github.com/getActivity/AndroidProject/releases/tag/13.0) å å
¥äºéé
符çéé
æ¹æ¡ãè½ç¶æä¸é¨å人ä¸è®¤åï¼ä½æ¯ææ³è·è¿äºäººè¯´çæ¯ï¼æçæ¯ä¸ä¸ªå³å®é½æ¯ååè°¨æ
çï¼å 为è¿å
¶ä¸æ¶åå°è®¸å¤äººçå©çï¼AndroidProject è½ç¶æ¯æåé çï¼ä½æ¯å®æ©å°±ä¸æ¯æä¸ä¸ªäººçäºï¼èæ¯å¤§å®¶çï¼æ¯ä¸ªéè¦çå³å®æé½ä¼èèå䏿ä¼å»åï¼å¨åå³å®çæ¶åæä¼æå¤§ä¼çå©çæ¾å¨ç¬¬ä¸ä½ï¼æèªå·±çå©çæ¾å¨æåä¸ä½ï¼æä»¥å¤§å®¶å¯ä¸è½åçæ¯ï¼ç¸ä¿¡æçéæ©ãæè®¸ä½ å¯è½è§å¾è¿æ ·ä¸å¤ªå¯¹ï¼ä¹éæ¶æ¬¢è¿ä½ æåºä¸åçæè§ç»å°æï¼æä¸è®¤ä¸ºèªå·±åçå³å®ä¸å®é½æ¯å¯¹çï¼ä½æ¯æä¼ä¸ç´æçå¯¹çæ¹ååè¿ã
#### åä½å¤§å°ä¸ºä»ä¹ä¸ç¨ dp èç¨ sp
* é¦å
æä»¬å
å顾ä¸ä¸è°·æåççåæ³ï¼å°æ§ä»¶å¤§å°çåä½å®æäº dpï¼èåä½å¤§å°çåä½å®æäº spï¼èæ è®ºæ¯ dp è¿æ¯ sp ä½ä¸ºåä½ï¼æç»è¿æ¯ä¼è½¬æ px çåä½ã
* è°·æè¿æ ·å乿ä¸å®ç®çï¼dp æ¯æ ¹æ®å±å¹çå¯åº¦æ¥è®¡ç®çï¼è sp æ¯æ ¹æ®ææºè®¾ç½®çåä½å¤§å°æ¥è®¡ç®çï¼å¦æç¨ dp æ¥ä»£æ¿ sp 伿ä¸ä¸ªé®é¢ï¼é£ä¹å°±æ¯æ è®ºç¨æ·å¨ææºé颿ä¹è®¾ç½®åä½å¤§å°ï¼åºç¨çåä½å¤§å°ä¸ä¼äº§çä»»ä½ååãè¿ç§åºæ¯å¯¹å¹´è½»äººæ¥è®²æ²¡æå¤ªå¤§çå½±åï¼è对ä¸äºèé¾ç¨æ·ï¼ä¾å¦æä»¬çç¸å¦ï¼ä»ä»¬ä¸è¬ä¼æææºçåä½è°å¤§ï¼è¿æ ·æè½çæ¸
æ¥éé¢çåï¼å¦ææä»¬éç¨ dp æ¥ä»£æ¿ sp çæ¹æ¡ï¼ä¼å¯¹è¿ç±»ç¨æ·é æä¸ä¾¿ï¼æ¢ä½æèï¼æä»¬ç»æä¸å¤©ä¹ä¼åèï¼åå¾èç¼æè±ï¼æä»¬ä¼å¦ä½çå¾
è¿ä¸ªäºæ
ï¼
* æ¾ç¶è¿ç§æ¹å¼æ¯ä¸åççï¼ä¹é常å°ä¸äººæ§åãç½ä¸è¿ç§æ¹æ¡å¯è½ä¸»è¦å°±æ¯ä¸ºäºè§£å³ææ§ä»¶å®½é«åæ»ä¹åï¼å¨æäºåä½ä¸æ¾ç¤ºæ¯è¾å¤§çæºåä¼åºç°åæ¾ç¤ºä¸å
¨çé®é¢ï¼èè¿ç§ææ§ä»¶å®½é«åæ»çæ¹å¼æ¬èº«ä¹æ¯ä¸åççï¼åºè¯¥å¨ä¸å¾å·²çæ
åµä¸æææ§ä»¶ç宽é«åæ»ï¼ä¸è¬æ
åµä¸æä»¬åºå½ä½¿ç¨èªéåºçæ¹å¼ï¼è®©æ§ä»¶èªå·±æµéèªå·±ç宽é«ï¼ç¹å«æ¯å¨ææ¾ç¤ºåä½çæ§ä»¶ä¸ï¼å°±æ´ä¸åºè¯¥æå®½é«åæ»ã
#### 为ä»ä¹æ²¡æç¨ DialogFragment æ¥é²æ¢å
åæ³æ¼
* DialogFragment çåºç°å°±æ¯ä¸ºäºè§£å³ Dialog å Activity çå½å¨æä¸åæ¥å¯¼è´çå
åæ³æ¼é®é¢ï¼å¨ AndroidProject æ¾ç»å¼å
¥è¿ï¼ä¹ç»è¿äºå¾å¤ä¸ªçæ¬çæ´æ°è¿ä»£ï¼ä¸è¿å¨ [10.0](https://github.com/getActivity/AndroidProject/releases/tag/10.0) çæ¬å就被移é¤äºï¼åå æ¯ Dialog è½ç¶æåï¼ä½æ¯ DialogFragment 乿åï¼å¯ä»¥è¯´è§£å³äºä¸ä¸ªé®é¢åå¼åäºåç§é®é¢ãå
æ¥ç»æ°æå¨ DialogFragment ä¸è¸©è¿çåç§åï¼
1. DialogFragment ä¼å ç¨ Dialog ç Cancel å Dismiss çå¬ï¼ä¸ºäºå°±æ¯å¨ Dialog æ¶å¤±ä¹åå°èªå·±ï¼Fragmentï¼ä» Activity ä¸ç§»é¤ï¼è¿æ ·çæä½çèµ·å¾åçï¼ä½æ¯ä¼å¼åä¸ä¸ªé®é¢ï¼é£ä¹å°±æ¯ä¼å¯¼è´æä»¬åå
ç» Dialog 设置ç Cancel å Dismiss çå¬è¢«è¦çæï¼é´æ¥å¯¼è´æä»¬æ æ³ä½¿ç¨è¿ä¸ªçå¬ï¼å 为 Dialog ççå¬å¨åªè½æä¸ä¸ªè§å¯è
ï¼è AndroidProject åæè§£å³è¿ä¸ªé®é¢çæ¹å¼æ¯ï¼å° Dialog ççå¬å¨ä½¿ç¨çè§å¯è
模å¼ï¼ä»ä¸å¯¹ä¸æ¹é æä¸å¯¹å¤ï¼ä¹å°±æ¯ä¸ä¸ªè¢«è§å¯è
å¯ä»¥æå¾å¤ä¸ªè§å¯è
ï¼ç±æ¤æ¥è§£å³è¿ä¸ªé®é¢ã
2. DialogFragment çæ¾ç¤ºåéèæä½é½ä¸è½å¨åå°ä¸è¿è¡ï¼å¦åä¼åºç°ä¸ä¸ªæ¥é `java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState`ï¼è¿ä¸ªæ¯å 为 DialogFragment ç show å dismiss æ¹æ³ä½¿ç¨äº FragmentTransaction.commit æ¹æ³ï¼è¿ä¸ª commit æ¹æ³ä¼è§¦å对 Activity ç¶æçæ£æ¥ï¼å¦æ Activity çç¶æå·²ç»ä¿åäºï¼å³å·²ç»è°ç¨äº onSaveInstanceState æ¹æ³ï¼ï¼è¿ä¸ªæ¶åæ Fragment commit å° Activity ä¸ä¼æåºå¼å¸¸ï¼è¿ç§åºæ¯å¨æ§è¡å¼æ¥æä½ï¼ä¾å¦è¯·æ±ç½ç»ï¼æªç»æåï¼ç¨æ·æå¨å° App è¿åå°æ¡é¢ï¼ç¶å弿¥æä½æ§è¡å®æ¯ï¼ä¸ä¸æ¥å°±æ¯åè°å¼æ¥çå¬å¨ï¼è¿ä¸ªæ¶åæä»¬ç App å·²ç»å¤äºåå°ç¶æï¼é£ä¹æä»¬å¦æå¨çå¬åè°ä¸ show æ dismiss DialogFragmentï¼é£ä¹å°±ä¼è§¦åè¿ä¸ªå¼å¸¸ãAndroidProject åæå¯¹äºè¿ä¸ªé®é¢çè§£å³æ¹æ¡æ¯éå DialogFragment.show æ¹æ³ï¼å ä¸ä¸ªå¯¹ Activity çç¶æå¤æï¼å¦æ Activity å¤äºåå°ç¶æï¼é£ä¹ä¸å»è°ç¨ super.show()ï¼ä½æ¯è¿æ ·ä¼å¯¼è´ä¸ä¸ªé®é¢ï¼è½ç¶è§£å³äºå´©æºçé®é¢ï¼ä½æ¯åä¼å¯¼è´ Dialog 没æ¾ç¤ºåºæ¥ï¼èéå DialogFragment.dismiss æ¹æ³ï¼ç´æ¥è°ç¨ dismissAllowingStateLoss æ¹æ³ï¼å 为è¿ä¸ªæ¹æ³ä¸ä¼å»æ£æ¥ Activity çç¶æãè½ç¶è¿ç§è§£å³æ¹å¼ä¸å¤å®ç¾ï¼ä½å´æ¯æé£ä¸ªæ¶åè½æ³å°çæå¥½æ¹æ³ã
3. æåä¸ä¸ªé®é¢æ¯å
³äº DialogFragment å±å¹æè½¬çé®é¢ï¼é¦å
DialogFragment æ¯éè¿èªèº« onCreateDialog æ¹æ³æ¥è·å Dialog 对象çï¼ä½æ¯å¦ææä»¬ç´æ¥éè¿å¤å±ç» DialogFragment ä¼ å
¥ Dialog ç对象æ¶ï¼è¿æ ·ç代ç é»è¾è²ä¼¼æ²¡æé®é¢ï¼ä½æ¯å¨ç¨æ·è¿è¡å±å¹æè½¬ï¼èå好æä»¬çåºç¨æ²¡æåºå®å±å¹æ¹åæ¶ï¼DialogFragment 对象ä¼è·é Activity 鿝é建ï¼å ä¸ºå®æ¬èº«å°±æ¯ä¸ä¸ª Fragmentï¼ä½æ¯ä¼å¯¼è´ä¹åçå¤å±ä¼ å
¥ Dialog å¯¹è±¡è¢«åæ¶å¹¶ç½®ç©ºï¼ç¶ååè°ç¨å° onCreateDialog æ¹æ³æ¶ï¼è¿åçæ¯ä¸ä¸ªç©ºå¯¹è±¡ç Dialogï¼é£ä¹å°±ä¼ç´æ¥ DialogFragment å
é¨å¼å空æéå¼å¸¸ï¼è AndroidProject åæè§£å³è¿ä¸ªé®é¢çæ¹æ¡æ¯ï¼éå onActivityCreatedï¼èµ¶å¨ onCreateDialog æ¹æ³è°ç¨ä¹åï¼å
夿 DialogFragment 对象å
鍿æç Dialog æ¯å¦ä¸ºç©ºï¼å¦ææ¯ä¸ä¸ªç©ºå¯¹è±¡ï¼é£ä¹å°±å°èªå·± dismissAllowingStateLoss æã
* çè¿è¿äºé®é¢ï¼ä½ æ¯ä¸æ¯åæä¸æ ·ï¼æè§è¿ DialogFragment 䏿¯ä¸è¬çåï¼ä¸è¿æç»ææ¾å¼äºä½¿ç¨ DialogFragmentï¼å¹¶ä¸æ¯å 为 DialogFragment ååºç°äºæ°é®é¢ï¼èæ¯ææ³å°äºæ´å¥½çæ¹æ¡æ¥ä»£æ¿ DialogFragmentï¼æ¹æ¡å°±æ¯ Application.registerActivityLifecycleCallbacksï¼æ³å¿
大家ç°å¨å·²ç»çå°ææ³å¹²å¥ï¼å DialogFragment çä½ç¨ä¸æ ·ï¼éè¿çå¬ Activity çæ¹å¼æ¥ç®¡æ§ Dialog ççå½å¨æï¼ä½å¯ä¸ä¸åçæ¯ï¼å®ä¸ä¼åºç°ååè¯´è¿ DialogFragment çé£äºé®é¢ï¼è¿ç§æ¹å¼å¨ AndroidProject ä¸è¿ä»£äºå ä¸ªçæ¬è¿åï¼è¿æé´æ²¡æåç°æ°çé®é¢ï¼ä¹æ²¡ææ¶å°å«äººåé¦è¿è¿åçé®é¢ï¼è¯æè¿ç§æ¹å¼æ¯å¯è¡çã
#### 为ä»ä¹æ²¡æç¨è
¾è®¯ X5 WebView
* é¦å
æé®å¤§å®¶ä¸ä¸ªé®é¢ï¼è
¾è®¯åºåç X5 WebView å°±ä¸å®æ¯åç WebView 好åï¼æè§å¾æªå¿
ï¼æä¾ç¨è®°å¾ Android 9.0 è¿æ¯ Android 10 ååºæ¥çæ¶åï¼æç¹äºå级æé®ï¼ç¶åå°±åç°å¾®ä¿¡å QQ çç½é¡µæµè§å¡å¾è®©ææç人çï¼ä¸è¿åé¢çªç¶æä¸å¤©å°±å好äºï¼ä»è¿ä»¶äºå¯ä»¥å¾åºä¸¤ç¹ç»è®ºï¼
1. 第ä¸ä¸ª SDK æèªææ´æ°åè½ï¼æå³ç WebView ææ§ææ¡å¨è
¾è®¯å
¬å¸æä¸
2. 第äºä¸ªæ¯ SDK éè¦è
¾è®¯æ¥æç»ç»´æ¤ï¼æå³çè¿ä¸ªé¡¹ç®ççå½å¨æä¼è·éè
¾è®¯å
¬å¸çåå±åå³ç
* åºäºä»¥ä¸ä¸¤ç¹ï¼æç个人建议æ¯ä¼å
使ç¨åç WebViewï¼å¦æä¸æ»¡è¶³éæ±äºï¼å¯ä»¥èªè¡æ¿æ¢æ X5 WebViewï¼å½ç¶ä¸æ¯è¯´ X5 WebView ä¸å®ä¸å¥½ï¼ç¨åç WebView ä¸å®å°±å¥½ï¼èæ¯ AndroidProject çç®æ æ¯ç¨³ä¸æ±èï¼å¦å¤ä¸ä¸ªæ¯ AndroidProject 䏿é对 WebView åç»ä¸å°è£
ï¼åç»æ¿æ¢æ X5 WebView çææ¬è¿ç®æ¯ç¸å¯¹è¾ä½çã
#### 为ä»ä¹æ²¡æç¨å Activity å¤ Fragment
* è¿ä¸ªé®é¢å¨åå å¹´æ¯ä¸ä¸ªæ¯è¾ç«ççè¯é¢ï¼æè¡¨ç¤ºå¾è½çè§£ï¼å 为æ°é²çäºç©æ»æ¯è½å¾èµ·äººç好å¥ï¼è®©äººå¿ä¸ä½è¯ä¸è¯ï¼ä½æ¯æå
é®å¤§å®¶ä¸ä¸ªé®é¢ï¼å Activity å¤ Fragment ååå¤ä¸ª Activity æä»ä¹ä¼ç¹ï¼å¤§å®¶ç¬¬ä¸ä¸ªååºåºè¯¥æ¯æ¯åä¸ä¸ªé¡µé¢é½ä¸éè¦å¨æ¸
åæä»¶ä¸æ³¨åäºï¼ä½æ¯è¿ä¸ªççæ¯ä¼ç¹åï¼æå¯ä»¥å¾æç¡®å°åè¯å¤§å®¶ï¼æå·²ç»åäºé£ä¹å¤å¥ä»£ç ï¼ä¸å·®é£å¥å¨æ¸
åæä»¶æ³¨åç代ç ãé£ä¹ç©¶ç«ä»ä¹ææ¯å¯¹æä»¬æä»·å¼çï¼æè§å¾å°±ä¸¤ç¹ï¼ä¸æ¯åå°åæå¼åçå·¥ä½éï¼äºæ¯éä½åç»ç»´æ¤çé¾åº¦ãæä»¥çé£ä¸ä¸¤å¥æåéåï¼æä»¬æ¯å·®é£ä¸ä¸¤å¥ä»£ç ç人åï¼å¦æè¿ç§æ¨¡å¼è½å¤å¸®å©æä»¬å好代ç ï¼è¿ä¸ªå½ç¶æ¯æä»·å¼çï¼é常å¼å¾ä¸è¯çï¼å¦åå°±æ¯çº¯å±çæ¯æ·¡ãä¸ä»
妿¤ï¼æä¸ªäººè§å¾è¿ç§æ¨¡å¼æå¾å¤§çå¼ç«¯ï¼ä¼å¼åå¾å¤é®é¢ï¼ä¾å¦ï¼
1. æç页颿¯å
¨å±æç页颿¯éå
¨å±ï¼æç页颿¯åºå®ç«å±æç页颿¯æ¨ªå±ï¼è¿å
¥æ¶æä¹åæ¢ï¼è¿åæ¶æä¹åæ¢åæ¥ï¼ç¶åå该æä¹å»åç»ä¸çå°è£
ï¼
2. ä¸å Fragment ä¹é´åºè¯¥ææ ·é讯ï¼Activity æ onActivityResult æ¹æ³å¯ä»¥ç¨ï¼ä½æ¯ Fragment æä»ä¹æ¹æ³å¯ä»¥ç¨ï¼è¿æ¯å
¨ç¨ EventBus æ¥å¤çï¼å¦ææ¯è¿æ ·åä¼ä¸ä¼å¤ªä½æäºï¼æ¯æ¬¡é½è¦åä¸ä¸ª Event ç±»ï¼å¹¶ä¸å¨ä»£ç 䏿¾èµ·æ¥æ¯ä¸æ¯ä¹ä¸å¤ªå¥½æ¾ï¼
3. å¦ä½ä¿è¯è¿ä¸ª Activity 被系ç»åæ¶ä¹åï¼ç¶åå¼åé建æä½ï¼å该å¦ä½ä¿è¯è¿ä¸ª Activity ä¸çå¤ä¸ª Fragment ä¹é´çåéæ æ¯å¦æ£å¸¸ï¼å设è¿ä¸ª Activity é颿 10 个Fragmentï¼ä¸ä¸åå¼å 10 个 Fragment å建æ¯å¦ä¼å¯¹å
ååæ§è½é æå½±åå¢ï¼
* 妿å Activity å¤ Fragment ä¸è½ä¸ºæä»¬åé 太大ç价弿¶ï¼è¿ç§æ¨¡å¼æ ¹æ¬å°±ä¸å¼å¾æä»¬å»åï¼å 为æä»¬æç»å¾å°çï¼æ°¸è¿æµä¸ä¸ä»åºçã
#### 为ä»ä¹æ²¡æç¨ ConstraintLayout æ¥åå¸å±
* 大家妿æä»ç»è§å¯çè¯ï¼ä¼åç° AndroidProject å
¶å®æ²¡æç¨å° ConstraintLayout å¸å±ï¼å¨è¿éè°è°æå¯¹è¿ä¸ªå¸å±ççæ³ï¼çº¦æå¸å±æä¸ä¸ªä¼ç¹ï¼æ²¡æå¸å±åµå¥ï¼æä»¥è½åå°æµé次æ°ï¼ä»èæåå¸å±ç»å¶çé度ï¼ä½æ¯ä¼ç¹ä¹æ¯å®ç缺ç¹ï¼æ£æ¯å 为没æå¸å±åµå¥ï¼View ä¹å°±æ²¡æå±çº§æ¦å¿µï¼æä»¥å®éè¦å®ä¹å¾å¤ ViewID æ¥çº¦æç¸é»ç View çä½ç½®ï¼å°±ç®è¿ä¸ª View æä»¬å¨ Java 代ç 䏿²¡æç¨å°ï¼ä½æ¯å¨çº¦æå¸å±ä¸è¿æ¯è¦å®ä¹ãè¿æ ·å¸¦æ¥çå¼ç«¯æå 个ï¼
1. æä»¬æ¯æ¬¡é½è¦æ³å¥½è¿ä¸ª ViewID çåç§°å«ä»ä¹ï¼è¿ä¸ªå°±æç¹ç§èçäºï¼æ¢è¦ç¬¦å代ç è§èï¼ä¹è¦æç¡®åçªåºå
¶ä½ç¨ã
2. è¦èè好æ¯ä¸ª View ä¸ä¸å·¦å³ä¹é´ç约æå
³ç³»ï¼å¦åå°±ä¼å®¹æåºç°è¶ççæ
åµï¼ä¾å¦ä¸ä¸ª TextView 设计å¾ä¸æ 5 个åï¼ä½æ¯åå°è¿åäº 10 个åï¼è¿ä¸ªæ¶å TextView çæ§ä»¶å®½åº¦ä¼è¢«æé¿ï¼å¦ææ²¡æè®¾ç½®å¥½å³è¾¹ç约æï¼ææå¯è½åºç°é®çå³è¾¹ View çæ
åµã
3. View ä¹é´çå
³ç³»ä¼åå¾å¤æèµ·æ¥ï¼å
·ä½è¡¨ç°ä¸ºå¸å±ä¸æ¦åçåæ´ï¼ä¾å¦å 餿å¢å æä¸ä¸ª Viewï¼é½ä¼å½±åæ´ä¸ª ConstraintLayout å¸å±ï¼å 为å¾å¤çº¦æå
³ç³»ä¼å æ¤åçæ¹åï¼å¹¶ä¸å¨å¸å±é¢è§ä¸å°±ä¼åå¾é乱起æ¥ï¼ç®åéä¿ç¹æ¥è®²å°±æ¯ï¼ä½ æäºä¸åç¦ï¼å¾å¯è½ä¼å¯¼è´æ¿åå±å¡ã
4. æ¯æä»¬æ æ³ç´æ¥å¨å¸å±ä¸æ æ³ç´æ¥é¢å¤è¿ä¸ª View å¨ Java 代ç 䏿¯å¦æä½¿ç¨å°ï¼å 为æ¯ä¸ª View å ä¹é½æå®ä¹ IDï¼è¦æ³ç¥éè¿ä¸ª View ææ²¡æç¨å°ï¼è¿æ¯å¾å¨ Java 代ç 䏿¾ä¸æ¾ã
* æçæ³æ³æ¯ï¼é¡¹ç®éé¢å¤§å¤æ°é¡µé¢è¿æ¯æ¯è¾ç®åçï¼å¯ä»¥ç»å LinearLayout å FrameLayout å¸å±æ¥åï¼å¹¶ä¸ä¸éè¦åµå¥å¾å¤ªæ·±ï¼æè§å¾åççåµå¥æ¯ 2~3 å±ï¼å¦æè¶
è¿ 5 å±å¯ä»¥èèç¨ ConstraintLayout å¸å±æ¥åï¼å½ç¶è¿ç§æ
åµå¨å®é
项ç®ä¸è¿æ¯æ¯è¾å°çã
* å¦å¤ä¸ä¸ªé®é¢ï¼å°±æ¯æåç°æäºäººåå¸å±å欢åµå¥å¾å¤å±ï¼ä½æ¯çæ£çæ
åµå¹¶ä¸æ¯ççå°±éè¦åµå¥é£ä¹å¤ï¼èæ¯è¿ä¸ªäººå¯¹è¿ä¸ªå¸å±çç¹æ§å屿§ä¸å¤ªçæè导è´ï¼æ£ç¡®çæ¹å¼æ¯æ·±å
¥å¦ä¹ ï¼è¿æ ·æè½ç¨å¥½æ¯ä¸ä¸ªå¸å±ã
#### 为ä»ä¹ä¸ææå¤ä¸ªæ¡æ¶æ¥åè¿ä»¶äº
* AndroidProject å
¶å®ä¸ç´æè¿æ ·åï¼æå¾å¤ç»ä»¶é½ææäºç¬ç«çæ¡æ¶ï¼ä¾å¦ï¼æéè¯·æ±æ¡æ¶ [XXPermissions](https://github.com/getActivity/XXPermissions)ï¼ç½ç»è¯·æ±æ¡æ¶ [EasyHttp](https://github.com/getActivity/EasyHttp)ãå叿¡æ¶ [ToastUtils](https://github.com/getActivity/ToastUtils) ççï¼æé½æ¯å°å®æ½ç¦»å¨ AndroidProject ä¹å¤ï¼ä½ä¸ºä¸ä¸ªåç¬ç弿ºé¡¹ç®è¿è¡å¼ååç»´æ¤ï¼è³äºè¯´ä¸ºä»ä¹è¿æä¸äºä»£ç æ²¡ææ½ååºæ¥ï¼ä¸»è¦åå æå ç¹ï¼
1. åä¸å¡çè¦åæ§é«ï¼ä¾å¦ Dialog ç»ä»¶å¼ç¨äºå¾å¤é¡¹ç®çåºç±»ï¼ä¾å¦ **BaseDialog**ã**BaseAdapter** ç
2. ä¸å¡æå®å¶åéæ±ï¼å 为 Dialog ç UI 飿 ¼è¦è·é项ç®çè®¾è®¡èµ°ï¼æä»¥ä»£ç 妿å¨é¡¹ç®ä¸ï¼ä¿®æ¹èµ·æ¥ä¼é常æ¹ä¾¿ï¼å¦ææ½åå°æ¡æ¶ä¸ï¼è¦æä¹ä¿®æ¹åç»ä¸ UI 飿 ¼å¢ï¼æä¸ªäººè®¤ä¸ºæ¡æ¶ä¸éåå UI å®å¶åï¼å 为æ¯ä¸ªäº§åçè®¾è®¡é£æ ¼é½ä¸ä¸æ ·ï¼å°±ç®å¼æ¾åå¤ç API ç»å¤é¨è°ç¨ç人设置 UI 飿 ¼ï¼ä¹æ æ³æ»¡è¶³ææäººçéæ±ã
* åºäºä»¥ä¸å ç¹ï¼æå¹¶ä¸è®¤ä¸ºææçä¸è¥¿é½é忽忿¡æ¶ç»å¤§å®¶ç¨ï¼æäºä¸è¥¿è¿æ¯è·é **AndroidProject** ä¸èµ·æ´æ°æ¯è¾å¥½ãå½ç¶åæé请æ±è¿ç§ä¸è¥¿ï¼æä¸ªäººè§å¾æ½ææ¡æ¶æ¯æ¯è¾åéçï¼å 为å®åä¸å¡çå
³èæ§ä¸å¤§ï¼æ´éè¦çæ¯ï¼å¦ææä¸å¤©ä½ è§å¾ **XXPermissions** åå¾ä¸å¤å¥½ï¼ä½ éæ¶å¯ä»¥å¨ **AndroidProject** æ¿æ¢æå®ï¼å¹¶ä¸æ´ä¸ªè¿ç¨ä¸éè¦å¤ªå¤§çæ¹å¨ã
#### 为ä»ä¹æä½å
¼å®¹å° Android 5
* AndroidProject ä» [v11.0 çæ¬](https://github.com/getActivity/AndroidProject/releases/tag/11.0)ï¼å·²ç»å° minSdkVersion ä» 19 åçº§å° 21ï¼åå ä¹å¾ç®åï¼æä¸æ¨è大家å
¼å®¹ Android 4.4 çæ¬ï¼å 为è¿ä¸ªçæ¬å
¼å®¹æ§çé®é¢å¤ªå¤ï¼å¯¹ **dex åå
**ã**ç¢éå¾**çæ¯æä¸æ¯ç¹å«å¥½ï¼è¿ä¸ªæä»¬å¼åè
å¤çä¸äºï¼é¤æ¤ä¹å¤è¿æå¾å¤ API è¦åé«ä½çæ¬å
¼å®¹ï¼è¿ä¸ªæä»¬å¼åè
è½åï¼ä½æ¯æè§å¾æ²¡ä»ä¹å¿
è¦æ§ï¼å 为è¿ä¸ªçæ¬çæºåä¼è¶æ¥è¶å°ï¼ä¼éæ¥éåºåå²èå°ï¼è AndroidProject 䏿¦æå
¥å°é¡¹ç®ä¸ä½¿ç¨ï¼minSdkVersion åºæ¬ä¸ä¼æåå¨ï¼æä»¥æçæ³æ³æ¯ï¼ä¸å¦å¨ä¸å¼å§å°±ä¸å
¼å®¹è¿ä¸ªçæ¬ï¼å
å¾åé¢ç»å¤§å®¶å¸¦æ¥ä¸äºä¸å¿
è¦ç麻ç¦ï¼Android 4.4 æäºé®é¢æ¯**ç硬伤**ï¼è¿æ¯ä¸ä¸ªé常**令人头ç¼**çé®é¢ã
#### 为ä»ä¹ä¸å å
¥æ«æäºç»´ç åè½
* AndroidProject çå®ä½æ¯åä¸ä¸ªææ¯æ¶æï¼ä¸æ¯ä»ä¹é½åç Demo å·¥ç¨ï¼å¦æåªæ¯è§£å³å¤§å®¶çéæ±é®é¢ï¼é£æ ·å¨æçæ¥æä¹å
¶å®å¹¶ä¸å¤§ï¼å½ç¶å®ç°éæ±åºç¶å¾éè¦ï¼ä½å¹¶ä¸æ¯ææçææ¯ç¹å¨ä¸å项ç®é½ä¼ç¨å°ï¼AndroidProject åªæ¯å¨åæ¶æçåæ¶é¡ºéææ¨¡æ¿åäºï¼å¦æè¯´æ¶ææ¯ç论ï¼é£ä¹æ¨¡æ¿å°±æ¯å®è·µï¼ä»£ç åå¾å好ï¼å¦æä¸å®è·µï¼é£ä¹ä¹åªæ¯çº¸ä¸è°å
µï¼åæè
ä¸çä¸ä¸ç¨ã
* AndroidProject å¹¶ä¸ä¼ä¸ºä¸ªäººåå®å¶ï¼å
æ¬æèªå·±ï¼æå¯ä»¥ç»å¤§å®¶ä¸¾ä¸ªæ åï¼AndroidProject éæäºæå¾å¤èªå·±çæ¡æ¶ï¼ä½å¹¶ä¸æ¯æææåçæ¡æ¶é½ä¼å å
¥å°éé¢å»ï¼ä¾å¦[å¤è¯ç§æ¡æ¶](https://github.com/getActivity/MultiLanguages)ï¼ä¸»è¦åå æ¯ App å½é
åçåºæ¯å¹¶ä¸å¤ï¼å¤§é¨åå½å
ç App 没æä¸æ¶ GooglePlayï¼å°æ°æä»å¤æ°çååï¼æä»¥ææ²¡æå å
¥è¿ä¸ªæ¡æ¶å° AndroidProject ä¸ï¼å¹¶ä¸æ¯æ¡æ¶åå¾ä¸å¥½ï¼è½ç¶å å
¥ä¼å¯¹è¿ä¸ªæ¡æ¶æå©ï¼ä¼ææ¨å¹¿ä½ç¨ï¼ä½æ¯ä¸ç¬¦å大é¨å人çå©çï¼äºæ¯å¨å¤§æåå°æä¹é´ï¼æè¿æ¯éæ©å¤§æãè¿æ çæ¯ä¸ä¸ªè°é¾çææ©ï¼ä½æ¯æå¿
é¡»å¾è¿ä¹åã
#### 为ä»ä¹ä¸å å
¥ EventBus
* EventBus æä¹åå
¶å®æå å
¥è¿ä¸çï¼åªä¸è¿å¨ [v10.0](https://github.com/getActivity/AndroidProject/releases/tag/10.0) çæ¬ä¸é¢ç§»é¤äºï¼åå å¾ç®åï¼å®ä¸æ¯ä¸ä¸ªé¡¹ç®çå¿
éåï¼æä»¬ç¨ EventBus çåè¡·åºè¯¥æ¯ï¼å½éæ±å¨ç°æçåºç¡ä¸å®ç°èµ·æ¥æ¯è¾å°é¾æè
éº»ç¦æ¶ï¼æä»¬å¯ä»¥èèç¨ä¸ç¨ï¼ä½æ¯å°äºå®é
项ç®ä¸ï¼ä¼åºç°å¾å¤æ»¥ç¨çæ
åµåºç°ï¼å¨è¿éæå»ºè®®å¤§å®¶ï¼è½ç¨æ£å¸¸æ¹å¼å®ç°é讯çï¼å°½éä¸è¦ç¨ EventBus å®ç°ãå¦å¤å¤§å®¶å¦æççæéè¦ï¼å¯ä»¥èªè¡å å
¥ï¼éæä¹ç¸å¯¹æ¯è¾ç®åã
#### 为ä»ä¹æ²¡æç¨ Retrofit å RxJava
* ææ³é®å¤§å®¶ä¸ä¸ªé®é¢ï¼è¿ä¸¤ä¸ªæ¡æ¶æé
èµ·æ¥å¥½ç¨åï¼å¯è½å¤§å®¶çåçé½ä¸ä¸è´ï¼ä½æ¯æä¸ªäººè§å¾ä¸å¥½ç¨ï¼æ¥ä¸æ¥è®©æä»¬åæä¸ä¸ Retrofit æä»ä¹é®é¢ï¼
1. åè½å¤ªå°ï¼å¦æä½ ç¨è¿ Retrofitï¼ä¸è¯´å°åè½è¿ä¸ªè¯ï¼æç¸ä¿¡ä½ çèæµ·ä¸ç¬¬ä¸ä¸ªæ³å°è½ä¸è½ç¨ OkHttp çæ¦æªå¨æ¥å®ç°ï¼æ²¡é常ç¨çåè½ Retrofit 齿²¡æå°è£
ï¼ä¾å¦æå¸¸ç¨çåè½æï¼æ·»å éç¨è¯·æ±å¤´ååæ°ã请æ±åååºçæ¥å¿æå°ã卿 Host åå¤ååé
ç½®ï¼Retrofit ç»ç»é½æ²¡æï¼éè¦èªå·±å»å®ç°ãææ¶åæå¨æ³ï¼å¦æ Retrofit 没æ **Square å
¬å¸è书**ï¼ç°å¨åºè¯¥ä¼°è®¡ä¸ä¼æå¤å°äººç¨å§ã
2. ä¸å¤çµæ´»ï¼Retrofit å
¶å®æ¯æ¯æä¸ä¼ çï¼ä½æ¯æä¸ä¸ªç¼ºç¹ï¼ä¸è½è·åè¿åº¦çå¬ï¼åªè½è·åå°æåå失败ãå½ç¶ç½ä¸ä¹æä¸äºè§£å³æ¹æ¡ï¼ä¾å¦éè¿è®¾ç½®æ¦æªå¨ï¼æ¥å¯¹ RequestBody è¿è¡äºæ¬¡å
è£
æ¥è·åä¸ä¼ è¿åº¦ï¼ä½æ¯æ´ä¸ªå®ç°çè¿ç¨ååå°éº»ç¦ï¼å¨ Retrofit ä¸ä¹æ²¡æç»åºä¸ä¸ªå¥½çæ¹æ¡ï¼ææå¯ä»¥ç± Retrofit æ¥åçäºï¼ä¸ºä»ä¹è¦ååå°æ¯ä¸ªå¼åè
ä¸é¢ã
3. å¦ä¹ ææ¬é«ï¼Retrofit 主è¦çå¦ä¹ ææ¬æ¥æºäºå®çæ³¨è§£ï¼æç°å¨æå®éé¢æææ³¨è§£ç½ååºæ¥ï¼@Urlã@Bodyã@Fieldã@FieldMapã@FormUrlEncodedã@Headerã@HeaderMapã@Headersã@HTTPã@Multipartã@Partã@PartMapã@Pathã@Queryã@QueryMapã@QueryNameã@Streamingãæä»¬äºè§£è¿å¤å°ä¸ªæ³¨è§£çä½ç¨ï¼è¿ä¸ªæ¶å大夿°äººè¯å®ä¼è¯´ï¼æé½æ¯æç
§å«äººçåæ³å¤å¶ä¸éï¼å
·ä½æä»ä¹ä½ç¨æè¿ççä¸ç¥éãå
¶å®è¿ä¸ªæ¯å¦ä¹ ææ¬é«å¸¦æ¥çå¼ç«¯ï¼äººä»¬å¾å¾åªä¼è®°ä½æå¸¸ç¨çé£å 个ã
* ææè§ï¼å¤§å®¶ç¨çä¸ä¸å®å°±æ¯æå¥½çï¼ç²ç®å°ä»ä¼ä¸æ¯ä»¶å¥½äºï¼è°è°æççæ³ï¼å¨éç¨ä¸ä¸ªæ¡æ¶ä¹åï¼æä¼åæå®å¨é¡¹ç®å®æä¸çä¼ç¼ºç¹ï¼å¦æç¼ºç¹å¤§äºä¼ç¹ï¼é£æ¯è¯å®ä¸è½æ¥åçï¼å¦æä¼ç¹è¿å¤ï¼åæ¶ç°æç缺ç¹è¿è½æ¥åï¼è¿æ¯å¯ä»¥èèæå
¥å°é¡¹ç®ä¸ä½¿ç¨çã
* AndroidProject å¨å¾é¿çæ¶é´å
齿²¡æå å
¥ç½ç»è¯·æ±æ¡æ¶ï¼æ¯å 为æè¿æ²¡ææ¾å°åéçç½ç»è¯·æ±æ¡æ¶ï¼å¦æä¸æ¦å å
¥ Retrofitï¼æå°±ä¸å¾ä¸é¢å¯¹å®å¸¦æ¥çåç§åæ ·çé®é¢ï¼ä¾å¦æå¾å¤äººä¼é®ä½ è¿ä¸ªåè½æä¹å®ç°ï¼é£ä¸ªåè½æä¹å®ç°ï¼ä¸å
¶è¿æ ·ï¼é£æä¸ºä»ä¹ä¸èªå·±åä¸ä¸ªå¢ï¼
* ä½ææ·±ç¥å好ä¸ä¸ªç½ç»è¯·æ±æ¡æ¶ä¸æ¯ä¸ä»¶ç®åçäºæ
ï¼ä» [OkGo](https://github.com/jeasonlzy/okhttp-OkGo) ä½è
弿´çäºä»¶æ¥çï¼æå¤§æ¦å°±ç¥éäºè¿åé¢åä¸å
¥å深似海ï¼ä½æ¯ç½ç»è¯·æ±æ¯ä¸ä¸ªé¡¹ç®å¿
ä¸å¯å°çé¨åï¼æ³è¦å好 AndroidProjectï¼é£ç½ç»è¯·æ±è¿åä¸å®ä¸è½å°ãç»äºå¨ç»è¿äºåå¹´å¤ç设计åå¼åï¼[EasyHttp](https://github.com/getActivity/EasyHttp) å¨ 2019 å¹´ 12 æ 7 æ¥é¢ä¸äºï¼å½æå
´é«éçå°å叿¶ï¼å´åç°åºæ¬æ²¡æä»ä¹çåº¦ï¼æå¾å¤äººé½è¯´æç¨ Retrofit + RxJava å®é¾éä¸é¦åï¼
* EasyHttp å¨è¢«å¤åå·è½çæé´ï¼æä¹å¾é¾åï¼é¾éåå¹´çå¿è¡è¦ä»ä¹ä¸æµï¼æéæ°åæäº EasyHttp ç设计ï¼å®ç¡®å®æ¯å好æï¼ä½æ¯è¦åå°å¤§é¨å人认å¯è¿éè¦ä¸æ®µæ¶é´çæç£¨ï¼æä»¥æéæ©äºåå®ï¼å 为æç¸ä¿¡æ¯éåç»æä¸å¤©ä¼åå
ï¼ææ¿æä»åºå¤§éçæ¶é´åç²¾åæ¥ç»´æ¤å®ãæè¿æä¸ä¸ªå¥½æ¶æ¯å¯ä»¥è·å¤§å®¶åäº«ï¼ææ¸æ¸æ¶å°äºå¾å¤å
³äº EasyHttp ç夸èµï¼é½æ¯è¯´ EasyHttp å¾å¥½ç¨ãçµæ´»æ§å¾é«ï¼è¿è®©æè¶åè§å¾èªå·±åçæ¯å¯¹çï¼å¦ææ²¡æè¿äºè¯å®ï¼æå¯è½æ©å°±åæä¸ä¸å»äºã
#### 为ä»ä¹æ²¡æç¨ Jetpack å
¨å®¶æ¡¶
* AndroidProject éé¢å
¶å®æè¿ç¨å°å Jetpack ç¸å
³çææ¯ï¼ä¾å¦ Lifecycle ç¹æ§ï¼å¨ BaseDialog å å
¥äºæ¤ç¹æ§ï¼ä¸ä»
妿¤ï¼éé¢å¼å
¥ç EasyHttp ç½ç»è¯·æ±æ¡æ¶ä¹éç¨äº Lifecycle ç¹æ§æ¥ç®¡æ§ç½ç»è¯·æ±ï¼Lifecycle æ¯ä¸ä¸ªå¥½ä¸è¥¿ï¼æç»ä»¶ççå½å¨ææ½è±¡åäºï¼è¿æ ·æä»¬æ éè¦å
³å¿è¿ä¸ªç»ä»¶æ¯ Activity æ Fragmentï¼åæè
æ¯å
¶ä»ç±»åçç»ä»¶ã
* 使¯é¤äº Lifecycle ç»ä»¶ä¹å¤ï¼LiveData å ViewModel ç»ä»¶å¨ AndroidProject åºæ¬æ²¡æç¨å°ï¼è¿ä¸ªæ¯å 为 AndroidProject æèªå·±ç代ç è®¾è®¡ææ³ï¼åªä¼éæä¸äºåéç代ç åºï¼ä¸ä¼ä¸å³å°å»è¿½æ±ä»ä¹å
¨å®¶æ¡¶ï¼æ¡æ¶é忝è¦ç»¼åèèå¾å¤æ¹é¢çå ç´ ï¼å¹¶æ²¡æå¤§å®¶æ³å¾é£ä¹ç®åã
#### 为ä»ä¹ä¸å¯¹å¾çå è½½æ¡æ¶è¿è¡å次å°è£
* 常ç¨çå¾çå è½½æ¡æ¶æ é就两ç§ï¼æå¸¸ç¨çæ¯ Glideï¼å
¶æ¬¡æ¯ Frescoãææ¾åè¿ä¸ä¸ªææ¯è°ç ï¼

* æ ç Glide å·²æå¤§å®¶æåç±çå¾çå è½½æ¡æ¶ï¼å½ç¶ä¹æäººä½¿ç¨ Frescoï¼ä½æ¯å æ¯æå°ã
* 飿¢ç¶èåç½èåææç±ï¼é£ä¹ä¸ºä»ä¹ä¸å¯¹å¾çå è½½æ¡æ¶æ½åææ¥å£å¢ï¼è¿æ ·ä¸å°±æææçé®é¢é½è§£å³äºï¼
* å
¶å® [AndroidProject 10.0](https://github.com/getActivity/AndroidProject/releases/tag/10.0) ä¹åççæ¬æåè¿è¿åçå
容ï¼ä½æ¯ç§»é¤çåå æ¯ï¼æ½åæ¥å£å
¶å®ä¸é¾ï¼é¾çæ¯åç»çæ©å±ï¼ä¾å¦ Glide ç»æä»¬å¼æ¾äºå¾å¤ APIï¼æä»¬æå¸¸ç¨çæ¯å è½½ç½ç»å¾çãå è½½åè§å¾çãå è½½åå½¢å¾çï¼ä½æ¯å¦ææ¯å
¶ä»å½¢ç¶çå¾çå¢ï¼é£å°±è¦æ¶åå° Glide å¾å½¢åæ¢ç API äºï¼è¿æä¸ä¸ªå°±æ¯å è½½çå¬çäºä»¶ï¼ä¹éè¦æ¶åå° Glide ç APIï¼ç¼åçç¥ï¼ä¸æ¢å¦æ¤ï¼è¿æå¾å¤ API 齿¶åå° Glide ç APIï¼å¦æç´æ¥ç¨ Glide æ¥åï¼æä»¬å¯ä»¥è½»æ¾å®ç°ï¼ä½æ¯å¦æç»è¿ä¸å±ç代ç å°è£
ï¼é£ä¹ä¼ææ¡æ¶æ¬èº«ççµæ´»æ§ç»æ¼ææãä½å¹¶ä¸æ¯ä¸å¯ä»¥å®ç°ï¼èæ¯æ²¡æè¿ä¸ªå¿
è¦ï¼å°±ç®åäºä»åºåæ¶çä¹ä¼è¿è¿ä¸ææ£æ¯ï¼åæ¶ä¹ä¼ç»å¤§å®¶å¸¦æ¥ä¸å®çå¦ä¹ ææ¬ã
#### æ¨¡æ¿ æ¶æ ææ¯ä¸å°æä»ä¹åºå«
* AndroidProject æ£å¼ä» **å®åæ¶æ** æ´å为 **å®åææ¯ä¸å°**ï¼å 为å®ç¬¦åææ¯ä¸å°çç¹æ§ï¼æ¢è½å¤åå°å¿«éå¼åï¼åæ¶åè½ä¿è¯åç»ç»´æ¤ä¹è½å¿«éè¿ä»£ã大家å¯ä»¥ä¹å°ææ¯ä¸å°çè§£ä¸ºï¼æ¨¡æ¿+æ¶æï¼ä¸è¬å模æ¿ä»£ç ç人åä¸äºæ¶æè®¾è®¡ï¼èåæ¶æè®¾è®¡ç人å䏿³å模æ¿ä»£ç ï¼é£ä¹ææ¯ä¸å°çæ¦å¿µä¾¿åºç°äºï¼å¹¶ä¸ç»åäºè¿ä¸¤ç§çä¼ç¹ï¼å¼ååç»´æ¤é½å
¼é¡¾å°ä½ã
#### 为ä»ä¹ä¸æä¸å¡æ¥ååå
å
* æä¸äºä¸å¡èè´£ä¸æç¡®ï¼æ æ³éå®å±äºåªä¸ä¸ªä¸å¡æ¨¡åï¼å¹¶ä¸å¤§å¤æ°æ¨¡åçç±»é½æ¯æ¯è¾å°ï¼åªæå°é¨åçæ¨¡åæ¥æä¸å®æ°éçç±»ï¼æä»¥å¨ä¸è¬çä¸å°é¡¹ç®å¼åä¸ï¼ææ´æ¨è以类çä½ç¨æ¥ååå
åã
#### 为ä»ä¹æ²¡æå
³äºåè¡¨å¤ type çå°è£
* åçç RecyclerView.Adapter æ¬èº«å°±æ¯æå¤ typeï¼åªéè¦éåéé
å¨ç getItemType æ¹æ³å³å¯ï¼å
·ä½ç¨æ³ä¸åè¿å¤ä»ç»ã
#### è¿ä¸å°±æ¯ä¸ä¸ªæ¨¡æ¿å·¥ç¨æ¢ææä¹è½åä¸ä¸ª
* æ³æ AndroidProject ååºæ¥å¹¶ä¸é¾ï¼æå½æ¶åªè±äºä¸ä¸¤ä¸ªææï¼èå好å®éè¦æ éçæ¶é´åç²¾åï¼æè±äºä¸¤å¹´å¤çæ¶é´ä»ç¶è¿å¨åè·¯ä¹ä¸ï¼å°½ç®¡æå¾å¤äººè®¤ä¸ºå®å¾å¥½ç¨ï¼æ²¡æä»»ä½ Bugï¼ä½æ¯å¨æçæ¥è¿ä¸å¤ï¼å 为æ¯ä¸ªäººè¡¡éæ åçç¨åº¦ä¸åï¼æçæ åæ¯éçæ¶é´çæ¨ç§»åææ¯çæåè䏿æé«ãå
·ä½ä»åºäºå¤å°åªåï¼[å¯ä»¥å
让æä»¬çä¸ç»æ°æ®](https://github.com/getActivity/AndroidProject/graphs/contributors)ï¼

* ä¸å
¶è¯´ AndroidProject åçæ¯æ¨¡æ¿å·¥ç¨ï¼ä½å®é
æå¨æ¶æè®¾è®¡ä¸è±è´¹çæ¶é´åç²¾å伿´å¤ï¼å
¶å®è¿ä¸¤è
æé½æå¨åï¼å 为æçç®çåªæä¸ä¸ªï¼è½å¤å¸®å©å¤§å®¶æ´å¥½å°å¼ååç»´æ¤é¡¹ç®ãå
·ä½ AndroidProject å¨ä»£ç è®¾è®¡ä¸æä»ä¹äº®ç¹ï¼è¿éæå»ºè®®ä½ çä¸ä¸éé¢ç代ç ï¼æç¸ä¿¡ä½ çå®å伿æ¶è·çï¼å颿å¯è½ä¹ä¼åºä¸ç¯æç« å
·ä½è®²è¿° AndroidProject ç亮ç¹ã
#### å设 AndroidProject æ´æ°äºè¯¥æä¹å级å®
* åå åè§£éï¼é¦å
çº æ£ä¸ç¹ï¼AndroidProject ä¸¥æ ¼æä¹ä¸æ¥è¯´ï¼ä¸æ¯æ¡æ¶ä¸ç§ï¼èå±äºæ¶æä¸ç§ï¼æ¶æå级æ¬èº«å°±æ¯ä¸ä»¶å¤§äºï¼å¹¶ä¸åå¨å¾å¤æªç¥çé£é©ç¹ï¼æä¸æ¨èå·²ä½¿ç¨ AndroidProject å¼åç项ç®å»åå级ï¼å 为å¼ååæµè¯çææ¬æå
¶é«ï¼é´æ¥è½ä¸ºä¸å¡å¸¦æ¥ä»·å¼å
¶å®å¾ä½ï¼å¾å¤æ¶åæç¥é大家å¾å欢 AndroidProject ç代ç ï¼æ³ç¨å°å
¬å¸é¡¹ç®ä¸å»ï¼ä½æ¯æä»ç¶ä¸æ¨èä½ é£ä¹åï¼åè®¾è¿æ¯ä½ ç个人项ç®å¯ä»¥é£ä¹åï¼ä½æ¯å
¬å¸é¡¹ç®æå¥½ä¸è¦ï¼å 为å
¬å¸åä½ é½æ¯è¦é è¿ä¸ªé¡¹ç®èµé±ï¼è°ä¹ä¸å¸æé¡¹ç®åºç°é®é¢ï¼å¦ææ¯å
¬å¸è¦å¼å人åéæå
¬å¸é¡¹ç®ï¼ä¹å¯ä»¥èèé£ä¹åï¼æ¯ç«è¿ä¸ªæ¶åçé£é©å
¬å¸å·²ç»æ¿æ
äºå¤§é¨åäºï¼æ¥ä¸æ¥çè¯åªéè¦æä»å
¬å¸å®æå³å¯ã
* æ´æ°çæ¹å¼ï¼ç±äº AndroidProject 䏿¯ä¸ä¸ªåç¬çæ¡æ¶é£ä¹ç®åï¼æ æ³éè¿æ´æ°è¿ç¨ä¾èµçæ¹å¼è¿è¡åçº§ï¼æä»¥åªè½éè¿æ¿æ¢ä»£ç çå½¢å¼è¿è¡æ´æ°ï¼éè¦æ³¨æçæ¯ï¼ä»£ç è¦çå®éè¦ç»è¿ä¸¥æ ¼çèªæµåæµè¯ï¼æµè¯æ¯åè¿ä»¶äºæ
çå
³é®æµç¨ï¼éè¦éè§èµ·æ¥ï¼å¯¹æ¯ä¸å¤åè½è¿è¡è¯¦ç»æµè¯ï¼ä¸å®è¦è¯¦ç»ï¼ç¹å«æ¶åå°ä¸»æµç¨çåè½ã
#### 为ä»ä¹ä¸ç¨è°·æ ActivityResultContracts
* ActivityResultContractæ¯ Activity 1.2.0-alpha02 å Fragment 1.3.0-alpha02 䏿°è¿½å çæ° APIï¼ä½æ¯å¨æ¤ä¹å AndroidProject æ©å·²ç»å¯¹ onActivityResult åè°è¿è¡äºå°è£
ï¼è¯¦æ
è¯·è§ BaseActivity
```java
public abstract class BaseActivity extends AppCompatActivity {
/** Activity åè°éå */
private SparseArray