11.不要太相信工具,比如Eclipse裡面的斷點遇到多執行緒什麼,經常不起作用/走不到,還有就是如果語句為空的也不會走,這時候別太早下結論斷點地方出錯了,
所以每個工程都應該有日誌的開關,通過檢視日誌來確認,某個路徑是否走到或者某個變數的值,。。。
12.Java中的月份是從0開始的,所以格式化月份的時候,記得在原有的值上加1處理,如:
Calendar calendar = Calendar.getInstance(); if(!TextUtils.isEmpty(dateTimes)){ long milliseconds = WLDateUtils.parseDayTime(dateTimes); calendar.setTimeInMillis(milliseconds); } final int old_year = calendar.get(Calendar.YEAR); final int old_month = calendar.get(Calendar.MONTH); final int old_day = calendar.get(Calendar.DAY_OF_MONTH); mDatePickerDialog = new DatePickerDialog(this, new OnDateSetListener(){ @Override public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { if(year != old_year || monthOfYear != old_month || dayOfMonth != old_day){ String dateTimes = String.format("%04d-%02d-%02d", year, monthOfYear + 1, dayOfMonth);//月份是從0開始的 } } }, old_year, old_month, old_day);
13.設定ListView的分割線,如果不是圖片的話,應注意順序:
mListView = new ListView(this); mListView.setCacheColorHint(0); mListView.setBackgroundDrawable(null); mListView.setDivider(getResources().getDrawable(R.drawable.list_divider)); mListView.setDividerHeight(2); 其中: <drawable name="list_divider">#00CCCC00</drawable>
即 setDividerHeight 函式應該在setDivider之後,否則這個分割線無效。
14.拼寫錯誤
1)
<uses-permission android:name="android.permission.BLUETOOTH" />
而不是
<user-permission android:name="android.permission.BLUETOOTH" />
而且就算這樣寫錯了,也能編譯通過,只不過安裝的時候不會顯示該APP需要的許可權,當然該APP什麼許可權都沒有申請到。
15.當遇到如下的錯誤的時候(但是直接在PC的瀏覽器輸入地址是沒有問題的),第一個感覺是去驗證下裝置(比如手機是否能聯網) ,而不是去找伺服器端開發人員,質疑網路配置是不是有問題:
10-15 17:03:36.043: E/XXXApp(5660): Connection I/O Exception :java.net.UnknownHostException: Unable to resolve host "www.baidu.com": No address associated with hostname
16.TextView千萬不要被放大,也不要作為將要被放大的父檢視中,否則TextView上的文字四周會出現像毛筆字旁邊的方框,尤其是大螢幕的裝置(比如:電視)很容易看到。
17.selector(XML資源定義)中千萬不要將@null給drawable否則,XML inflate時,會報
android.view.InflateException: Binary XML file ...
的錯誤。解決方法是:採用透明圖代替這個@null
18. 對於像ListView、GridView的上下邊距,如果怎麼設定都達不到效果的時候,可以看看這個clipToPadding的這個屬性,其值預設為false的,保證你看完有相見恨晚的感覺。
19.Java的標準程式碼,也有違反常理的例子,比如Calendar.getInstance(),看這名字,以為是單例項,可看了原始碼,就會發現,其實就是一個靜態的函式,用於建立Calendar物件
public static synchronized Calendar getInstance() { return new GregorianCalendar(); } public GregorianCalendar() { this(TimeZone.getDefault(), Locale.getDefault()); } public GregorianCalendar(TimeZone timezone, Locale locale) { super(timezone, locale); setTimeInMillis(System.currentTimeMillis()); }
20.對於有時偶爾遇到的問題,應該考慮下是否是多執行緒引起的問題,多打LOG,對於可能引起問題的地方,加個同步所看看。
21.使用ViewStub時遇到如下的FC log
E/AndroidRuntime(4441): java.lang.IllegalStateException: ViewStub must have a non-null ViewGroup viewParent E/AndroidRuntime(4441): at android.view.ViewStub.inflate(ViewStub.java:287)
Java程式碼
mAttachViewStub.setVisibility(View.VISIBLE); View view = mAttachViewStub.inflate(); mScreenView = (ScreenView)view.findViewById( R.id.attachment_type_screen);
排查才知道,其實mAttachViewStub.setVisibility(View.VISIBLE)相當於mAttachViewStub.inflate(),所以以上的程式碼相當於重複inflate了ViewStub,導致FC。
以上選擇其中一個即可,當然用直接呼叫的話比較好,查詢效率高:
View view = mAttachViewStub.inflate();
mScreenView = (ScreenView)view.findViewById(R.id.attachment_type_screens);
而如下的方法,效率明顯低些,尤其整個頁面的View比較多的時候,因為需要在整個頁面查詢View:
mAttachViewStub.setVisibility(View.VISIBLE);
mScreenView = (ScreenView)findViewById(R.id.attachment_type_screens);
22. 千萬不要將原本是JPG格式圖片檔案的副檔名標記為PNG,這樣平常用Eclipse開發的時候沒有報錯,但是一旦用原始碼編譯就會出現問題:
libpng error: Not a PNG file
ERROR: Failure processing PNG image packages/apps/Contact/res/drawable-xxhdpi/title.png
竟而導致以後一堆的:
packages/apps/Contact/res/layout/detail_box.xml:89: error: Error: No resource found that matches the given name (at 'background' with value '@drawable/add_pic_btn_bg').
當然也不要將PNG圖片檔案的副檔名標記為JPG。
23.注意id不要寫重了,尤其是有用include layout 或者位元組寫的控制元件佈局的,通過findViewById找到的是第一個匹配的id;
這個查起來就很麻煩。(20161229)