Android常見問題

1.問題描述:

Listview中adapter的刷新(notifyDataSetChanged())數據突然消失問題.

解決方法:

我們的adapter中的一個List<T>參數,而在調用adapter的一層(即adapter的上一層)對List<T>進行賦值操作,而不是t.add(T)或是t.remove(T)這樣的操作時,我們在adapter.notifyDataSetChanged();的時候就會出現數據全部清空了。這是因爲我們對傳入adapter的參數進行了一個全體賦值,而List<T>參數中那些未被修改的數據也一樣被重新修改(即使數據是一樣的,可實際上對象已經發生了變化)。


2.問題描述:

Listview中adapter的刷新(notifyDataSetChanged())ListView還是沒有任何變化問題.

解決方法:

這種情況一般出現在我們對List<T>的數據要進行一個批量的操作的時候。例如:

[java] view plain copy
 print?在CODE上查看代碼片派生到我的代碼片
  1. for (int i = mPositions.size() - 1; i >= 0; i--) {  
  2.             mPackageInfos.remove((int)mPositions.get(i));  
  3.             mAdapter.notifyDataSetChanged();  
  4.         }  

大家可以看到我這邊是從後往前進行remove的,這是爲了防止先remove了前面的,整個List<T>向前推了一個單位,這樣勢必會出現錯位。倒序刪除是一種比較普遍的刪除算法。

還有一件事情需要注意:t.remove(positicaion)這樣的操作中的positication是int型的,不能是Integer這種類型的。


3.問題描述:

EditText獲得焦點時,擠壓屏幕問題.

當我們點擊某一Activity中的EditText時,我們的某些控件會被擠壓。如果你不是使用比例來控制佈局,那麼你的運氣很好,可能是看不到控件被擠壓。一般來說如果你的一些控件是用的百分比來控制,那麼你的控件很有可能就會出現被擠壓得很扁。

解決方法:

你的Manifest.xml文件可以這樣來寫:

[html] view plain copy
 print?在CODE上查看代碼片派生到我的代碼片
  1. <activity android:name="com.xxxx.xxxActivity"  
  2.             android:windowSoftInputMode="adjustPan" />  


4.問題描述:

對Eclipse中使用4個空格來替換一個Tab鍵的設置方法.

解決方法:

第一步:

點擊 window->preference,依次選擇 General->Editors->Text Editors,選中右側的 insert space for tabs。保存

第二步:

1. Window --> Java --> Code Style --> Formatter --> 選擇右側的Edit --> 

2. 輸入自定義的Profile name

3. 在下方的Tab policy的右側的下拉列表中選擇Spaces only

4. 輸入Indentation size和Tab size的大小均爲4

5. 點擊OK

6. 重啓Eclipse


5.問題描述:

在控制檯啓動和關閉ADB服務.

解決方法:

開啓:adb start-server

關閉:adb kill-server

一般來說,我們必須先在控制檯輸入關閉服務再輸入開啓服務。是爲了避免之前內存中殘留的adb服務干擾。


6.問題描述:

將兩個一位或兩位數顯示成00:00格式.

解決方法:

[java] view plain copy
 print?在CODE上查看代碼片派生到我的代碼片
  1. String.format("%02d", hour) + ":" + String.format("%02d", minute);  


7. 問題描述:

如何控制橫豎屏切換

通過在AndroidManifest.xml中設置activity中的Android:screenOrientation屬性值來實現.
android:screenOrientation屬性,有以下參數可選:
"unspecified":默認值 由系統來判斷顯示方向.判定的策略是和設備相關的,所以不同的設備會有不同的顯示方向.
"landscape":橫屏顯示
"portrait":豎屏顯示
"user":用戶當前首選的方向
"behind":和該Activity下面的那個Activity的方向一致(在Activity堆棧中的)
"sensor":由物理的感應器來決定。如果用戶旋轉設備這屏幕會橫豎屏切換。
"nosensor":忽略物理感應器,這樣就不會隨着用戶旋轉設備而更改了("unspecified"設置除外).


示例 — AndroidManifest.xml中實現:

[html] view plain copy
 print?在CODE上查看代碼片派生到我的代碼片
  1. android:screenOrientation="portrait"  
示例 — Java代碼實現:
[html] view plain copy
 print?在CODE上查看代碼片派生到我的代碼片
  1. setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);  


8.問題描述:

Java/Android中截取從a到b的子字符串

