背景
此文純粹總結開發(fā)Android以來遇到的一些坑,一來為了防止再次掉坑,二來是希望后面的朋友能躲開這些坑手负。
包名重復問題
由于Google Palyer沒有在中國登陸拼卵,中國存在有非常多的Android應用商城,而且這些商城并沒有聯(lián)合起來對APP包名進行檢測问欠,所以你APP中使用的包名很有可能會跟別人的APP重復。那么小明手機裝了別人的應用,就裝不上你的應用了垮斯。
建議:
1.包名定義要有一定的技術,盡量避免太容易重復的包名只祠,如:com.digital.home兜蠕。
2.要確定包名前,可以將應用發(fā)到一些測試網站去測試抛寝,比如testin熊杨,它會將的你APP安裝到20臺機,看能否全部正常安裝墩剖。
textSize單位問題
Android Studio提示所有textSize的單位都應該使用sp猴凹,因為這樣該text就能夠隨用戶在系統(tǒng)setting里設置的字體大小的改變而改變。那么如果你使用了sp作單位岭皂,那么建議你調整setting字體至最大或最小后郊霎,看UI是否還能正常顯示。我個人使用了不規(guī)范的dp作為單位爷绘。
小米手機圖標異常問題
在別的手機顯示沒有這問題书劝,在小米手機顯示就有下圖的問題,解壓apk包也沒發(fā)現(xiàn)該圖標土至。其實這是小米手機的BUG购对,解決方法是將APP上傳至小米應用商城,它會要求你上傳一整套桌面圖標icon陶因,據說現(xiàn)在小米應用商城已經去掉了這部分功能骡苞。
部分手機因權限問題無法安裝應用問題
一時記不起是什么手機,大概是中興還是樂視手機楷扬,只需要在AndroidManifest.xml里增加一個自定義權限就可以了解幽。
<permission android:name="cus.permission.com.xxx.xxx"
android:protectionLevel="normal"/>
魅藍手機EditText的enabled屬性無用問題
在xml里面讓EditText不可編輯狀態(tài),是設置android:enabled="false"烘苹,但是發(fā)現(xiàn)在魅藍note2這樣設置后還是可以編輯躲株,再加上下面這句就可以了。
mPhoneNumEt.setEnabled(false);
百度更新與360更新沖突問題
之前應用集成了百度更新與360更新镣衡,然后上傳至360后臺發(fā)布霜定,但是審核不通過档悠,解決方法只需要把AndroidManifest.xml里百度相關的xml屏蔽再打包即可。
集成騰訊X5 WebKit無法讀取SD卡html文件問題
將html文件放到/data/data/com.example.demo/files/ 里面望浩,結果發(fā)現(xiàn)X5根本無法讀取辖所,后來通過跟騰訊工作人員溝通,原來舊版本的X5只允許讀取/sdcard 和私有目錄下的/data/data/com.example.demo/files/public目錄曾雕,其他目錄的調用都被禁止了奴烙。
我手機上的X5版本是2258,而新的版本如3321已經不再限制了剖张,所以要兼容低版本的X5內核切诀,還是需要把文件放在public目錄下。更詳細的集成方案請閱讀《集成第三方組件--Android APP集成騰訊X5 WebKit》
AsyncTask
AsyncTask只能執(zhí)行簡短任務搔弄,執(zhí)行長時間耗時任務會阻塞其他使用AsyncTask的任務幅虑。在項目中慎用,我踩過關于它的坑是在輪播圖里使用了它顾犹,導致其他AsyncTask阻塞倒庵,不能正常使用。比如集成七魚客服SDK無法獲取相冊圖片炫刷,比如獲取短信驗證碼倒計時無法正常倒計時擎宝。詳細可參考:AsyncTask 使用和缺陷
集成個推SDK的坑
個推最近推出了2.9.0版本的SDK,集成后打包apk文件浑玛,發(fā)現(xiàn)Android 5.0以上的系統(tǒng)都無法安裝绍申,顯示“應用未安裝”,只能使用之前的2.8.1.0的版本顾彰,這個問題在他們Demo也已經驗證過极阅,各位要注意。
簽名問題
生成簽名文件xxx.jks涨享,兩個StorePassword和KeyPassword都沒有錯筋搏,但是還是提示:Cannot recover key,后來刪掉xxx.jks 厕隧,重新生成奔脐,并設置StorePassword和KeyPassword為同一個密碼,然后就可以了吁讨。
奇葩所在:
沒來得及分析這是為什么帖族,因為我現(xiàn)在用的其他簽名文件兩個密碼不一致也沒問題。后面我再次嘗試使用不一樣的密碼挡爵,發(fā)覺原理問題不存在了。
可能的原因:
1.是IDE的BUG甚垦,重啟IDE就能搞定茶鹃;
WebView加載htm影響原生頁面工作
公司項目使用HyBrid方式開發(fā)涣雕,直到有個頁面需要使用動畫、設置View顯示隱藏闭翩、設置View的高度挣郭、刷新GridView數(shù)據,但是發(fā)現(xiàn)加載a.html后這些功能全部失效或異常了疗韵,而選擇加載b.html就沒問題兑障,而且這個只發(fā)生在我的4.3手機上。
奇葩所在:
不知道確切原因蕉汪,問題還沒解決流译。
可能原因:
1.htm某些功能影響了原生頁面?
2.加載這個頁面是否需要開啟某些功能者疤?
WebView加載html頁面后福澡,部分手機顯示頁面過大
兩臺手機加載同一個html頁面,一個正常顯示驹马,另一個頁面顯示不全革砸,可以左右滑動,這個問題已經解決糯累,問題是另一臺手機調整了系統(tǒng)字體大小導致算利。解決方法是設置WebView顯示為normal字體大小,代碼如下:
webSetting.setTextSize(WebSettings.TextSize.NORMAL);
webSetting.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);
提示“應用未安裝”
手機連接usb線的時候可以安裝泳姐,但是下載apk安裝卻提示“應用未安裝”效拭,今天也發(fā)現(xiàn)支付寶出現(xiàn)了這個問題。原因是我們打包的apk不完整或路徑有問題導致仗岸,我這里發(fā)現(xiàn)的問題是在使用Gradle打包.so文件打包方式不對允耿,最后參考http://blog.csdn.net/wulianghuan/article/details/44567001。
ListView中的CheckBox
若在ListView的Item中有CheckBox扒怖,而這個時候在Adapter中我們又設置了各個Item中OnCheckedChangeListener
较锡,那么在ListView滑動過程中,或者加載過程中會不斷調用這個方法盗痒,正確的寫法是:
holder.cbItem.setOnCheckedChangeListener(null); //設置為空
if (mList.get(i).is_select()) { //設置其狀態(tài)
holder.cbItem.setChecked(true);
} else {
holder.cbItem.setChecked(false);
}
//設置狀態(tài)變化監(jiān)聽事件
holder.cbItem.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
mItemContentClickListener.selectGoods(i, isChecked);
}
});
需要注意的setOnCheckedChangeListener方法
該方法不僅在我們點擊的時候會調用蚂蕴,而且在調用setChecked
的時候也會被調用,正如其名字的意思俯邓,但是我們在開發(fā)中經常會忽略掉setChecked
會調用該方法的事情骡楼,導致系統(tǒng)出現(xiàn)Bug。
mSelectAll.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
showLog("setOnCheckedChangeListener");
}
});
如果只是需要在點擊的時候回調稽鞭,那還是設置setOnClickListener
監(jiān)聽吧鸟整。
Adapter里數(shù)據引用改變導致數(shù)據不改變的問題
我們通過初始化Adapter設置mGoodList數(shù)據在ListView中顯示:
GoodsListAdapter goodsListAdapter=new GoodsListAdapter(this,mGoodsList);
mListView.setAdapter(goodsListAdapter);
當我們數(shù)據改變時,容易犯一下錯誤:
mGoodsList=mOtherList;
goodsListAdapter.notifyDataSetChanged();
正確的應該是:
mGoodsList.clear();
mGoodsList.addAll(mOtherList);
goodsListAdapter.notifyDataSetChanged();
原因是在我們new GoodsListAdapter(...)
已將mGoodsList的引用傳遞給Adapter朦蕴,如果mGoodsList=mOtherList
這種方法給mGoodsList賦值是不成功的篮条,賦給mGoodsList的是新的引用弟头,但Adapter卻還保留原來的引用。
SQLite里存儲INTEGER數(shù)據
在創(chuàng)建表時涉茧,將某一字段類型設置為INTEGER赴恨,如果存儲00311104035001這樣的數(shù)據,SQLite真正存儲的值會變?yōu)?11104035001伴栓。若要避免這種錯誤伦连,可選擇VARCHAR類型。
APP升級要留一條后路
即強制升級钳垮,因為開發(fā)中總會遇到這種需求惑淳;
浮點數(shù)或雙精度計算時要考慮保留小數(shù)點后的位數(shù)
之前做計算時沒有考慮這個,導致有些計算的結果是個無線循環(huán)小數(shù)扔枫,如:128.6999999...汛聚,以下是個方法:
public String getResult(double num){
BigDecimal input = new BigDecimal(num);
double result = input.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
return String.valueOf(result);
}
ListView設置setOnItemClickListener點擊沒反應
問題一般是由于ListView中的ItemView里有Button、Checkbox短荐、ImageView等控件倚舀,導致點擊ItemView時焦點其他控件攔截了,要解決此問題忍宋,只需要在控件上設置android:focusable="false"痕貌。
DatePickerDialog的顯示的問題
我們輸入的對話框初始日期是2017-4-2,但是顯示的對話框卻是2017-5-2糠排,而選出的日期是4月舵稠,這明顯會誤導用戶。所以我們需要做些處理入宦,在初始的月份-1哺徊,在回調的結果里+1,這就能達到我們想要的效果乾闰。
int yearParam=2017;
int monthParam=4;
int dayParam=2;
new DatePickerDialog(MainActivity.this, new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
String result = year + "-" + (monthOfYear+1) + "-" + dayOfMonth;
textView.setText(result);
}
}, yearParam, monthParam-1, dayParam).show();
待續(xù)......