Android常見問題集錦

此文章轉載來源於http://www.huwei.tech/2016/05/28/Android%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98%E9%9B%86%E9%94%A6/點擊打開鏈接



Android常見問題集錦


前言:在開發中,每個人或多或少會遇到各種各樣的問題,有些問題依據代碼思路調試就可以定位出來,而大部分的問題都是經驗性問題,遇到過就很容易解決,但在第一次遇到時往往會花費大量時間來定位問題。針對此種情況,下文把做開發以來遇到的經典問題整理出來,希望對有需要的朋友有所幫助!

注:此文後續會同步更新最新的問題哦!


一、代碼類

1、Java工程中調用Android庫出現“Stub!”錯誤

描述:控制檯顯示錯誤:Exception in thread “main” java.lang.RuntimeException: Stub!
原因:在Java工程中嘗試使用Android庫中的org.json.JSONObject類,在執行時出現“Stub!”錯誤,Android工程中無法執行java的main函數相似,Android工程和Java工程還有一定的差異,不能混用他們的庫,和函數入口方法。
解決:將執行的代碼,移植到在Android工程可以正確執行!

2、使用shape的同時能通過代碼修改shape的顏色屬性

描述:有時會遇到這種需求:不同狀態的背景標識不同,並且背景有特定的shape樣式。
原因:一般的shape文件都是在xml中固定好顏色,從而需要在代碼中修改shape文件中的顏色值。
解決:直接通過控件獲取該控件的背景,通過更改背景顏色從而更改shape文件中的顏色,代碼如下所示:

1
2
GradientDrawable gradientDrawable = (GradientDrawable)view.getBackground();
gradientDrawable.setColor(color);

3、Failure [INSTALL_FAILED_OLDER_SDK]

描述:編譯的時候,報Failure [INSTALL_FAILED_OLDER_SDK]錯誤。
原因:一般是系統自動幫你設置了compileSdkVersion,且版本過高導致的錯誤。
解決:修改build.gradle下的compileSdkVersion xxx爲compileSdkVersion 19(或者你本機已有的SDK即可).

4、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了,具體代碼如下:

1
2
3
4
5
6
7
8
9
10
11
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;
}
}
};

1
popupHandler.sendEmptyMessageDelayed(0, 1000);

5、使用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)。

6、Application does not specify an API level requirement

描述:編譯時報警告:Application does not specify an API level requirement!
原因:在AndroidManifest.xml或者build.gradle文件中沒有添加API版本號,不影響運行。
解決:在對應的地方添加上minSdkVersion和targetSdkVersion的版本號就行。

7、Installation error: INSTALL_FAILED_INSUFFICIENT_STORAGE

描述:運行時報錯: Installation error: INSTALL_FAILED_INSUFFICIENT_STORAGE。
原因:一般應用默認安裝都是手機存儲空間,而該設備沒有足夠的存儲空間來安裝應用程序。
解決:一般手機都有SD卡,可以在AndroidManifest.xml文件中設置屬性android:installLocation=”auto”就行了。

8、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錯誤。

9、解決ScrollView嵌套GridView

描述:在開發中用到了需要ScrollView嵌套GridView的情況,由於這兩款控件都自帶滾動條,當他們碰到一起的時候便會出問題,即GridView會顯示不全。
原因:由於父控件是自動根據子控件的大小展示的,所以需要對子控件進行最大化顯示處理。
解決:解決辦法,自定義一個GridView控件,代碼如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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類型的值。

10、Android實現ListView或GridView首行/尾行距離屏幕邊緣距離

描述: ListView或GridView首行/尾行距離失效。
原因: Android上ListView&GridView默認行都是置頂的。
解決:設置ListView或GridView的android:clipToPadding = true,然後通過paddingTop和paddingBottom設置距離就好了。

11、Manifest merger failed : uses-sdk:minSdkVersion 15 cannot be smaller than version 18 declared in library

描述:Manifest merger failed : uses-sdk:minSdkVersion 15 cannot be smaller than version 18 declared in library;Suggestion:use tools:overrideLibrary=”xxx.xxx.xxx” to force usage.
原因:出現這個錯誤一般是引用庫的最低版本高於該工程最低版本;
解決:在AndroidManifest.xml文件中 標籤中添加,其中的xxx.xxx.xxx爲第三方庫包名,如果存在多個庫有此異常,則用逗號分割它們,例如:,這樣做是爲了項目中的AndroidManifest.xml和第三方庫的AndroidManifest.xml合併時可以忽略最低版本限制。