[java] view plain copy
 print?在CODE上查看代碼片派生到我的代碼片
  1. String subString = str.substring(a, b);  


9.問題描述:

SQLite中多級ORDER BY的使用.

SELECT * FROM COMPANY ORDER BY NAME, SALARY ASC;


10.問題描述:

判斷當前是否爲Wi-Fi狀態

解決方案:

[java] view plain copy
 print?在CODE上查看代碼片派生到我的代碼片
  1. public static boolean isWifiNetwork(Context context) {  
  2.         boolean isWifi = false;  
  3.         Context getContext = context.getApplicationContext();    
  4.         ConnectivityManager connectivity = (ConnectivityManager) getContext  
  5.                 .getSystemService(Context.CONNECTIVITY_SERVICE);  
  6.         NetworkInfo[] info = null;  
  7.         if (connectivity != null) {  
  8.             info = connectivity.getAllNetworkInfo();  
  9.             if (info != null) {  
  10.                 for (int i = 0; i < info.length; i++) {  
  11.                     if (info[i].getTypeName().equals("WIFI") && info[i].isConnected()) {  
  12.                         isWifi = true;  
  13.                         break;  
  14.                     }  
  15.                 }  
  16.             }  
  17.         }  
  18.         getContext = null;  
  19.         connectivity = null;  
  20.         info = null;  
  21.           
  22.         return isWifi;  
  23.     }  

11.問題描述:

JNI開發時,Unresolved inclusion

我在.c和.h文件中使用#include <jni.h>時,出現了Unresolved inclusion: <jni.h>的報錯信息。
解決方案:
原因是在eclipse編輯環境中沒有找到對應的include中的文件。解決方法是將包含該文件的include目錄作爲新的linked folder加入工程中。具體方法如下:
1. 右擊工程->New->Folder
2. 對話框中點擊Advanced
3. 選擇Link to alternate location (Linked Folder),選擇需要的include目錄
4. Finish後刷新工程,問題解決。


12.問題描述:

Android寫文件,換行

注意,這裏說的不是在TextView上顯示的文本信息,而是在向文本文件中寫數據時的換行。這裏使用的是"\r\n",如下:

[java] view plain copy
 print?在CODE上查看代碼片派生到我的代碼片
  1. String str = "ABC";    
  2. str += "\r\n";  

13.問題描述:

動態保持當前屏幕的橫豎屏狀態

    這裏不同設置橫豎的地方就在於保持的前提,前提是我們要知道當前屏幕是處於哪種狀態。這種需求一般出現在我們在一個沒有限制橫豎屏的Activity中進行彈框。在彈框的過程中如果我們進行橫豎屏切換,那問題就來了。你可以寫一個小的Demo來觀察一下橫豎屏切換的時候,當前Activity的生命週期,那麼答案就不言而喻了。所以我們要先捕獲屏幕狀態,再去設置當前屏幕的相應狀態。關鍵代碼如下:

[java] view plain copy
 print?在CODE上查看代碼片派生到我的代碼片
  1. int screenState = MainActivity.this.getResources().getConfiguration().orientation;  
  2.                 if (screenState == Configuration.ORIENTATION_LANDSCAPE){  
  3.                     MainActivity.this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);  
  4.                 } else if (screenState ==Configuration.ORIENTATION_PORTRAIT) {  
  5.                     MainActivity.this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);  
  6.                 }  

14. 問題描述:

獲得鍵盤高度

    當我們要去獲知鍵盤是否被打開,有時不是直接去用一個方法獲得鍵盤是否被打開。例如我們可以獲得當前鍵盤的高度,如果超過一定值就認爲被打開了。說到這裏,可能你又會說,那如果鍵盤沒有被打開那還怎麼獲得鍵盤的高度呢?這裏就要再做一次迂迴,計算鍵盤以上控件的高度。因爲我們知道當鍵盤打開後,如果我們設置了當前Activity爲擠壓屏幕屬性,鍵盤就會把Activity的根Layout進行擠壓,高度會變小,不過屏幕的高度不會變。說到這兒,相信大家也都知道該怎麼做了吧。下面時關鍵代碼:

[java] view plain copy
 print?在CODE上查看代碼片派生到我的代碼片
  1. /** 
  2.  * 用於獲得鍵盤的高度 
  3.  */  
  4. rootView.getViewTreeObserver().addOnGlobalLayoutListener(  
  5.     new ViewTreeObserver.OnGlobalLayoutListener() {  
  6.       
  7.     @Override  
  8.     public void onGlobalLayout() {  
  9.                         
  10.         Rect r = new Rect();  
  11.         rootView.getWindowVisibleDisplayFrame(r);  
  12.   
  13.         int screenHeight = rootView.getRootView().getHeight();  
  14.         int KeyboardHeigth = screenHeight - (r.bottom - r.top);  
  15.     }  
  16. });  


