30條android項(xiàng)目開發(fā)技巧與經(jīng)驗(yàn)總結(jié)
1、如果是閱讀型文本(例如一篇文章),不需要固定大小的,textSize可以使用sp;如果是展示型文本(例如按鈕中的文本),其大小受到限制的,textSize可以使用dp。
2、使用json用作網(wǎng)絡(luò)數(shù)據(jù)傳輸時(shí),應(yīng)該使用String字段取代int字段。
3、按照現(xiàn)在正常密度比(系統(tǒng)的densityDPI根據(jù)分辨率和屏幕尺寸為正常的120、160、240、320、480、640時(shí))9:16的安卓機(jī)其尺寸為(360dp*540dp)。UI有時(shí)會(huì)根據(jù)iPhone機(jī)型使用750px*1334px作圖,而按照1dp=2px來(lái)算,其結(jié)果為(375dp*667dp)。這樣放置控件,寬度上會(huì)少15dp,高度上會(huì)少127dp,如果UI不做圖的話,可以根據(jù)美觀自行處理(通常不應(yīng)在整個(gè)頁(yè)面的padding上修改尺寸,這個(gè)尺寸應(yīng)該是一開始原型圖就規(guī)定好的全局樣式)。
4、使用GsonFormat插件生成實(shí)體類時(shí),整個(gè)實(shí)體類應(yīng)放在bean文件夾下。
5、使用Butterknife注解布局時(shí),可以使用Android Butterknife Zelezny插件自動(dòng)生成注解。
6、需要提交多個(gè)模塊代碼時(shí),按模塊多次提交(也方便填寫提交信息)。
7、空頁(yè)面應(yīng)該有空頁(yè)面圖片提示。
8、支付寶沙箱環(huán)境測(cè)試,需要在頁(yè)面啟動(dòng)前添加這么一句代碼EnvUtils.setEnv(EnvUtils.EnvEnum.SANDBOX);
9、將字符串轉(zhuǎn)換成Bitmap類型
public static Bitmap stringtoBitmap(String string){
Bitmap bitmap=null;
try {
byte[]bitmapArray;
bitmapArray= Base64.decode(string, Base64.DEFAULT);
bitmap= BitmapFactory.decodeByteArray(bitmapArray, 0, bitmapArray.length);
} catch (Exception e) {
e.printStackTrace();
}
return bitmap;
}
10、在完成一個(gè)版本上線后,應(yīng)至少分成兩個(gè)分支,一個(gè)日常修復(fù)bug以及緊急上線,另一個(gè)用于正常功能開發(fā)。
11、如果一個(gè)接口不需要傳參,應(yīng)設(shè)計(jì)為傳一個(gè)空參(例如new Object()),而不是不傳參數(shù),這樣方便以后拓展接口。
12、adapter中所有的變化的view或值,都應(yīng)該在viewholder中定義,并在onBinderView中賦值。
13、預(yù)覽時(shí)選擇Project Themes,同時(shí)gradle中應(yīng)使用compile而不是implementation。

