美文网首页
开发中遇到的问题(二)

开发中遇到的问题(二)

作者: most_xiaoya | 来源:发表于2019-10-17 14:36 被阅读0次

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


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

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

    接收的时候:

    mPathList = intent.getStringArrayListExtra("pathlist");
    

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

      ArrayList<String> 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<Bitmap>() {
        @Override
        public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> 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 这个以后注意下。具体原因后面再写。

    相关文章

      网友评论

          本文标题:开发中遇到的问题(二)

          本文链接:https://www.haomeiwen.com/subject/jybcuctx.html