Android開發的一點點小細節
前言
千里之堤毀於蟻穴,一個APP崩潰何嘗也不是這樣呢,其實很多時候都是因爲平時沒有注意一些小細節。現在就來分享下一些我平時開發過程中注意的一些事,當然我最開始也是沒有注意的,從而導致出現了一系列的大問題。
- 使用switch case 不要忘記最後加break來退出。
- ListView的item不能爲fragment,因爲fragment是由fragmentmanage來進行管理,listview的item是由adapter進行管理。
- ListView獲取它的item view是通過 view= (View) listView.getAdapter().getItem(i); i就是對應的位置,如果使用了viewholder,那麼就應該用現在屏幕的那個item的 postion減去我們需要獲取的那個postion。
- java中對象要比較是否相同,一次new出來的情況下比較纔會返回true,否則爲flase
- Cursor正確的遍歷方法
“`
//cursor不爲空,moveToFirst爲true說明有數據
if(cursor!=null&&cursor.moveToFirst()){
do{
}while(cursor.moveToNext);
}
不然容易出現漏掉的數據(我在讀取手機聯繫人和短信的時候就碰到過這種坑)
* 比較兩個list當中不同的元素
public List getDiffElementUseMap(List list1,List list2){
long runtime = System.nanoTime();//開始計時
//利用map中不能有重複元素的特點
Map<String, Integer> map = new HashMap<String, Integer>(list1.size()+ list2.size());
List<String> diffList = new ArrayList<String>();//用於保存兩個list中不同的元素
for (String string : list1) {
map.put(string,flagUnique);//先將list1中元素複製到map中保存
}
for (String string : list2) {
Integer key = map.get(string);// 獲得鍵值
if (key != null) {//如果map中已經存在該元素,說明list1中存在該元素,那麼將其key加1
map.put(string, ++key);
continue;
}else{//如果不存在,則放入map中
map.put(string,flagUnique);
}
}
for (Map.Entry<String, Integer> entry : map.entrySet()){
if (entry.getValue() == flagUnique)//在map中,鍵值爲flagUnique的元素即爲無重複的元素
{
diffList.add(entry.getKey());
}
}
return diffList;
}
* 廣播註冊與反註冊,註銷廣播時要確認該廣播是否註冊
* 獲取LinearLayout寬高度
由於Android程序的運行機制決定了無法再組件類外部使用getWidth和getHeight方法獲得高度和寬度(在自定義組件類中可以實現),必須使用View.getMeasuredWidth和View.getMeasureHeight方法獲得當前組件的寬度和高度,在調用這兩個方法之前,必須調用View.measure方法先測量組件寬度和高度。
如果想直接獲取在佈局文件中定義的組件的寬度和高度,可以直接使用
View.getLayoutParams().width和View.getLayoutParams().height
View view = getLayoutInflater().inflate(R.layout.activity_main, null);
LinearLayout linearlayout = (LinearLayout)view.findViewById(R.id.linearlayout);
//measure方法的參數值都設爲0即可
linearlayout.measure(0,0);
//獲取組件寬度
int width = linearlayout.getMeasuredWidth();
//獲取組件高度
int height = linearlayout.getMeasuredHeight();
“`
*ScrollView嵌套ListView或者RecyclerView,ListView會把上面的佈局頂上去
解決方法,取消掉listview的焦點
lv.setFocusable(false);
* List遍歷優化
for循環
訪問成員變量比訪問本地變量慢得多,如下面一段代碼:
for(int i =0; i < this.mCount; i++) {}
永遠不要在for的第二個條件中調用任何方法,如下面一段代碼:for(int i =0; i < this.getCount(); i++) {}
對上面兩個例子最好改爲:int count = this.mCount; / int count = this.getCount();
for(int i =0; i < count; i++) {}
- 觸摸事件攔截
public abstract void requestDisallowInterceptTouchEvent (boolean disallowIntercept)
子View如果不希望其父View攔截Touch事件時,可調用此方法。當disallowIntercept這個參數爲true時,父View將不攔截。
可以通過getParent.requestDisallowInterceptTouchEvent(true); 基本數據類型轉換成String
把一個基本數據類型轉爲字符串,基本數據類型.toString()是最快的方式、String.valueOf(數據)次之、數據+””最慢初次提交到github上報 failed to push some refs to git此錯誤
- 觸摸事件攔截
出現錯誤的主要原因是github中的README.md文件不在本地代碼目錄中
需要通過下面代碼進行合併
git pull –rebase origin master
然後在提交 git push -u origin master
git回滾任意版本
首先 git reflog 查看全部版本
然後 git reser –hard 版本號 提示 HEAD is now at 版本號 test 代表成功
最後強制提交
git push -f origin master
字符串比較,和判斷字符串是否爲空
比如說我要比較time是否爲字符串1
寫法如下:
if( “1”.equals(time)){
}判斷一個字符是否爲空可以像下面這樣寫
if(TextUtils.isEmpty(time)){
}以上就一些平時開發過程中總結出來的小細節,歡迎大佬們指出一些不足…