15.問題描述:

獲得平板序列號

如果要用一串唯一標識設備的字符串,在手機上相信大家首先想到的可能就是IMEI。不過對於一般的手機來說,這一點恐怕就很難實現了。因爲一般來說,平板中不安裝SIM卡,所以平板中是沒有分配IMEI號碼的。當然,也有一些平板中就有,華爲就是。

解決方案:

[java] view plain copy
 print?在CODE上查看代碼片派生到我的代碼片
  1. public static String getSerialNumber() {  
  2.     returnandroid.os.Build.SERIAL;  
  3. }  


16.問題描述:

替換圖標後運行程序圖標沒有被替換

解決方案:

遇到這種情況一般來說就是你沒有替換掉所有分辨率下的圖標,這時只需要重新替換掉所有圖標即可。不過今天我也遇到了替換圖標失效的問題,我項目中所有分辨率下的圖標均已替換,可是還是不行。原來是因爲我們的手機會有一個緩存機制,它保存了我們原來的那個圖標,不管你怎麼替換肯定都是不行的。現在你要麼是等,要麼是換一臺機器試試。


17.問題描述:

動態限制EditText最長輸入的字符長度

解決方案:

[java] view plain copy
 print?在CODE上查看代碼片派生到我的代碼片
  1. imgSizeEditText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(3)});  


18.問題描述:

動態設置EditText光標位置

解決方案:

[java] view plain copy
 print?在CODE上查看代碼片派生到我的代碼片
  1. imgNameEditText.setSelection(32); // 設置光標的位置  


19.問題描述 :

動態獲得控件的寬和高

解決方案:

就拿RelativeLayout來說明一下吧

[java] view plain copy
 print?在CODE上查看代碼片派生到我的代碼片
  1. RelativeLayout mShowLayout = (RelativeLayout) findViewById(R.id.main_relative_layout);  
  2. mShowLayout.measure(00);  
  3. Toast.makeText(this"w = " + mShowLayout.getMeasuredWidth() + ", h = " + mShowLayout.getMeasuredHeight(),  0).show();  


20.問題描述:

格式化日期,出現未被格式化的內容(如:1997-01-01 HH:12:00)

出現上述問題的原因可能是因爲我們使用下面這樣的語句來格式化我們的日期文本
textView.setText(DateFormat.format("yyyy-MM-dd HH:mm:ss", System.currentTimeMillis()).toString());
解決方案:
SimpleDateFormat sDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

textView.setText(sDateFormat.format(new Date(System.currentTimeMillis())));



1.問題描述:

以某一觸發喚醒屏幕

解決方案:

[java] view plain copy
 print?在CODE上查看代碼片派生到我的代碼片
  1. public static void wakeUpAndUnlock(Context context){  
  2.         KeyguardManager km= (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE);  
  3.         KeyguardManager.KeyguardLock kl = km.newKeyguardLock("unLock");  
  4.           
  5.         // 解鎖  
  6.         kl.disableKeyguard();  
  7.           
  8.         // 獲取電源管理器對象  
  9.         PowerManager pm=(PowerManager) context.getSystemService(Context.POWER_SERVICE);  
  10.           
  11.         // 獲取PowerManager.WakeLock對象,後面的參數|表示同時傳入兩個值,最後的是LogCat裏用的Tag  
  12.         PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.SCREEN_DIM_WAKE_LOCK, "bright");  
  13.           
  14.         // 點亮屏幕  
  15.         wl.acquire();  
  16.           
  17.         // 釋放  
  18.         wl.release();  
  19.     }  
注:其中,解鎖步驟可以省略。這種情況下,就只是點亮你的屏幕而不會解鎖了。


2.問題描述:

除掉Actionbar最左側的箭頭

注意,這個最左側的的箭頭可不是actionbar的icon。如果你去設置它的icon,這樣就會導致既有icon也有箭頭。

解決方案:

[java] view plain copy
 print?在CODE上查看代碼片派生到我的代碼片
  1. getActionBar().setHomeAsUpIndicator(drawable);  
上面的這種方法是適用於API18,而對於API小於18的代碼則是不適用的。需要做更多的邏輯。如下:

