android 开发中常见问题合集(持续更新)

ps:有遇到新的问题,我会继续在这个博客上更新我的思路和解决方法。希望可以帮到大家

8.两个Recyclerview联动中的问题(一直请求加载下一页)

 今天在调试左右两个recyclerview的联动效果,结果发现recyclerview会一直请求加载下一页,直到请求完所有的数据

通过一系列的查找发现,是布局的问题,这个recyclerview的高度加载的数据项目一直是充满的,不是按一个屏幕上可见的个数统计。

最后发现时LinearLayout的weight属性导致的,嵌套的时候不使用weight,直接通过计算赋予高度值 就不会出现这个问题了。

7.微信分享问题

未签名的包可以正常分享,打了签名的包却不能分享

原因1.微信开发者网站里面配置的签名和签名包的签名不一致,这里不细说,请认真比对一下

        2.混淆的问题:文档上面没有说,但是我添加了下面的混淆后就可以正常分享了

        

    -keep class com.tencent.mm.sdk.openapi.WXMediaMessage {*;}
    -keep class com.tencent.mm.sdk.openapi.** implements com.tencent.mm.sdk.openapi.WXMediaMessage$IMediaObject {*;}
    -dontwarn com.tencent.mm.**
    -keep class com.tencent.mm.**{*;}

 

 

 

6.fresco 加载本地图片的问题

将我们本地的地址通过Uri.fromFile来处理而不是用以前使用的Url.parse()来处理

 例如:DraweeUtils.showThumb(Uri.fromFile(new File(itemData.getCommonImageUrl())), cache.localPreview);

5.关于.9图的Drawabel的转化异常

现在的app经常要应用.9图,但是我们拿到.9图的Drawable的时候要转化为bitmap等操作的时候经常活报错,这边就给一个关于.9图的转化方法

private Bitmap drawable2Bitmap(Drawable drawable) {
        if (drawable instanceof BitmapDrawable) {
            return ((BitmapDrawable) drawable).getBitmap();
        } else if (drawable instanceof NinePatchDrawable) {
            Bitmap bitmap = Bitmap
                    .createBitmap(
                            drawable.getIntrinsicWidth(),
                            drawable.getIntrinsicHeight(),
                            drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888
                                    : Bitmap.Config.RGB_565);
            Canvas canvas = new Canvas(bitmap);
            drawable.setBounds(0, 0, drawable.getIntrinsicWidth(),
                    drawable.getIntrinsicHeight());
            drawable.draw(canvas);
            return bitmap;
        } else {
            return null;
        }
    }

 

 

 

4.关于动态设置背景的颜色和背景的圆角的问题

--最近公司的一个需求是根据后台传递过来的颜色设置背景的颜色,如果我们使用setBackgroundResource(R.drawable.xxx),但是如果是资源文件设置background的话里面的颜色是没法动态设置进去的,所以就需要我们动态的去设置背景颜色和背景的圆角

--以下是主要的代码:

 

 GradientDrawable drawable = (GradientDrawable) mContext.getResources().getDrawable(R.drawable.item_category_bg);
        drawable.setCornerRadius(Util.dip2px(mContext,10));
        drawable.setColor(Color.parseColor(categoryBeens.get(position).getBgColor()));
        bgColor.setBackgroundDrawable(drawable);

ps:item_category_bg就是自定义的背景xml,我的是很简单的xml

 

 

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <padding android:left="0dp" android:top="0dp" android:right="0dp" android:bottom="0dp" />
</shape>

 

 

 

 

 

3.获取输入法弹框的高度等问题

--解决思路:通过根视图,拿到根视图的高度, 获取root在窗体的不可视区域高度(被其他View遮挡的区域高度),就使我们要的输入法的高度了

 

final RelativeLayout root= (RelativeLayout) findViewById(R.id.layout_chat);//layout_chat是最外层的布局id
        final RelativeLayout rl_input= (RelativeLayout) findViewById(R.id.rl_input);

        if(Constants.isMonitoring&&Util.isKitKat()){
            root.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
                @Override
                public void onGlobalLayout() {
                    Rect rect = new Rect();
                    //获取root在窗体的可视区域
                    root.getWindowVisibleDisplayFrame(rect);
                    //获取root在窗体的不可视区域高度(被其他View遮挡的区域高度)
                    int rootInvisibleHeight = root.getRootView().getHeight() - rect.bottom;
                    if (rootInvisibleHeight > 100) {
                        if (Util.isKitKat()) {
                            RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(rl_input.getLayoutParams());
                            lp.setMargins(0, 0, 0, rootInvisibleHeight);
                            rl_input.setLayoutParams(lp);
                            mLayoutManager.scrollToPosition(mAdapter.getItemCount() - 1);
                        }
                    } else {
                        if (Util.isKitKat()) {
                            RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(rl_input.getLayoutParams());
                            lp.setMargins(0, 0, 0, 0);
                            rl_input.setLayoutParams(lp);
                        }
                    }
                    root.getViewTreeObserver().removeGlobalOnLayoutListener(null);
                }
            });
        }

 

 

 

 

 