12、跳轉到指定淘寶店鋪出現Getting net::ERR_UNKNOWN_URL_SCHEME while calling telephone number from HTML page in Android

描述:跳轉到指定淘寶店鋪出現如下錯誤:Getting net::ERR_UNKNOWN_URL_SCHEME while calling telephone number from HTML page in Android,提示未知的協議。
原因:淘寶的協議是taobao://,在跳轉前應該做對應判定,如果是網頁需要換成https://協議。
解決:在跳轉淘寶店鋪前需要進行判定,然後使用隱式跳轉到指定店鋪。如果用戶已經安裝了淘寶客戶端,那麼URL前綴爲taobao://,如果沒安裝淘寶客戶端,URL前綴爲https://,具體使用代碼如下:

1
2
3
4
5
6
7
8
Uri uri;
if(ApkUpdateUtil.checkPackage(mContext, "com.taobao.taobao")){
uri = Uri.parse(AppConstant.BEAUTY_NOW_BUY_SCHEME);
} else{
uri = Uri.parse(AppConstant.BEAUTY_NOW_BUY_URL);
}
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);

其中路徑常量如下所示,替換爲自己店鋪的地址就行,

1
2
public static final String BEAUTY_NOW_BUY_URL = "https://shop***";
public static final String BEAUTY_NOW_BUY_SCHEME = "taobao://shop***";

下面則是檢測應用是否安裝的靜態方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
* 檢測該包名所對應的應用是否存在
* @param packageName
* @return
*/
public static boolean checkPackage(Context mContext, String packageName) {
if (packageName == null || "".equals(packageName)){
return false;
}
try {
mContext.getPackageManager().getApplicationInfo(packageName, PackageManager.GET_UNINSTALLED_PACKAGES);
return true;
} catch (PackageManager.NameNotFoundException e) {
return false;
}
}

二、開發工具類

1、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”,也就是不對這個文件做任何修改。

2、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/"}

3、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”,查找出對應的進程名稱,進入任務管理器中關閉就行。

4、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,然後回車換行並保存。

5、android You may want to manually restart adb from the Devices view.

描述:編譯運行時報錯:You may want to manually restart adb from the Devices view.
原因: adb服務出問題導致的,一般需要重啓該服務。
解決:在命令窗口中輸入如下指令:

1
2
adb kill-server
adb start-server

6、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。

7、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以本地爲主,這樣再提交就不會出現衝突。

8、編譯報錯: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的功能,最終配置文件如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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方法先執行。

9、Gradle進行dex遇到內存不夠用的情況

描述:java.lang.OutOfMemoryError: GC overhead limit exceeded;
原因:在Gradle進行dex的可能會遇到內存不夠用的情況;
解決:在build文件的android屬性下配置dexOptions下的javaMaxHeapSize大小即可,我這裏配置2g;

1
2
3
dexOptions {
javaMaxHeapSize "2g"
}

10、提交svn時設置忽略文件無效

描述:在提交SVN時有時總是提示各種已經在.gitignore文件中設置忽略卻無效的文件,如.gradle、.idea、build等文件夾下的文件。
原因:在Share Project to Subversion之前沒有設置相關文件及文件夾的忽略,導致Share Project時全部添加到SVN庫中。
解決:這種情況一般出現在本地已經有工程了,想提交到SVN庫中,但是在第一次Share Project時沒有設置忽略,因爲第一次分享到SVN後就相當於把所有文件都提交到SVN庫中了,這樣不管你後面如何設置忽略都是無效的,因爲SVN庫中已經有這些文件了,所以只有在Share Project之前設置忽略纔會真正忽略,設置忽略的操作步驟如下所示:
打開設置,在下圖所示中找到版本控制忽略文件的條目,點擊右上角的添加按鈕添加忽略就行。最後再點擊菜單欄中的VCS,選擇Import into Version Control,再選擇Share Project(Subversion)分享到SVN庫中就可以了。

11、Error:(2, 0) Plugin with id ‘com.github.dcendents.android-maven’ not found

描述:在上傳代碼到jCenter庫時需要配置

1
2
apply plugin: 'com.github.dcendents.android-maven'
apply plugin: 'com.jfrog.bintray'

而在配置後構建出現Error:(2, 0) Plugin with id 'com.github.dcendents.android-maven' not found錯誤。
原因:在使用插件功能時需要配置插件的支持來源及版本。
解決:找到project的build.gradle添加如下配置

1
2
classpath 'com.github.dcendents:android-maven-gradle-plugin:1.3'
classpath "com.jfrog.bintray.gradle:gradle-bintray-plugin:1.0"