[java] view plain copy
 print?在CODE上查看代碼片派生到我的代碼片
  1. public static void changeActionBarHomeUpDrawable(Activity activity, int rid) {  
  2.         Drawable homeUp = activity.getResources().getDrawable(rid);  
  3.         final View home = activity.findViewById(android.R.id.home);  
  4.         if (home == null) {  
  5.             // Action bar doesn't have a known configuration, an OEM messed with things.  
  6.             return;  
  7.         }  
  8.   
  9.         final ViewGroup parent = (ViewGroup) home.getParent();  
  10.         final int childCount = parent.getChildCount();  
  11.         if (childCount != 2) {  
  12.             // No idea which one will be the right one, an OEM messed with things.  
  13.             return;  
  14.         }  
  15.   
  16.         final View first = parent.getChildAt(0);  
  17.         final View second = parent.getChildAt(1);  
  18.         final View up = first.getId() == android.R.id.home ? second : first;  
  19.   
  20.         if (up instanceof ImageView) {  
  21.             ImageView upIndicatorView = (ImageView) up;  
  22.             upIndicatorView.setImageDrawable(homeUp);  
  23.         }  
  24.     }  


3.問題描述:

Android Private Libraries缺失

如果你的Android Private Libraries是你誤刪除的話,你可以通過下面的方法1恢復。如果你的項目無原無故的缺失了Android Private Libraries,那麼你可以使用下面的方法2修復。

1. 在項目上點擊右鍵,點擊Android Tools -> Fix Project Properties 即可
2. android-support-v4重複,刪除一個即可


4.問題描述:

Arrays.copyOfRange在低版本的Android中出現NoSuchMethodError異常

對於這個問題的解釋,可能要歸結於API版本之間的兼容性了。

解決方案:

我的解決方法就是直接重寫了這個方法。非常簡單粗暴的一個方法,而且很有效。下面是對於Array的一些常用方法的示例源碼:

http://commons.apache.org/proper/commons-lang/apidocs/src-html/org/apache/commons/lang3/ArrayUtils.html


5.問題描述:

ListView與動態顯示的底部操作欄

你是否遇到過這樣的一個問題:你有一個始終位於屏幕底部的Layout,還有一個ListView,它是始終位於屏幕的頂部。當ListView的item過多時,下面的部分item就會被攔住,或是把底部的Layout攔住。

解決方案(一):

對於上面的問題,可能你已經嘗試過,使用讓Listview位於Layout上方,或是ListView同時位於屏幕頂部和Layout上方。可是嘗試過後就會是沮喪的。下面我就分享一個我的技巧:在Layout的外部再套一層Layout,高度爲wrap_content。如下:

[java] view plain copy
 print?在CODE上查看代碼片派生到我的代碼片
  1. <pre name="code" class="html"><?xml version="1.0" encoding="utf-8"?>  
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent" >  
  5.   
  6.     <ListView  
  7.         android:id="@+id/listView1"  
  8.         android:layout_width="match_parent"  
  9.         android:layout_height="wrap_content"  
  10.         android:layout_above="@+id/container_relativeLayout"  
  11.         android:layout_alignParentTop="true"  
  12.         android:layout_centerHorizontal="true" >  
  13.     </ListView>  
  14.   
  15.     <RelativeLayout  
  16.         android:id="@+id/container_relativeLayout"  
  17.         android:layout_width="wrap_content"  
  18.         android:layout_height="wrap_content"  
  19.         android:layout_alignParentBottom="true" >  
  20.   
  21.         <LinearLayout  
  22.             android:layout_width="match_parent"  
  23.             android:layout_height="wrap_content"  
  24.             android:gravity="center_horizontal" >  
  25.   
  26.             <TextView  
  27.                 android:id="@+id/textView1"  
  28.                 android:layout_width="wrap_content"  
  29.                 android:layout_height="wrap_content"  
  30.                 android:text="Bottom Layout" />  
  31.         </LinearLayout>  
  32.     </RelativeLayout>  
  33.   
  34. </RelativeLayout>  



注:可能你會覺得這樣是多此一舉。因爲我可以把ListView的高度設置成match_parent或是fill_parent,再位於Layout之上。這種方式只是適合於,Layout不會被Gone的情況。這裏是一個值得注意的地方。

解決方案(二):

可能你會覺得方案一太過繁瑣了,那麼你可以使用Relayout的另一個屬性:layout_alignWithParentIfMissing