2.图片同比例放大的问题

--解决思路:自定义一个imageview,在ondraw方法获取到图片,并且得到图片宽高,然后根据图片宽高比和屏幕宽高比获得要生成的新图的宽高比,最后生成图片

 

 @SuppressLint("NewApi")
    @Override
    protected void onDraw(Canvas canvas) {
        try{
            Drawable drawable = getDrawable();
            if (null != drawable) {
                float height = ScreenUtil.getCurrentScreenHeight1(getContext());
                Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();
                int ImageHei=bitmap.getHeight();
                int ImageWid=bitmap.getWidth();
                float heigh= height/3;
                float scale=(float)ImageHei/heigh;
                int width= (int) (ImageWid/scale);

                bitmap=zoomDrawable((BitmapDrawable) drawable,heigh);
                canvas.drawBitmap(bitmap, 0, 0, new Paint());
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }

   ---出现的问题是:图片宽度很大的话会被压缩

 

  最后的解决方案是:

   

    @SuppressLint("NewApi")
    @Override
    protected void onDraw(Canvas canvas) {
        try{
            Drawable drawable = getDrawable();
            if (null != drawable) {
                float height = ScreenUtil.getCurrentScreenHeight1(getContext());
                Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();
                int ImageHei=bitmap.getHeight();
                int ImageWid=bitmap.getWidth();
                float heigh= height/3;
                float scale=(float)ImageHei/heigh;
                int width= (int) (ImageWid/scale);
//-----------------------------------------------------------------------------------
                ViewGroup.LayoutParams layoutParams = getLayoutParams();
                layoutParams.width=width;
                layoutParams.height= (int) heigh;
<pre name="code" class="java">//-----------------------------------------------------------------------------------

bitmap=zoomDrawable((BitmapDrawable) drawable,heigh); canvas.drawBitmap(bitmap, 0, 0, new Paint()); } }catch (Exception e){ e.printStackTrace(); } }

 

 

 

然后在imageloader的display方法中调用;

 

 ImageLoader.getInstance().displayImage(regionList.get(position), imageView,
                ImageLoaderManager.getDisplayImageOptions(R.drawable.bg_normal_pic), new
                        SimpleImageLoadingListener() {
                            @Override
                            public void onLoadingStarted(String imageUri, View view) {
                                loading.setVisibility(View.VISIBLE);
                            }

                            @Override
                            public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
                                String message = null;
                                switch (failReason.getType()) {     // 获取图片失败类型
                                    case IO_ERROR:              // 文件I/O错误
                                        message = "Input/Output error";
                                        break;
                                    case DECODING_ERROR:        // 解码错误
                                        message = "Image can't be decoded";
                                        break;
                                    case NETWORK_DENIED:        // 网络延迟
                                        message = "Downloads are denied";
                                        break;
                                    case OUT_OF_MEMORY:         // 内存不足
                                        message = "Out Of Memory error";
                                        break;
                                    case UNKNOWN:               // 原因不明
                                        message = "Unknown error";
                                        break;
                                }
                                loading.setVisibility(View.GONE);
                                imageView.setBackgroundResource(R.drawable.bg_normal_pic);
                            }

                            @Override
                            public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
                                if(regionList.get(position).equals(imageUri)){
                                    float height = ScreenUtil.getCurrentScreenHeight(mContext);
                                    int ImageHei=loadedImage.getHeight();
                                    int ImageWid=loadedImage.getWidth();
                                    float heigh= height/3;
                                    float scale=(float)ImageHei/heigh;
                                    int width= (int) (ImageWid/scale);
//                                    Log.i("onLoadingComplete", "onLoadingComplete:" + width);
                                    ViewGroup.LayoutParams layoutParams = imageView.getLayoutParams();
                                    layoutParams.width=width;
                                    layoutParams.height=imageHei;
                                    imageView.setLayoutParams(layoutParams);
                                   // imageView.setImageBitmap(loadedImage);
                                    loading.setVisibility(View.GONE);       // 不显示圆形进度条
                                }
                            }
                        });

 

 

 

 

 

 

 

1.内存溢出的问题

--解决思路:拍照后生成图片的时候直接压缩图片,减少内存(错误思路:先生成好图片,然后再去压缩,这样效果不好,经常没办法解决图片内存溢出的问题)

 

  1. // 解决加载图片 内存溢出的问题  
  2. // Options 只保存图片尺寸大小,不保存图片到内存  
  3. BitmapFactory.Options opts = new BitmapFactory.Options();  
  4. // 缩放的比例,缩放是很难按准备的比例进行缩放的,其值表明缩放的倍数,SDK中建议其值是2的指数值,值越大会导致图片不清晰  
  5. opts.inSampleSize = 4;  
  6. Bitmap bmp = null;  
  7. bmp = BitmapFactory.decodeResource(getResources(), mImageIds[position],  
  8.                 opts);  
  9. // 回收  
  10. bmp.recycle();

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值