首页 > 技术文章 > 14.安卓中踩过的坑(转)

benchao 2017-09-30 09:46 原文

转载:http://www.jianshu.com/p/117d065685be

1、进度条ProgressBar的使用:

比如在不需要自定义的情况下,显示响应的比例(eg:20/100),则可以使用clip标签对drawable进行裁剪,在做进度条时很有用。通过设置level值控制裁剪多少,level取值范围为0~10000,默认为0,表示完全裁剪,图片将不可见;10000则完全不裁剪,可见完整图片。看看clip标签可以设置的属性:

android:drawable 指定drawable资源,如果不设置该属性,也可以定义drawable类型的子标签;
android:clipOrientation 设置裁剪的方向,取值为以下两个值之一:

horizontal 在水平方向上进行裁剪,条状的进度条就是水平方向的裁剪;

vertical 在垂直方向上进行裁剪;

android:gravity 设置裁剪的位置,可取值如下,多个取值用 | 分隔;

top 图片放于容器顶部,不改变图片大小。当裁剪方向为vertical时,会裁掉图片底部;

bottom 图片放于容器底部,不改变图片大小。当裁剪方向为vertical时,会裁掉图片顶部;

left 图片放于容器左边,不改变图片大小,默认值。当裁剪方向为horizontal,会裁掉图片右边部分;

right 图片放于容器右边,不改变图片大小。当裁剪方向为horizontal,会裁掉图片左边部分;

center 图片放于容器中心位置,包括水平和垂直方向,不改变图片大小。当裁剪方向为horizontal时,会裁掉图片左右部分;当裁剪方向为vertical时,会裁掉图片上下部分;

fill 拉伸整张图片以填满容器的整个高度和宽度。这时候图片不会被裁剪,除非level设为了0,此时图片不可见;

center_vertical 图片放于容器垂直方向的中心位置,不改变图片大小。裁剪和center时一样;

center_horizontal 图片放于容器水平方向的中心位置,不改变图片大小。裁剪和center时一样;

fill_vertical 在垂直方向上拉伸图片以填满容器的整个高度。当裁剪方向为vertical时,图片不会被裁剪,除非level设为了0,此时图片不可见;

fill_horizontal 在水平方向上拉伸图片以填满容器的整个宽度。当裁剪方向为horizontal时,图片不会被裁剪,除非level设为了0,此时图片不可见;

clip_vertical 附加选项,裁剪基于垂直方向的gravity设置,设置top时会裁剪底部,设置bottom时会裁剪顶部,其他情况会同时裁剪顶部和底部;

clip_horizontal 附加选项,裁剪基于水平方向的gravity设置,设置left时会裁剪右侧,设置right时会裁剪左侧,其他情况会同时裁剪左右两侧。

2、使用Glide图片加载框架遇到的那些坑:

* Glide加载图片变绿
    * 原因,Glide默认加载图片的格式是DecodeFormat.PREFER_RGB_565 

,缺少ALPHA通道,导致加载图片变绿。
* 解决方案
Glide.setup(new GlideBuilder(context).setDecodeFormat(DecodeFormat.PREFER_ARGB_8888));

* Glide在弱网状态下加载大图片,失败几率很大。
    * 解决方案,配置自己的网络栈,
    * 前提:我用的是Retrofit2,其内部使用的是OkHttp3.
    * 配置

compile 'com.github.bumptech.glide:okhttp3-integration:1.4.0@aar'
* 自定义GlideModule
public class MyGlideModule implements GlideModule {
@Override
public void registerComponents(Context context, Glide glide) {
// 设置长时间读取和断线重连
OkHttpClient client = new OkHttpClient.Builder().connectTimeout(10, TimeUnit.MINUTES).readTimeout(10, TimeUnit.MINUTES).retryOnConnectionFailure(true).build();
glide.register(GlideUrl.class, InputStream.class, new OkHttpUrlLoader.Factory(client));
}

@Override
public void applyOptions(Context context, GlideBuilder builder) {
// 防止图片变绿,在有ALPHA通道的情况下
builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);
}

}
* manifest的Application标签配置
<application>
<meta-data
android:name="com.example.admin.quwang.http.MyGlideModule"
android:value="GlideModule" >
</application>
* 在弱网状态下即可解决图片加载问题

* Glide的OOM
    * ImageView设置的ScaleType是fitxy,Glide会默认按照图片实际大小加载。而其他的模式按照的ImageView的大小。
    * 如果非要设置fitxy,那么使Glide.with(context).load().centerCrop().into();或者使用 Glide.with(context).load().fitCenter().into()

* Glide 和dataBinding共同使用的时候,根节点不能是ImageView。 

    * 原因:Glide加载图片时候为了防止图片错位会给ImageView设置Tag,而dataBinding的原理也是给View设置tag。这样就会导致类型转换异常
    * 解决方案:给ImageView嵌套一层父亲容器。

3、Android闪屏处理:

从一个应用或者一个Activity跳转到另一个应用或者另一个Activity,如果要实现不出现闪屏,或者空白屏的现象,可以在清单文件里 给Activity添加属性:
style = "@android:style/Theme.NoDisplay",这样就可以完全避免。

4、Android中ListView或Gridview 与 CheckBox控件的点击冲突

情形如下:图片上加一个CheckBox控件,在点击图片时会与checkBox的 监听事件冲突,导致点击图片无响应或没有跳转;

即:Gridview的 onClick 事件 或者 onItemClick事件 与 CheckBox控件的监听事件 发生冲突;

解决方法:

在布局中对CheckBox控件加上如下三句:
android:clickable="true"
android:focusable="false"
android:focusableInTouchMode="false"

5、 WebView loadData()中文乱码

一般来说 使用loadData(data,"text/html","utf-8")会导致乱码;

解决办法:loadData(data,"text/html","utf-8",null);

原因是:可以使用loadData,刷新只是从缓存里面取,但是在4.0以上的,如果按照API里所写的loadData(data, “UTF-8”, null);时会乱码,如果写成loadData(data, "text/html; charset=UTF-8", null);loadData最终的机制是会把传入的三个参数拼接在一起,然后再进行loadUrl操作,参数就是data, "text/html; charset=UTF-8", null这三个进行拼装,加入text/html; charset=UTF-8就相当于限定了页面的字符

6、httpmime-4.1.3.jar和fastjson-1.2.8.jar冲突

在app下的build.gradle文件里添加:
packagingOptions {
exclude('META-INF/NOTICE.txt')
}

7、照相获取不到数据问题

在调用系统相机的时候,在照相的时候横屏,返回的时候竖屏,会调用onCreate方法,在调用系统的相机的activity清单文件中,添加 android:configChanges="orientaion|keyboardHidden",这样照相的时候就会是竖屏,就可以得到拍照的数据了。

8、关于图片引起的OOM问题

在文件夹drawable里不能放超过 1M的 图片,否则会报 内存溢出(OOM) 的异常,可以选择放在drawable-hdpi,甚至更大分辨率的图片文件夹下。

9、关于Android studio导入工程乱码问题

代码里中文显示正常,真机运行后中文显示乱码,解决办法:
build.gradle中添加一句
android {
compileOptions.encoding = "GBK"
}




推荐阅读