[html] view plain copy
 print?在CODE上查看代碼片派生到我的代碼片
  1. android:layout_alignWithParentIfMissing="true"  


6.問題描述:

has leaked window com.android.internal.policy.impl.PhoneWindow$ that was originally added here

大致的意思是存在窗口句柄泄露,即未能及時銷燬某個PhoneWindow。其實存在這麼一種情況,即因我們在非主線程中的某些操作不當而產生了一個嚴重的異常,從而強制當前Activity被關閉。而在關閉的同時,卻沒能及時的調用dismiss來解除對ProgressDialog等的引用,從而系統拋出了標題中的錯誤,而掩蓋了真正導致這個錯誤的異常信息。

解決方案:

重寫Activity/Fragment的onDestroy方法,在方法中調用dismiss來解除對ProgressDialog等的引用。


7.問題描述:

Android判斷是否能真正上網

普通方法不能判斷外網的網絡是否連接,比如連接上局域網

解決方案:

[java] view plain copy
 print?在CODE上查看代碼片派生到我的代碼片
  1. public static final boolean ping() {  
  2.   
  3.         String result = null;  
  4.         try {  
  5.             String ip = "www.baidu.com"// ping 的地址,可以換成任何一種可靠的外網  
  6.             Process p = Runtime.getRuntime().exec("ping -c 3 -w 100 " + ip); // ping網址3次  
  7.               
  8.             // 讀取ping的內容,可以不加  
  9.             InputStream input = p.getInputStream();  
  10.             BufferedReader in = new BufferedReader(new InputStreamReader(input));  
  11.             StringBuffer stringBuffer = new StringBuffer();  
  12.             String content = "";  
  13.             while ((content = in.readLine()) != null) {  
  14.                 stringBuffer.append(content);  
  15.             }  
  16.   
  17.             // ping的狀態  
  18.             int status = p.waitFor();  
  19.             if (status == 0) {  
  20.                 result = "success";  
  21.                 return true;  
  22.             } else {  
  23.                 result = "failed";  
  24.             }  
  25.         } catch (IOException e) {  
  26.             result = "IOException";  
  27.         } catch (InterruptedException e) {  
  28.             result = "InterruptedException";  
  29.         } finally {  
  30.             Log.d("----result---""result = " + result);  
  31.         }  
  32.         return false;  
  33.     }  


8.問題描述:

獲取手機號碼

解決方案:

[java] view plain copy
 print?在CODE上查看代碼片派生到我的代碼片
  1. private String getPhoneNumber() {  
  2.         TelephonyManager telephonyMgr = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);   
  3.         return telephonyMgr.getLine1Number();   
  4.     }  
添加權限:

[html] view plain copy
 print?在CODE上查看代碼片派生到我的代碼片
  1. <uses-permission android:name="android.permission.READ_PHONE_STATE" />  


9.問題描述:

lost serialVersionUID

在開發過程中,有時我們會遇到“The serializable class CommonException does not declare a static final serialVersionUID field of type long”這樣的一個報警異常。類似下面這樣的:


我們需要這個值的原因是我們要把這個值永久地保存在一個磁盤上,通常是一個文件中。還有一點是我們要把這個對象在網絡中傳輸。

解決方案:

add上面的3 quick fixes available中的一個。通常是去add第二個。


10.問題描述:

如何隱藏底部狀態欄(System Bar)

底部導航欄如下:


隱藏方式:

在onCreate中添加如下代碼:

[java] view plain copy
 print?在CODE上查看代碼片派生到我的代碼片
  1. getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);  

11.問題描述:

獲得屏幕在旋轉過程中的旋轉角度

這裏我們獲得的不只是橫屏還是豎屏的問題。而是更細一點的區分,比如橫屏中的是和左旋轉了90度,還是向右旋轉了90.解決方案如下:

[java] view plain copy
 print?在CODE上查看代碼片派生到我的代碼片
  1. WindowManager manager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);  
  2. mRotation = manager.getDefaultDisplay().getRotation();  

12.問題描述:

Installation error: INSTALL_FAILED_VERSION_DOWNGRADE


  安裝新的Apk時,出現以上報錯信息。這是是因爲Manifest中的android:versionCode屬性,手機裏APP的versionCode高於將要安裝的APP。

解決方案:

  1.卸載原來的Apk

  2.將當前的Apk的versionCode屬性值修改到比手機中Apk的versionCode屬性值大即可。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章