一、导入项目时,提示 “invalid project description”

无效的项目描述,应该与ADT版本不同有关。

出错背景:外来源码放在工作区,然后导入Eclipse。

解决方法:外来源码先放在非工作区(如:桌面),然后导入到Eclipse,导入页面勾上 “copy projects to into workspace” 复制一份到工作区。


二、打开Eclipse,提示 “Failed to create the Javae Virtual Machine”

无法创建Java虚拟机

出错背景:系统还原后出现或者感觉莫名其妙出现。实际上应该是环境、配置等发生变化,如果出现这个问题,请回顾之前有做过什么事情,比如安装或者更新JDK,修改过环境变量等等。

解决方法:首先确定JDK已安装,环境变量已配置(JAVA_HOME, Path等),修改后重启系统,我就是这么搞定的。

如果无上述问题,那只能修改 eclipse.ini 文件,请自行选择一种或几种进行尝试。



    1. // 1. 直接删掉虚拟机位置项, -vm 选项  
    2.           
    3. // 2. 添加java虚拟机具体位置,分成两行,例如  
    4. -vm  
    5. C:\Program Files\java\jdk1.6.0_29\bin\javaw.exe  
    6.           
    7. // 3. 减少堆空间的最大值,一般是砍一半  
    8. -Xmx1024m   
    9. -Xmx512m  
    10. -Xmx256m  
    11.           
    12. // 4. 修改JDK版本号,对应你的版本  
    13. -Dosgi.requiredJavaVersion=1.6



    其它补充:

    1、eclipse.ini 文件位置

    windows 位于 eclipse 程序安装目录的根目录

    mac os  eclipse安装目录/Eclipse.app/Contents/MacOS,呃,就是右键应用图标,选“显示包内容“,然后你懂的

    2、如果修改后仍然报错,请确保解决方法第2项写在 -vmgrgs 之前,如果你有写的话

    3、其它eclipse.ini文件相关资料可以参考这里


    三、The connection to adb is down, and a severe error has occured.

    The connection to adb is down, and a severe error has occured.
    You must restart adb and Eclipse.

    windows环境下有此问题,原因是有其它adb进程在运行,eclipse无法启动sdk的adb。 
    一般类似360手机助手、qq手机助手、豌豆荚以及酷狗音乐等可以连接到手机的程序,都有可能开一个adb进程,名字一般叫xxxadb,就是这个搞鬼。

    解决方法:
    首先,打开任务管理器,仔细找一下,干掉这个多余adb进程。为方便起见,最好设置手机助手这类程序不可开机启动。
    接着,打开cmd命令窗口, 输入“adb kill-server”, 然后输入“adb start-server”, 重启一下adb。
    最后,重启eclipse,搞定收工。

    其它补充:
    adb命令需要配置环境变量,如果不想配置,可以cd到adb.exe所在目录,

    或者在adb.exe目录下,按 shift + 鼠标右键,点“在此处打开命令窗口”。


    四、Failed to install *.apk on device 'emulator-5554': timeout

    运行程序安装时,提示模拟器超时

    解决:Mac环境下,可以使用通过重启 adb 重新建立连接,基本上几秒就可以搞定。

    windows环境下重启adb无效,也可能是我等得不够久。直接关闭模拟器,重新 launch。


    模拟器超时时间默认为 5000ms,显然有点短,我们可以手动改大些。

    eclipse下,window >> preferences >> Android >> DDMS >> ADB connection time out (ms) 值修改加大


    其它:重启adb方法,除了上面 “三” 用的命令,还可以在 eclipse 的 Devices 页面 Reset adb。





    五、使用Eclipse 打包apk,提示 conversion to dalvik format failed with error 1
    解决:

    1. 打包前删除bin目录下文件;

    2. clear project;

    3. 确保apk输出目录不带中文字符。


    六、Eclipse android sdk content loader 0

    打开eclipse 后一直显示在加载SDK,卡住了,重启无效

    解决:

    1. 打开 .android 目录,一般在C盘administrator用户目录下;

    2. 删除 cache 目录下的所有文件;

    3. 删除 ddms.cfg 文件;

    4. 重启ecplise。

    参看这里


    七、Gradle project refresh failed error:cause:peer not authenticated

    导入项目后报错,项目使用的Gradle版本和Android studio使用的Gradle版本不一致导致

    修改Build.gradle 为当前使用的版本


    classpath 'com.android.tools.build:gradle:2.1.2'




     异常汇总:

    一、java.lang.RuntimeException: Unable to start activity ComponentInfo{com.xxx.xxx}: java.lang.NullPointerException

    原因1:控件没有初始化直接使用,比如没有new实例,没有 findViewById(R.id),一般错误日志有提示哪个控件。

    原因2:使用 requestWindowFeature() 方法,需要写在 setContentView(layoutId) 方法之前。


    二、android.os.NetworkOnMainThreadException

    原因1:在主线程访问网络。Android 4.0 之前可以在主线程访问,4.0 以后不再支持。

    解决方法1:在 onCreate() 中添加下面代码



    1. protected voidCreate(Bundle savedInstanceState) {  
    2. super.onCreate(savedInstanceState);  
    3. // 添加下面代码  
    4. new StrictMode.ThreadPolicy.Builder()  
    5.             .detectDiskReads().detectDiskWrites().detectNetwork()  
    6.             .penaltyLog().build());  
    7. new StrictMode.VmPolicy.Builder()  
    8.             .detectLeakedSqlLiteObjects().penaltyLog().penaltyDeath()  
    9.             .build());  
    10. }


    解决方法2:在子线程中访问网络


    三、java.util.IllegalFormatConversionException: %d can't format java.lang.String arguments

    原因:提示写得很清楚,String类型的数据不能用%d进行格式。

    出错背景:使用 String.format 时,参数与转换字符对应出错。


    四、android.widget.AbsListView.obtainView(AbsListView.java:2265)

    原因:adapter中的 getView 方法返回null。

    解决:检查是否直接写成 “return null;" 或者代码逻辑异常导致返回null


    五、java.lang.RuntimeException: An erroroccured while executing doInBackground()

    日志提示 doInBackground() 这个方法里有错误。

    原因1:doInBackground() 这个方法运行在工作线程中,不允许做UI显示。检查这个方法,如果有关UI的显示操作,移到onPostExecute() 方法中完成。

    出错背景:使用 AsyncTask 做网络数据请求。


    六、java.lang.IllegalArgumentException: The key must be an application-specific resource id.

    出错背景:使用 view.setTag(int key, Object tag) 时,写成 view.setTag(11, “text”),  这里这个Key应该是一个R.id才行

    解决:在strings.xml 文件中增加id

    1. <!-- tag id -->  
    2. <item type="id" name="key_text"></item>  
    3. <item type="id" name="key_list"></item> 
    4.

    使用时

    view.setTag(R.id.key_text, "text");

    七、java.lang.ClassCastException: android.widget.RelativeLayout$LayoutParams cannot be cast to android.widget.LinearLayout$LayoutParams

    使用背景: View.setLayoutParams(LayoutParams params); 动态修改view的宽高

    日志提示:RelativeLayout.LayoutParams 不能转换为 LinearLayout.LayoutParams, 所以这里应该改为LinearLayout 的LayoutParams

    解决:使用 View.setLayoutParams(LayoutParams params) 时,view的父控件是什么布局,就应该使用什么布局的LayoutParams

    其它:当同一页面中有两个不同的View使用不同的LayoutParams时,写上LayoutParams的类名可以有效减少失误


    1. // 写法一, 当使用多个不同的LayoutParams时易出错  
    2. LayoutParams lpLayoutParams1 = new LayoutParams(100, 100);   
    3. // 写法二,指明是什么布局下的LayoutParams, 避免失误  
    4. LinearLayout.LayoutParams lpLayoutParams2 = new LinearLayout.LayoutParams(100, 100);


    八、java.lang.IllegalStateException: Can't change tag of fragment *

    出错背景:使用viewPager.setAdapter(new MyFragmentPagerAdapter(getSupportFragmentManager(), fragmentList));

    使用ViewPager加载多个Fragment页面,这里要为每个Fragment创建一个实例,再加载到列表中

    若重复加载可能出现此异常


    九、java.lang.UnsupportedOperationException: Can't convert to dimension: type=0x1

    出错背景:做分辨率适配后出现

    原因:某个分辨率下,找不到对应的 dimens 值,比如可能没有适配到小分辨率的手机


    十、java.lang.NoSuchMethodError: android.widget.RelativeLayout.setBackground

    使用 RelativeLayout.setBackground 时出现

    查看官方文档,setBackground 需要API 大于等于16,API小于16,可以使用 setBackgroundDrawable


      1. if (Build.VERSION.SDK_INT >= 16) {  
      2.     layout.setBackground(drawable);  
      3. } else {  
      4.     layout.setBackgroundDrawable(drawable);  
      5. }


      十一、java.lang.NoSuchMethodError: android.app.Notification$Builder.build

      同上,使用需要API 大于等于16,低于16 可以导入android v4 支持包

      android.support.v4.app.NotificationCompat.Builder


      十二、java.lang.IllegalStateException: Cannot add header view to list -- setAdapter has already been called.

      ListView 当有设置 header时,注意要先 addHeaderView() ,然后再 setAdapter()


        1. myList.addHeaderView(header); // 先  
        2. myList.setAdapter(dataAdapter);  // 后


        十三、android xml 中的 java.lang.IndexOutOfBoundsException: 

        如果是java代码报错,则是数组下标越界,一般容易解决。

        偶然一次是 android xml 文件报错,比较特殊,经查,确认是点9图片的问题

        这里的xml 文件引用了一个不规范的点9图片,替换图片即可解决。


        常见的不规范问题:

        1、后缀名没有 .9

        2、四周的拉伸的标记有缺


        十四、Installation error: INSTALL_FAILED_CPU_ABI_INCOMPATIBLE

        背景:使用Genymotion出现此问题 

        原因:Genymotion 移除了对ARM Library 的支持,而很多应用都会用到ARM

        解决:

        方法一:为Genymotion 安装ARM Libr 支持,点这里下载,或者这里下载,直接将压缩包拖到Genymotion模拟器即可安装。

        方法二:使用android studio 或者 Intellij IDEA 可以通过设置避免该问题,参看这里。


        Genymotion 也移除了对Google Play 的支持,要安装Google play 

        参看这里 http://forum.xda-developers.com/showthread.php?p=47502902#post47502902


        十五、Multiple annotations found at this line:
        - error: Multiple substitutions specified in non-positional format; did you mean to add the formatted="false" 
        attribute?

        在XML 文件出现,使用多个转换符时,需要标注是第几个 参考这里

        例如:

        1. // 报错  
        2. <string name="test">%s 价格%.2f元</string>  
        3. // 需修改为  
        4. <string name="test">%1$s 价格%2$.2f元</string>


        十六、ListView OnItemClickListener 事件不响应

        A. 列表项点击事件不响应,如果代码正常,可能是 listView item layout  中含有button 或 radioButton 等控件。

        button 等控件会优先获取到 focus,影响到列表项点击响应

        解决:

        方法一:为 button等控件设置 focusable="false"

        方法二:为 item layout 根布局设置 descendantFocusability="blocksDescendants"


          1. // 设置在Button等能够获取focus的控件上  
          2. android:focusable="false"  
          3. // 设置在item 根布局中  
          4. android:descendantFocusability="blocksDescendants"


          B. 相反,如果 listView item layout 没有button等控件,检测 item layout 是不是写了


          android:clickable="true"

          十七、java.lang.ExceptionInInitializerError   ......

          Caused by: java.lang.UnsatisfiedLinkError: Couldn't load lept: findLibrary returned null

          引用缺失

          原因:

          1. libs 中的 jar 包缺失,如果文件夹名为 lib ,请改为 libs

          2.  libs / armeabi 下 .so 文件缺失


          十八、shape stroke 设置虚线变实线问题

          android 4.0 后有此问题,参看这里

          解决:关闭硬件加速

          在使用虚线的控件设置 android:layerType="software" 即可


          十九、android.util.AndroidRuntimeException: { what=11 when=-91ms } This message is already in use.

          使用handler 发送消息时,需要使用新的Messsage


          二十、android.view.InflateException: You must specifiy a layout in the include tag: <include layout="@layout/layoutID" />

          使用自定义布局时候,确保使用为 


          <include layout="@layout/your_layout" />


          而不是

          <include android:layout="@layout/your_layout" />