完整配置如下:

1
2
3
4
5
6
7
8
9
10
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.5.0'
classpath 'com.github.dcendents:android-maven-gradle-plugin:1.3'
classpath "com.jfrog.bintray.gradle:gradle-bintray-plugin:1.0"
}
}

然後重新構建即可。

12、 Failed to apply plugin [id ‘com.github.dcendents.android-maven’],Could not create plugin of type ‘AndroidMavenPlugin’.

描述:在使用Android Studio2.2時需要將gradle插件版本更新爲classpath 'com.android.tools.build:gradle:2.2.0',構建工具版本更新爲distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip,而在使用上傳代碼到jCenter功能時報錯:Failed to apply plugin [id 'com.github.dcendents.android-maven'],Could not create plugin of type 'AndroidMavenPlugin'.
原因:AndroidMavenPlugin插件版本配置過低。
解決:將原來的配置

1
2
classpath 'com.github.dcendents:android-maven-gradle-plugin:1.3'
classpath "com.jfrog.bintray.gradle:gradle-bintray-plugin:1.0"

改成如下形式就行:

1
2
classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5'
classpath "com.jfrog.bintray.gradle:gradle-bintray-plugin:1.0"

三、操作類

1、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,至今沒找到怎麼配置,如果有哪位仁兄知道怎麼配置,麻煩評論告知下,萬分感謝!

2、虛擬按鍵影響界面全屏顯示

描述:在android4.0及其以上的版本中,出現了一個很屌的東西,叫做Navigation Bar,它和Status Bar一上一下相互交映,影響了我們的全屏。
原因:全屏顯示時有時需要隱藏導航欄和虛擬按鍵,而虛擬按鍵是會根據你的觸摸顯示出來的,所以需要添加監聽,在出現時直接強制隱藏。
解決:直接在當前Activity中添加如下代碼就行:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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);
}
};

1
2
3
4
5
6
7
8
9
10
11
12
13
@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
}
});
}

3、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”的屬性就好了。

4、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。
原因:該手機已經啓動了相同名字的應用。
解決:關閉運行的應用重試就行。

5、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了。

6、Android程序啓動界面的短暫黑屏

描述:默認的情況下,android 程序啓動時,會有一個黑屏的時期。
原因:系統默認的主題背景爲黑色導致的。
解決:只要在入口activity加上android:theme=”@android:style/Theme.Translucent” 就可以解決啓動黑屏的問題。

7、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並設置環境變量

1
2
3
$ curl "http://php.webtutor.pl/en/wp-content/uploads/2011/09/repo"> ~/bin/repo
$ chmod a+x ~/bin/repo
$ PATH=~/bin:$PATH

下載android源碼

1
2
3
4
$ mkdir WORKING_DIRECTORY
$cd WORKING_DIRECTORY
$ repo init -u git://codeaurora.org/platform/manifest.git -b gingerbread
$ repo sync

8、ListView取消點擊效果

描述:用LIstView呈現的數據,類似於靜態的那中,但是不要點擊效果,默認的就是點擊一下顯示成橙黃色
原因:主要是實現點擊沒效果,其實是有效果只不過是透明給掩蓋了
解決:在listview佈局屬性中添加如下屬性android:listSelector=”@android:color/transparent”;

9、Didn’t find class “com.android.tools.fd.runtime.BootstrapApplication”

描述:提供的安裝包在部分手機上安裝點擊後直接崩潰,提示Didn’t find class “com.android.tools.fd.runtime.BootstrapApplication”這樣的錯誤
原因:Instant Run不支持5.0以下系統
解決:
方法一:直接Clean工程,再重新打包
方法二:禁止Instant Run功能,按照如下步驟操作即可:File –> Settings–>Build,Execution,Deployment –>Instant Run —> 不勾選 “Enable instant run”
方法三:修改編譯環境,將相關的版本信息調低
①、將classpath 'com.android.tools.build:gradle:2.2.0'修改爲classpath 'com.android.tools.build:gradle:1.2.3'

②、將buildToolsVersion '23.0.2修改爲buildToolsVersion "21.1.2"

③、找到.idea/gradle.xml文件,將<option name="gradleHome" value="$APPLICATION_HOME_DIR$/gradle/gradle-2.8" />修改爲<option name="gradleHome" value="$APPLICATION_HOME_DIR$/gradle/gradle-2.4" />
出現如上問題,一般第一種方法都能解決,如果不行,禁用Instant Run功能即可,一般第三種方法不推薦使用。



發佈了16 篇原創文章 · 獲贊 37 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章