14、沉浸式狀態(tài)欄需要設(shè)置主題為
<!--沉浸式狀態(tài)欄-->
<style name="NoActionBarTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
為沉浸式狀態(tài)欄設(shè)置主題
<!--沉浸式狀態(tài)欄-->
<style name="NoActionBarTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="android:windowTranslucentStatus">true</item>
</style>
如果還需要使?fàn)顟B(tài)欄中的電量等都隱藏,需要在使用的activity代碼中設(shè)置
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
15、進(jìn)行了某個(gè)操作想退出應(yīng)用回到桌面,可以使用這樣的技巧
//回到桌面
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
16、textview設(shè)置滾動(dòng),第一步現(xiàn)在XML中設(shè)置scrollbars屬性,第二步在代碼中設(shè)置
textView.setMovementMethod(ScrollingMovementMethod.getInstance());
17、setOffscreenPageLimit(0)沒(méi)有效果,最小是1,也就是最小左右各一預(yù)加載。
18、調(diào)用webview的頁(yè)面應(yīng)及時(shí)銷毀,防止內(nèi)存泄漏(具體如下):
@Override
protected void onDestroy() {
try {
if( webView!=null) {
ViewParent parent = webView.getParent();
if (parent != null) {
((ViewGroup) parent).removeView(webView);
}
webView.stopLoading();
// 退出時(shí)調(diào)用此方法,移除綁定的服務(wù),否則某些特定系統(tǒng)會(huì)報(bào)錯(cuò)
webView.getSettings().setJavaScriptEnabled(false);
webView.clearHistory();
webView.clearView();
webView.removeAllViews();
webView.destroy();
}
} catch (Exception e) {
e.printStackTrace();
}
super.onDestroy();
}
19、WebView的一些相關(guān)設(shè)置
WebSettings webSettings = webView.getSettings();
//支持獲取手勢(shì)焦點(diǎn),輸入用戶名、密碼或其他
webView.requestFocusFromTouch();
webSettings.setJavaScriptEnabled(true); //支持js
//webSettings.setPluginsEnabled(true); //支持插件
//設(shè)置自適應(yīng)屏幕,兩者合用
webSettings.setUseWideViewPort(true); //將圖片調(diào)整到適合webview的大小
webSettings.setLoadWithOverviewMode(true); // 縮放至屏幕的大小
webSettings.setSupportZoom(true); //支持縮放,默認(rèn)為true。是下面那個(gè)的前提。
webSettings.setBuiltInZoomControls(true); //設(shè)置內(nèi)置的縮放控件。
//若上面是false,則該WebView不可縮放,這個(gè)不管設(shè)置什么都不能縮放。
webSettings.setDisplayZoomControls(false); //隱藏原生的縮放控件
webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN); //支持內(nèi)容重新布局
webSettings.supportMultipleWindows(); //多窗口
webSettings.setCacheMode(WebSettings.LOAD_DEFAULT); //關(guān)閉webview中緩存
webSettings.setAllowFileAccess(true); //設(shè)置可以訪問(wèn)文件
webSettings.setNeedInitialFocus(true); //當(dāng)webview調(diào)用requestFocus時(shí)為webview設(shè)置節(jié)點(diǎn)
webSettings.setJavaScriptCanOpenWindowsAutomatically(true); //支持通過(guò)JS打開新窗口
webSettings.setLoadsImagesAutomatically(true); //支持自動(dòng)加載圖片
webSettings.setDefaultTextEncodingName("utf-8");//設(shè)置編碼格式
//允許自動(dòng)播放多媒體
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
webSettings.setMediaPlaybackRequiresUserGesture(false);
}
//從Android5.0開始,WebView默認(rèn)不支持同時(shí)加載Https和Http混合模式
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
}
20、scrollView設(shè)置android:fillViewport="true",使scrollview的子控件能夠充滿屏幕。
21、gradle編譯報(bào)錯(cuò)
Error:Failed to open zip file. Gradle's dependency cache may be corrupt (this sometimes occurs after a network connection timeout.) Re-download dependencies and sync project (requires network) Re-download dependencies and sync project (requires network)
Windows下需要打開AndroidStudio的Files——>Settings——>Build...——>Gradle,手動(dòng)設(shè)置gradle位置。
22、將彈出的軟鍵盤的回車鍵改為搜索鍵
<EditText android:id="@+id/et_search" android:layout_width="match_parent" android:layout_height="match_parent" android:imeOptions="actionSearch" android:singleLine="true" android:inputType="text"/>
其中android:imeOptions需要配合android:inputType屬性(或者singleLine屬性,PS:?jiǎn)为?dú)設(shè)置maxLines并不能解決問(wèn)題)才能使回車鍵變?yōu)樾枰膱D標(biāo)。
etSearch.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_SEARCH) {
initData();
return true;
}
return false;
}
});
23、TableLayout中的tableRow中的子控件width設(shè)置match_parent(如果子控件的內(nèi)容小于寬度則不會(huì)撐滿整個(gè)寬度,大于寬度則會(huì)顯示在屏幕外),解決方法一:在tableLayout中設(shè)置android:stretchColumns="對(duì)應(yīng)列",解決方法二:部分情況下可以把該子控件的width設(shè)置為wrap_content。
24、注意dialog和popupWindow可能引起的windowleak。
25、這個(gè)內(nèi)存泄漏的問(wèn)題找了好久,結(jié)果發(fā)現(xiàn)是因?yàn)殚_啟了Android Profiler的原因

