1.布局遇到一个适配问题,想到的办法是:获取屏幕的高度,动态改变margin属性,这样做只能保证部分机型没有问题,还是会有问题,因为屏幕页面内容产品希望集中在相对中间的位置,所以上下留白比较多,但是对于小屏幕的手机留白就要不了那么多了,并且相对上面留白更多些,这时候可以考虑从底部向上布局,这样会根据屏幕自动去适配高度。 ----目前解决方法;
另外可以考虑用到Space控件去适配空白高度。---待尝试。
- 在basequickAdapter 使用的时候 默认出现了头部就不会显示Empty,和尾部,配置以下方法也支持同时显示:
setHeaderAndEmpty
setHeaderFooterEmpty
默认头部尾部都是占满一行,如果需要不占满可以配置:
setHeaderViewAsFlow
setFooterViewAsFlow
在项目中就是遇到 设置空布局文件 有问题就是这个的影响,还有就是空页面状态的下拉刷新也会受相应的影响。
- 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();
- 获取本地资源文件路径的方法,
/**
* 获取本地图片资源路径;
* @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中,以提供给别的地方使用。
- 这次在做双击有心心点赞的时候,遇到个问题,引导动画显示时,需要将屏幕设置为透明度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);
}
- Q:杀死进程执行的生命周期?
A:
1)当Android通过杀进程的APP杀死进程后,会执行ondestroy方法,当onDestroy方法执行完成后才彻底杀死进程!
2)注意:点击按钮清理后台数据的时候每一个activity都会执行onDestroy方法,但是通过滑动卡片删除应用杀死进程的时候,或者通过应用管理杀死进程的时候,只有Task栈里面的第一个没有销毁的Activity执行onDestroy方法,一般都是mainActivity,其它Activity均不执行onDestroy。
3)注意:如果希望在ondestroy 方法中执行一些元素的更改,那么一定一定一定要写在super.ondestroy()之前,在之后的是不会执行的。
- 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 这个以后注意下。具体原因后面再写。