开发中遇到的问题(二)

1.布局遇到一个适配问题,想到的办法是:获取屏幕的高度,动态改变margin属性,这样做只能保证部分机型没有问题,还是会有问题,因为屏幕页面内容产品希望集中在相对中间的位置,所以上下留白比较多,但是对于小屏幕的手机留白就要不了那么多了,并且相对上面留白更多些,这时候可以考虑从底部向上布局,这样会根据屏幕自动去适配高度。 ----目前解决方法;
另外可以考虑用到Space控件去适配空白高度。---待尝试。


  1. 在basequickAdapter 使用的时候 默认出现了头部就不会显示Empty,和尾部,配置以下方法也支持同时显示:
    setHeaderAndEmpty
    setHeaderFooterEmpty
    默认头部尾部都是占满一行,如果需要不占满可以配置:
    setHeaderViewAsFlow
    setFooterViewAsFlow
    在项目中就是遇到 设置空布局文件 有问题就是这个的影响,还有就是空页面状态的下拉刷新也会受相应的影响。

  1. Intent传值是可以直接传ArrayList类型的数据的;
    传递方式:
ArrayList mPathList = new ArrayList<>();
intent.putStringArrayListExtra("pathlist", mPathList);

接收的时候:

mPathList = intent.getStringArrayListExtra("pathlist");

以上是比较基础的,下面问题来了,我们接收后一般会进行一些处理,所以这时候如果直接对mPathList进行遍历的同时 还在进行一些add 或者remove操作,就会报错 ConcurrentModificationException ,解决办法也很简单,就是在接收的时候重新定义个变量接收:

  ArrayList images = new ArrayList<>(mPathList);
   mPathList.clear();

  1. 获取本地资源文件路径的方法,
   /**
     * 获取本地图片资源路径;
     * @param context
     * @param id
     * @return
     */
    public  static String getResourcesUri(Context context,int id) {
        Resources resources = context.getResources();
        String uriPath = ContentResolver.SCHEME_ANDROID_RESOURCE + "://" +
                resources.getResourcePackageName(id) + "/" +
                resources.getResourceTypeName(id) + "/" +
                resources.getResourceEntryName(id);
        return uriPath;
    }
这个是有个这样的需求:本地放了几个随机的默认头像,需要检查用户有没有设置头像,如果没有设置的话需要把本地的默认头像随机一个给用户,并且把路径要存在sharepreference中,以提供给别的地方使用。

  1. 这次在做双击有心心点赞的时候,遇到个问题,引导动画显示时,需要将屏幕设置为透明度50%,但是双击点赞的这个view 是自定义view中嵌套自定义view,动画的播放控制也在自定义view中,接口实现传递比较啰嗦,所以就想到了在子view中获取根布局,最后实现的方式是,在activity的layout文件中添加一个view是半透明的,在子view中获取根布局后再找到半透明view,在动画开始的时候控制半透明view显示,结束时隐藏。
    这里主要写下获取根布局的方法:
private  View getRootView(Context context) {
        Activity activity = (Activity) context;
        return activity.getWindow().getDecorView().findViewById(android.R.id.content);
    }

  1. Q:杀死进程执行的生命周期?
    A:
    1)当Android通过杀进程的APP杀死进程后,会执行ondestroy方法,当onDestroy方法执行完成后才彻底杀死进程!
    2)注意:点击按钮清理后台数据的时候每一个activity都会执行onDestroy方法,但是通过滑动卡片删除应用杀死进程的时候,或者通过应用管理杀死进程的时候,只有Task栈里面的第一个没有销毁的Activity执行onDestroy方法,一般都是mainActivity,其它Activity均不执行onDestroy。
    3)注意:如果希望在ondestroy 方法中执行一些元素的更改,那么一定一定一定要写在super.ondestroy()之前,在之后的是不会执行的。

  1. Glide的用法:
    前两天有个需求:需要将图片加水印后展示;看着这个需求很简单,但是却折腾半天,原因是因为不了解Glide的基础用法;
    在使用Glide获取Bitmap对象时,使用的方法是Glide.with(context).load(url).asBitmap().into(width, height).get();
    这个用的话一点儿问题都没有,但是我却用在了主线程去直接使用,然后并没有报错,但是获取的Bitmap 一直是null,后来看源码才发现这个问题,后来改用了带回调的方法:
Glide.with(getApplicationContext()).load(imageUrl).asBitmap().into(new SimpleTarget() {
    @Override
    public void onResourceReady(Bitmap resource, GlideAnimation glideAnimation) {
        if (resource != null) {
            iv_share_pic.setImageBitmap(resource);
        }

    }
});
  一句话总结:注意api 使用限制条件。该在子线程使用,要在子线程使用,不能想当然。(╥╯^╰╥)

7.获取控件宽高的正确打开方式:
第一种方式:

 ViewTreeObserver viewTreeObserver=iv_share_pic.getViewTreeObserver();
        viewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                iv_share_pic.getViewTreeObserver().removeGlobalOnLayoutListener(this);
                int height = iv_share_pic.getMeasuredHeight();
                int width = iv_share_pic.getMeasuredWidth();
             
            }
        });

第二种方式:

 @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);

        if(hasFocus){
          int  picHeight = iv_share_pic.getMeasuredHeight();
          int  picWidth = iv_share_pic.getMeasuredWidth();
          
        }
    }

需要注意的是:
1)获取控件的宽高要在控件加载完成后再进行,这个时机一定要把握好,比如还有一种方式我直接在onCreate中做postDelay 去获取控件的宽高,其实也是一样的道理,都是为了让控件加载完毕,执行过onLayout方法;
2)刚开始我犯了一个错误就是一直在使用LayoutParams 去获取,比如:

   ViewTreeObserver viewTreeObserver=iv_share_pic.getViewTreeObserver();        
    viewTreeObserver.addOnGlobalLayoutListener(new 
   ViewTreeObserver.OnGlobalLayoutListener() {
           @Override
          public void onGlobalLayout() {
             ConstraintLayout.LayoutParams params = (ConstraintLayout.LayoutParams) iv_share_pic.getLayoutParams();
     int height = params.height;
     int width = params.width;           
  iv_share_pic.getViewTreeObserver().removeGlobalOnLayoutListener(this);
           }
       });

这样获取到的宽高永远是0 和-1 这个以后注意下。具体原因后面再写。

你可能感兴趣的:(开发中遇到的问题(二))