就是勾選了這個(gè)的原因。
26、在android5.1(API22)及以下的手機(jī)上出現(xiàn)了GridLayout不顯示的問(wèn)題,使用V7包下的沒(méi)問(wèn)題,可以使用支持包時(shí)應(yīng)優(yōu)先使用支持包?
27、OKHttp優(yōu)點(diǎn):
a、可以使用GZIP壓縮減少傳輸?shù)臄?shù)據(jù)量;
b、可以緩存響應(yīng)避免重復(fù)的網(wǎng)絡(luò)請(qǐng)求;
c、可以使用攔截器預(yù)處理請(qǐng)求與響應(yīng);
d、可以嘗試服務(wù)器的多個(gè)IP地址。
28、retrofit優(yōu)點(diǎn):
可以使用注解的方式提供功能:請(qǐng)求方法注解、標(biāo)記類注解、參數(shù)類注解。
29、RxJava優(yōu)點(diǎn):
a、在與okhttp配合時(shí)異步寫法更簡(jiǎn)便(不需要使用call.enqueue(callback)的形式);
b、在與okhttp配合時(shí)請(qǐng)求和響應(yīng)可以放在合適的線程中處理(請(qǐng)求在Schedulers.io()這個(gè)無(wú)限線程池中處理,響應(yīng)發(fā)送到AndroidSchedulers.mainThread()主線程中處理);
c、RxBus事件總線框架(面向事件過(guò)程編程,更好的解耦模塊)。
30、靜態(tài)資源方法
a、第三方能使用的資源有應(yīng)用程序資源、系統(tǒng)資源和廠商資源(是通過(guò)Native方法addAssetPathNative()方法添加的);
b、查找資源ID對(duì)應(yīng)的不是文件會(huì)返回對(duì)應(yīng)的資源字符串;
c、查找資源ID對(duì)應(yīng)不是文件分為三步:
1、查找資源文件、
2、構(gòu)建XmlResourceParser對(duì)象、
3、解析文件內(nèi)容創(chuàng)建view(如果為merge就會(huì)減少一層UI嵌套)。
暫時(shí)先寫這些,有不正確的地方歡迎大家聯(lián)系我們,我們會(huì)第一時(shí)間與你聯(lián)系
相關(guān)文章
Android開發(fā)之圖形圖像與動(dòng)畫(五)LayoutAnimationController詳解
LayoutAnimationController用于為一個(gè)layout里面的控件,或者是一個(gè)ViewGroup,里面的控件設(shè)置動(dòng)畫效果,感興趣的朋友可以了解下啊,希望本文對(duì)你有所幫助2013-01-01
詳解Android studio實(shí)現(xiàn)語(yǔ)音轉(zhuǎn)文字功能
這篇文章主要介紹了如何通過(guò)Android studio調(diào)用科大訊飛的語(yǔ)音轉(zhuǎn)文字功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-03-03
Android編程監(jiān)聽APK安裝與刪除等過(guò)程的方法
這篇文章主要介紹了Android編程監(jiān)聽APK安裝與刪除等過(guò)程的方法,涉及Android事件監(jiān)聽、權(quán)限控制、廣播操作等相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-10-10
Android的廣播Receiver動(dòng)態(tài)注冊(cè)和靜態(tài)注冊(cè)示例
本篇文章主要介紹了Android的廣播Receiver動(dòng)態(tài)注冊(cè)和靜態(tài)注冊(cè)示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-02-02
Android模擬器"Failed To Allocate memory 8"錯(cuò)誤如何解決
這篇文章主要介紹了Android模擬器"Failed To Allocate memory 8"錯(cuò)誤如何解決的相關(guān)資料,需要的朋友可以參考下2017-03-03
Android使用相機(jī)實(shí)現(xiàn)拍照存儲(chǔ)及展示功能詳解
這篇文章主要介紹了Android使用相機(jī)實(shí)現(xiàn)拍照存儲(chǔ)及展示功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2023-01-01
快速解決設(shè)置Android 23.0以上版本對(duì)SD卡的讀寫權(quán)限無(wú)效的問(wèn)題
今天小編就為大家分享一篇快速解決設(shè)置Android 23.0以上版本對(duì)SD卡的讀寫權(quán)限無(wú)效的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-08-08
Android使用自定義PageTransformer實(shí)現(xiàn)個(gè)性的ViewPager動(dòng)畫切換效果
這篇文章主要介紹了Android使用自定義PageTransformer實(shí)現(xiàn)個(gè)性的ViewPager切換動(dòng)畫,具有很好的參考價(jià)值,一起跟隨小編過(guò)來(lái)看看吧2018-05-05
MVVMLight項(xiàng)目的綁定及各種使用場(chǎng)景示例分析
這篇文章主要為大家介紹了MVVMLight項(xiàng)目中的綁定及綁定的各種使用場(chǎng)景示例源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步除夕快樂(lè)2022-01-01

