Android大坑集锦

一、 ImageView.setImageUri(Uri)显示不出图片

网上有这样的各种解决方案:

  1. ****将targetSdkVersion给注释掉
  2. targetSdkVersion和minSdkVersion保持一致
  3. 设置可见性:setVisibility(View.VISIBLE)

这些方法有的可以,有的不行,或许跟版本有关,或许Android本身不是很支持用setImageUri从网上获取图片吧!与其煞费苦心让这个方法有效,不如用ImageLoader来加载网上图片 吧!

二、 apk无法安装

  • The currently selected variant "debug" uses split APKs...

解决方法

在build.gradle(app)文件的defaultConfig里面添加如下代码:

ndk {
    abiFilters 'armeabi'// 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64', 'mips', 'mips64'
}
build.gradle(Module:app)

添加好以后,sync now即可。若依然出现这样的问题,可尝试重启Android Studio,若问题依旧,那我也不知道了-_-#,可以试着修改一下abiFilters的参数。

三、 DrawerLayout must be measured with MeasureSpec.EXACTLY

这个问题出现的原因多是:
多个可滑动的控件在同一个布局界面中嵌套使用,导致滑动冲突,因而Android错误地计算了内层的可滑动控件的尺寸。

解决方法

重写控件的onMeasure 方法

public class WrapContentRecyclerView extends RecyclerView {
    public WrapContentRecyclerView(Context context) {
        super(context);
    }
    public WrapContentRecyclerView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }
    public WrapContentRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }
    @Override
    protected void onMeasure(int widthSpec, int heightSpec) {
        widthSpec = MeasureSpec.makeMeasureSpec(
                MeasureSpec.getSize(widthSpec), MeasureSpec.EXACTLY);
        heightSpec = MeasureSpec.makeMeasureSpec(
                MeasureSpec.getSize(heightSpec), MeasureSpec.EXACTLY);
        super.onMeasure(widthSpec, heightSpec);
    }
}

四、 RecyclerView显示不了数据

RecyclerView 需要重新设置一下LayoutManger才可以显示:

// 计算RecyclerView的大小,可以显示器内容
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));

五、 java.lang.IllegalStateException: RecyclerView has no LayoutManager

这个问题的原因是:
在RecyclerView中添加其他控件,如这样:



    


比如我实现RecyclerView的上拉加载功能,滑动到列表最底端,会出现“点击加载更多”,每次执行到这里的时候,就会出现RecyclerView has no LayoutManager

解决方法

// 避免出现RecyclerView has no LayoutManager的错误
mRecyclerView.setHasFixedSize(true);
// 计算RecyclerView的大小,可以显示其内容
mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));

六、 Android Studio的LogCat无法打印信息

关掉手机或模拟器中运行的应用,重新打开应用即可。

七、 Error install apk

**方法一: 关闭Instant Run;方法一未解决,详见方法二

方法二:由于NDK默认支持的系统框架与调试的机子不符,可在build.gralde(Module:app)文件中合适的位置添加如下代码:

android {
    defaultConfig {
        ndk {
            abiFilters 'armeabi', 'armeabi-v7a', 'x86'//, 'arm64-v8a', 'x86_64', 'mips', 'mips64'
        }
    }
}

若方法二未解决,详见方法三

方法三:拔掉手机,重插并重启Android Studio。
若方法三不行,建议你去买彩票吧!中了五百万就可以不用苦逼地写代码了。

八、 'int android.view.View.getImportantForAccessibility()' on a null...'

其详细报错信息是:

java.lang.NullPointerException: 
Attempt to invoke virtual method 'int android.view.View.getImportantForAccessibility()' 
on a null object reference

这个错误多为ListView或GridView的Adapter中,getView方法返回null的结果。

九、 符号找不到

检查是否存在或R文件导包是否正确。

十、 使用ButterKnife,报控件空指针

这种情况多半是因为ButterKnife没有配置好,如今ButterKnife的最新版本是8.4.0,其配置方法如下:

Step 1: 配置app的build.gradle

apply plugin: 'com.neenbedankt.android-apt'
apply plugin: 'com.jakewharton.butterknife'
...

dependencies {
    ...
    compile 'com.jakewharton:butterknife:8.4.0'    
    apt 'com.jakewharton:butterknife-compiler:8.4.0'
}

Step 2: 配置project的build.gradle

buildscript {
    repositories {
        ...
        mavenCentral()
    }
    dependencies {
        ...
        classpath 'com.jakewharton:butterknife-gradle-plugin:8.4.0'
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
    }
}

Step 3: 在Activity中绑定ButterKnife

ButterKnife.bind(this);

十一、 RecyclerView的item内容填充不满

Recyclerview的item设置的控件宽高,凡是MATCH_PARENTweight="1"+0dp的,通通变成了WRAP_CONTENT!

其效果如图所示:

Android大坑集锦_第1张图片
图片盗自[http://bbs.csdn.net/topics/391937879?page=1](http://bbs.csdn.net/topics/391937879?page=1)

问题解决:

Android大坑集锦_第2张图片
View.inflate(Context, Layout, null)

在填充内容的时候,我使用了View.inflate(Context, Layout, null)方法,如果我们将内容填充的方法改为LayoutInflater.from(Context).inflate(Layout, Parent, false)即可解决该问题。

知其然,知其所以然!我们来看看源码:

Android大坑集锦_第3张图片
View.inflate方法源码
@param root A view group that will be the parent.  Used to properly inflate the* layout_* parameters.

root参数是用来充当我们RecyclerView的item的父容器用的,如果我们将父容器设置为了null,我们的item在设置大小上就没有了参照物,所以内容的现实效果都是WRAP_CONTENT

Android大坑集锦_第4张图片
LayoutInflater.from(Context).inflate()方法源码
If false, root is only used to create the correct subclass of LayoutParams for the root view in the XML.

上面的话说的是,如果我们将参数设置为false,我们RecyclerView的item子项还是有父容器可以依靠的,这个参数root作为父容器用来规范item子项用的。

十二、 Android5.0环境下的CardView无法显示阴影

CardView添加margin,外边距大小与阴影大小一致。

十三、 A TaskDescription's primary color should be opaque

Android的colorPrimary不允许带有alpha值。

十四、 canvas的drawText绘制的文字第一行显示不全

drawText以文字的左下角为坐标,所以绘制的时候需要预留出一个字高的高度。

十五、 Binary XML file line # : Error inflating class

出现这种问题的原因可归结为以下几类:

  1. xml中自定义控件的包名未填写完整
  2. 自定义控件构造方法没有将三个构造函数都实现
//Simple constructor to use when creating a view from code
View(Context context)    
//Constructor that is called when inflating a view from XML
View(Context context, AttributeSet attrs)     
//Perform inflation from XML and apply a class-specific base style
View(Context context, AttributeSet attrs, int defStyle)     
  1. 中间文件没有清理干净
    rebuild或clear一下工程
  2. 资源文件找不到

根据问题的不同具体解决。

十六、 LinearLayoutManager.scrollToPosition滚动无效

大家都知道,要想实现RecyclerView滚动,可以调用scrollToPosition方法,或得到它的LinearLayoutManager,然后调用scrollToPosition来实现,但是今天在同一个方法里调用scrollToPosition,发现上一行执行了,下面的行却未执行?

Android大坑集锦_第5张图片
scrollToPosition方法执行无效

解决方案:
用LinearLayout.scrollToPositionWithOffset(position, 0)来替换scrollToPosition(position)方法。
原因分析:
scrollToPosition有效执行的条件是position对应的Item不在屏幕可见范围内,而scrooToPositionWithOffset无这样的限制,所以本人黄色框框里的代码无法实现滚动的原因是target对应的item在可见范围。

大坑持续挖掘中。。。

你可能感兴趣的:(Android大坑集锦)