Android常見問題集錦
Android常見問題集錦(持續更新)SVN:Commit failed(details follow):svn: xxx is scheduled for addition, but is missing
描述:刪除檔案夾後點commit提交,但是提示以下錯誤: “svn: Commit failed (details follow): svn: ‘xxx’ is scheduled for addition, but is missing”。
原因:之前用SVN提交過的檔案,被標記為”add”狀態,等待被加入到倉庫。若此時你把這個檔案刪除了,SVN提交的時候還是會嘗試提交這個檔案,雖然它的狀態已經是 “missing”了。
解決:在命令列下用 “svn revert xxx –depth infinity”,在圖形介面下,右鍵–Revert,選中那個檔案或檔案夾。這樣就告訴SVN把這個檔案退回到之前的狀態 “unversioned”,也就是不對這個檔案做任何修改。 Java工程中調用Android庫出現“Stub!”錯誤
描述:控制台顯示錯誤:Exception in thread “main” java.lang.RuntimeException: Stub!
原因:在Java工程中嘗試使用Android庫中的org.json.JSONObject類,在執行時出現“Stub!”錯誤,Android工程中無法執行java的main函數相似,Android工程和Java工程還有一定的差異,不能混用他們的庫,和函數入口方法。
解決:將執行的代碼,移植到在Android工程可以正確執行! Javadoc中產生亂碼的解決方案
描述:在產生javadoc文檔或者在進行打包時出現“編碼GBK的不可映射字元”錯誤。
原因:因為代碼中有中文注釋的緣故,這個還是比較常見的。
解決:
方式一:通過Android Studio介面操作產生JavaDoc文檔,依次開啟Tools->Generate JavaDoc->Other command line arguments設定為:“-encoding UTF-8 -charset UTF-8”;
方式二:通過配置module中的build.gradle檔案,添加一個如下任務task:tasks.withType(JavaCompile) {
options.encoding = “UTF-8”
},這個構建時不會出現亂碼,但是在查看產生的文檔時會發現顯示會亂碼,找到原因是需要設定charset也為UTF-8,至今沒找到怎麼配置,如果有哪位仁兄知道怎麼配置,麻煩評論告知下,萬分感謝! Failure [INSTALL_FAILED_OLDER_SDK]
描述:編譯的時候,報Failure [INSTALL_FAILED_OLDER_SDK]錯誤。
原因:一般是系統自動幫你設定了compileSdkVersion,且版本過高導致的錯誤。
解決:修改build.gradle下的compileSdkVersion xxx為compileSdkVersion 19(或者你本機已有的SDK即可). 虛擬按鍵影響介面全螢幕顯示
描述:在android4.0及其以上的版本中,出現了一個很屌的東西,叫做Navigation Bar,它和Status Bar一上一下相互交映,影響了我們的全屏。
原因:全螢幕顯示時有時需要隱藏導覽列和虛擬按鍵,而虛擬按鍵是會根據你的觸摸顯示出來的,所以需要添加監聽,在出現時直接強制隱藏。
解決:直接在當前Activity中添加如下代碼就行:
private static Handler sHandler; private final Runnable mHideRunnable = new Runnable() { @Override public void run() { int flags; int curApiVersion = android.os.Build.VERSION.SDK_INT; if (curApiVersion >= Build.VERSION_CODES.KITKAT) { flags = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE; } else { flags = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION; } getWindow().getDecorView().setSystemUiVisibility(flags); } };
@Override protected void onResume() { super.onResume(); sHandler = new Handler(); sHandler.post(mHideRunnable); // hide the navigation bar final View decorView = getWindow().getDecorView(); decorView.setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() { @Override public void onSystemUiVisibilityChange(int visibility) { sHandler.post(mHideRunnable); // hide the navigation bar } }); }
使用shape的同時能通過代碼修改shape的顏色屬性
描述:有時會遇到這種需求:不同狀態的背景標識不同,並且背景有特定的shape樣式。
原因:一般的shape檔案都是在xml中固定好顏色,從而需要在代碼中修改shape檔案中的顏色值。
解決:直接通過控制項擷取該控制項的背景,通過更改背景顏色從而更改shape檔案中的顏色,代碼如下所示:
GradientDrawable gradientDrawable = (GradientDrawable)view.getBackground();gradientDrawable.setColor(color);
Error:Cause: peer not authenticated
描述: Android studio 匯入項目報 Error:Cause: peer not authenticated 異常
原因:主要是gradle版本對應不上導致的
解決:在project下的build.gradle檔案中,將dependencies中的classpath對應的gradle版本改為1.3.0,再將repositories中的jcenter()改為jcenter{url “http://jcenter.bintray.com/“} Popupwindow使用異常:unable to add window–token null is not valid
描述: Popupwindow必須依賴一個view進行彈窗,
void android.widget.PopupWindow.showAtLocation(View parent, int gravity, int x, int y)
調用這個方法就能顯示Popupwindow了,但是有時會碰到這樣一個異常:unable to add window – token null is not valid;is your activity running?
原因:導致這個的原因一般是Activity的onCreate()函數裡面調用了showAtLocation,由於你的popupwindow要依附於一個activity,而activity的onCreate()還沒執行完就需要彈窗肯定會出問題的。
解決:在Handler中進行彈窗,在onCreate中通過延時調用就OK了,具體代碼如下:
private Handler popupHandler = new Handler(){ @Override public void handleMessage(Message msg) { switch (msg.what) { case 0: popupWindow.showAtLocation(findViewById(R.id.rlShowImage), Gravity.CENTER|Gravity.CENTER, 0, 0); popupWindow.update(); break; } } };
popupHandler.sendEmptyMessageDelayed(0, 1000);
ListView點擊條目無響應
描述:開發中很常見的一個問題,項目中的listview不僅僅是簡單的文字,常常需要自己定義listview,自己的Adapter去繼承BaseAdapter,在adapter中按照需求進行編寫,問題就出現了,可能會發生點擊每一個item的時候沒有反應,無法擷取的焦點。
原因:原因多半是由於在你自己定義的Item中存在諸如ImageButton,Button,CheckBox等子控制項(也可以說是Button或者Checkable的子類控制項),此時這些子控制項會將焦點擷取到,所以常常當點擊item時變化的是子控制項,item本身的點擊沒有響應。
解決:使用descendantFocusability來解決,該屬性是當一個為view擷取焦點時,定義viewGroup和其子控制項兩者之間的關係。
屬性的值有三種:
beforeDescendants:viewgroup會優先其子類控制項而擷取到焦點
afterDescendants:viewgroup只有當其子類控制項不需要擷取焦點時才擷取焦點
blocksDescendants:viewgroup會覆蓋子類控制項而直接獲得焦點
通常我們用到的是第三種,即在Item布局的根布局加上android:descendantFocusability=”blocksDescendants”的屬性就好了。 使用shape繪製虛線時,在4.0以上機型上顯示實線
描述:在利用shape繪製虛線時,在Graphical Layout中能正常顯示,但在Android4.0上的機型顯示成了實線。
原因: 4.0以上預設把Activity的硬體加速開啟了,所以我們在Manifest.xml中關掉即可。
解決:在需要顯示的activity中增加如下屬性:android:hardwareAccelerated=”false”,也可以通過從View層級上把硬體加速關掉 view.setLayerType(View.LAYER_TYPE_SOFTWARE, null)。 Application does not specify an API level requirement
描述:編譯時間警示告:Application does not specify an API level requirement!
原因:在AndroidManifest.xml或者build.gradle檔案中沒有添加API版本號碼,不影響運行。
解決:在對應的地方添加上minSdkVersion和targetSdkVersion的版本號碼就行。 Installation error: INSTALL_FAILED_INSUFFICIENT_STORAGE
描述:運行時報錯: Installation error: INSTALL_FAILED_INSUFFICIENT_STORAGE。
原因:一般應用預設安裝都是手機儲存空間,而該裝置沒有足夠的儲存空間來安裝應用程式。
解決:一般手機都有SD卡,可以在AndroidManifest.xml檔案中設定屬性android:installLocation=”auto”就行了。 ActivityManager: Warning: Activity not started, its current task has been brought to the front
描述:用手機調試運行出現如下錯誤:ActivityManager: Warning: Activity not started, its current task has been brought to the front。
原因:該手機已經啟動了相同名字的應用。
解決:關閉啟動並執行應用重試就行。 Failed to fetch URL https://dl-ssl.google.com/android/repository/repository.xml
描述:在開啟SDK Manager時,更新SDK時會出現如下錯誤:Failed to fetch URL https://dl-ssl.google.com/android/repository/repository.xml。
原因: dl-ssl.google.com在大陸封掉了。
解決:修改C:\Windows\System32\drivers\etc\hosts檔案,添加一行:
74.125.237.1 dl-ssl.google.com,儲存並重新自動SDK Manager就OK了。 The connection to adb is down and a severe error has occured解決方案
描述:編譯運行時報錯:The connection to adb is down and a severe error has occured。
原因:其他應用佔用了adb的進程連接埠,只要關閉相關進程就行。
解決:進入dos視窗,輸入netstat -ano|findstr “5037”查看所有佔用5037連接埠的進程ID,再輸入tasklist|findstr “進程ID”,尋找出對應的進程名稱,進入工作管理員中關閉就行。 Android 圖片載入Bitmap OOM錯誤解決辦法
描述: Android載入資源圖片時,很容易出現OOM的錯誤,因為Android系統對記憶體有一個限制,如果超出該限制,就會出現OOM,為了避免這個問題,需要在載入資源時盡量考慮如何節約記憶體,儘快釋放資源等等。
原因: Android系統版本對圖片載入回收的不同:
1、在Android 2.3以及之後,採用的是並發回收機制,避免在回收記憶體時的卡頓現象;
2、在Android 2.3.3(API Level 10)以及之前,Bitmap的backing pixel 資料存放區在native memory, 與Bitmap本身是分開的,Bitmap本身儲存在dalvik heap 中,導致其pixel資料不能判斷是否還需要使用,不能及時釋放,容易引起OOM錯誤,從Android 3.0(API 11)開始,pixel資料與Bitmap一起儲存在Dalvik heap中。
解決:在載入圖片資源時,可採用以下一些方法來避免OOM的問題:
1、在Android 2.3.3以及之前,建議使用Bitmap.recycle()方法,及時釋放資源;
2、在Android 3.0開始,可設定BitmapFactory.options.inBitmap值,(從緩衝中擷取)達到重用Bitmap的目的,如果設定,則inPreferredConfig屬性值會被重用的Bitmap該屬性值覆蓋;
3、通過設定Options.inPreferredConfig值來降低記憶體消耗:
預設為ARGB_8888: 每個像素4位元組. 共32位。
Alpha_8: 只儲存透明度,共8位,1位元組。
ARGB_4444: 共16位,2位元組。
RGB_565:共16位,2位元組。
如果不需要透明度,可把預設值ARGB_8888改為RGB_565,節約一半記憶體。
4、通過設定Options.inSampleSize 對大圖片進行壓縮,可先設定Options.inJustDecodeBounds,擷取Bitmap的外圍資料,寬和高等。然後計算壓縮比例,進行壓縮;
5、設定Options.inPurgeable和inInputShareable:讓系統能及時回收記憶體。
inPurgeable:設定為True,則使用BitmapFactory建立的Bitmap用於儲存Pixel的記憶體空間,在系統記憶體不足時可以被回收,當應用需要再次訪問該Bitmap的Pixel時,系統會再次調用BitmapFactory 的decode方法重建Bitmap的Pixel數組;設定為False時,表示不能被回收。
inInputShareable:設定是否深拷貝,與inPurgeable結合使用,inPurgeable為false時,該參數無意義;True: share a reference to the input data(inputStream, array,etc) 。 False :a deep copy。
6、使用decodeStream代替其他decodeResource,setImageResource,setImageBitmap等方法來載入圖片。
區別:
decodeStream直接讀取圖片位元組碼,調用nativeDecodeAsset/nativeDecodeStream來完成decode,無需使用Java空間的一些額外處理過程,節省dalvik記憶體。但是由於直接讀取位元組碼,沒有處理過程,因此不會根據機器的各種解析度來自動適應,需要在hdpi,mdpi和ldpi中分別配置相應的圖片資源,否則在不同解析度機器上都是同樣的大小(像素點數量),顯示的實際大小不對;
decodeResource會在讀取完圖片資料後,根據機器的解析度,進行圖片的適配處理,導致增大了很多dalvik記憶體消耗;
decodeStream調用過程:decodeStream(InputStream,Rect,Options) -> nativeDecodeAsset/nativeDecodeStream;
decodeResource調用過程:即finishDecode之後,調用額外的Java層的createBitmap方法,消耗更多dalvik記憶體;
decodeResource(Resource,resId,Options) -> decodeResourceStream (設定Options的inDensity和inTargetDensity參數) -> decodeStream() (在完成Decode後,進行finishDecode操作)finishDecode() -> Bitmap.createScaleBitmap()(根據inDensity和inTargetDensity計算scale) -> Bitmap.createBitmap()。
以上方法的組合使用,合理避免OOM錯誤。 解決ScrollView嵌套GridView
描述:在開發中用到了需要ScrollView嵌套GridView的情況,由於這兩款控制項都內建捲軸,當他們碰到一起的時候便會出問題,即GridView會顯示不全。
原因:由於父控制項是自動根據子控制項的大小展示的,所以需要對子控制項進行最大化顯示處理。
解決:解決辦法,自訂一個GridView控制項,代碼如下:
public class MyGridView extends GridView { public MyGridView(Context context, AttributeSet attrs) { super(context, attrs); } public MyGridView(Context context) { super(context); } public MyGridView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int expandSpec = MeasureSpec.makeMeasureSpec( Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, expandSpec); } }
代碼中主要是修改了onMeasure()方法,將大小設定為int類型的最大值,至於為啥需要右移兩位,是因為前兩位表示的是如AT_MOST類型的值。
Android程式啟動介面的短暫黑屏
描述:預設的情況下,android 程式啟動時,會有一個黑屏的時期。
原因:系統預設的主題背景為黑色導致的。
解決:只要在入口activity加上android:theme=”@android:style/Theme.Translucent” 就可以解決啟動黑屏的問題。
Android實現ListView或GridView首行/尾行距離螢幕邊緣距離
描述: ListView或GridView首行/尾行距離失效。
原因: Android上ListView&GridView預設行都是置頂的。
解決:設定ListView或GridView的android:clipToPadding = true,然後通過paddingTop和paddingBottom設定距離就好了。
curl: (6) Couldn’t resolve host ‘android.git.kernel.org’
描述:通過Linux系統下載Android源碼時提示錯誤:curl: (6) Couldn’t resolve host ‘android.git.kernel.org’ 。
原因:因為android.git.kernel.org網站被黑了,所以無法從該網站下載repo和android原始碼了。
解決:換個網址下載,從https://www.codeaurora.org/網站下載android源碼,具體方法如下:
下載repo並設定環境變數
$ curl "http://php.webtutor.pl/en/wp-content/uploads/2011/09/repo"> ~/bin/repo$ chmod a+x ~/bin/repo$ PATH=~/bin:$PATH
下載android源碼
$ mkdir WORKING_DIRECTORY$cd WORKING_DIRECTORY$ repo init -u git://codeaurora.org/platform/manifest.git -b gingerbread$ repo sync
SVN無法讀取current修複方法
描述: SVN提交記錄時出現Can’t read file : End of file found,檔案:repository/db/txn_current、repository/db/current,其中current記錄當前最新版本號碼,txn_current記錄版本庫中版本號碼檔案所存放檔案夾。
原因:在提交檔案時,svn伺服器被強行關閉了,導致版本資訊檔寫入不成功,版本記錄檔案txn_current、current成了亂碼。
解決:重新將正確的版本資訊寫入到current、txn-current檔案,一般最新的那個版本會是錯誤的,只能復原到上一版本。找到最新的版本,一般就是出錯的那個版本,假設出錯的是9010,一般可以從(\Repositories\ProjectName\db\revprops\X),其中的X是裡面的檔案夾名,幾乎所有的版本號碼都能在這些目錄裡找到對應的檔案名稱,找到最大的版本號碼9010,如果用記錄本開啟該檔案是亂碼,應該就是出錯了,那就刪除該檔案,相應的,上一版本的版本號碼就是9009,對應的X一般就是9的檔案夾。更新txn-current,裡面寫上X檔案夾名”9”,然後斷行符號換行並儲存。更新current,裡面寫上9009,然後斷行符號換行並儲存。 android You may want to manually restart adb from the Devices view.
描述:編譯運行時報錯:You may want to manually restart adb from the Devices view.
原因: adb服務出問題導致的,一般需要重啟該服務。
解決:在命令視窗中輸入如下指令:
adb kill-serveradb start-server
Eclipse串連手機後DDMS一直顯示connect attempts的問題
描述: Eclipse串連手機以後DDMS一直顯示connect attempts,報Adb connection Error:An existing connection was forcibly closed by the remote host錯誤。
原因: Eclipse串連問題導致。
解決:添加系統內容變數:進入電腦屬性,點擊進階設定環境變數,新加變數ANDROID_SDK_HOME=D:\android\sdk(D:\android\sdk是android-sdk-windows的位置),Path追加%ANDROID_SDK_HOME%\tools。 Aborting commit:’XXXXXX’remains in conflict
描述:提交SVN代碼時報衝突錯誤:Aborting commit:’XXXXXX’remains in conflict!
原因:在使用SVN時不可避免會出現代碼衝突的問題,如果在更新代碼時出現本地檔案已經刪除,而在SVN上卻被別人修改導致更新出現衝突提交代碼失敗。
解決: Eclipse解決方式如下:
1、右擊工程目錄;
2、選擇Team;
3、選擇Show Tree Conflict(衝突樹);
4、查看衝突列表,右擊衝突檔案;
5、標記為解決。
Android stuio解決方式如下:
1、右擊工程目錄;
2、選擇Sunversion;
3、選擇Commit Files;
4、顯示提交檔案清單,勾選需提交檔案,如果檔案標誌位紅色方框,則表示檔案衝突,直接雙擊衝突檔案進入下一步操作;
5、有兩個選擇,一個為檔案以SVN為主,一個為檔案以本地編寫為主,如果該檔案是需要被刪除的,而本地已刪除,則選擇Accept Yours以本地為主,這樣再提交就不會出現衝突。 編譯報錯:com.android.dex.DexIndexOverflowException:method ID not in [0, 0xffff]:65536
描述:編譯時間報如下錯誤:com.android.dex.DexIndexOverflowException:method ID not in [0, 0xffff]:65536,或者在安裝時失敗,並報錯:dexopt failed on ‘/data/dalvik-cache/data@app@應用程式套件名@classes.dex’ res = 65280(方法數)。
原因:這是由於編譯時間方法數越界和安裝時的dexopt緩衝區大小不夠儲存該方法數導致的。
解決:在Gradle中的build檔案中設定Android SDK Build Tools 21.1及以上版本,再在defaultConfig中設定multiDexEnabled true,接著還需要在dependencies中添加multidex的依賴:compile ‘com.android.support:multidex:1.0.0’,最後還需要在代碼中加入支援multidex的功能,最終設定檔如下所示:
apply plugin: 'com.android.application'android { compileSdkVersion 22 buildToolsVersion "22.0.1"//第一步 defaultConfig { minSdkVersion 15 targetSdkVersion 22 versionCode 1 versionName "1.0" multiDexEnabled true//第二步 } lintOptions { abortOnError false }}dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile com.android.support:multidex:1.0.0//第三步}
其中加註釋部分為該設定所需,在代碼中加入支援multidex功能的方法有如下三種方式:
方式一、在manifest檔案中指定Application為MultiDexApplication;
方式二、讓自訂的Application繼承自MultiDexApplication;
方式三、在自訂的Application中實現attachBaseContext方法,在其中添加如下代碼:MultiDex.install(this),該方法比onCreate方法先執行。