UI相关问题

597 阅读3分钟

关于RecyclerView的问题

  • 如果recyclerView没有数据的话: RecyclerView.setLayoutManager 不设置这个 就是不行的 就是没有数据的
  • RecyclerView.getChildAt(position)问题:

问题:程序中,屏幕可以获取到 6 个子 view,当 getChildAt(position)的position 为 6 或 7 的时候,会有空指针异常

原因:getChildAt()只能获取到屏幕上显示的部分

解决:View childView = recyclerView.getLayoutManager().findViewByPosition(position);

NestedScrollView嵌套 RecyclerView,页面载入时总是滑到最底部

原因:由于 NestedScrollView 嵌套 RecyclerView,RecyclerView 占据焦点会导致 NestedScrollView 内容上滑

解决:

方法一:

在根布局设置android:descendantFocusability="blocksDescendants"

其中android:descendantFocusability有三种值:

  • beforeDescendants:viewGroup 会优先其子类控件而获取到焦点
  • afterDescendants:viewGroup 只有当其子类控件不需要获取焦点时才获取焦点
  • blocksDescendants:viewGroup会覆盖子类控件而直接获得焦点

这种方法会造成页面中 EditText 焦点被抢导致无法输入,需要用第二种方法。

方法二:

android:focusable="true"
android:focusableInTouchMode="true"

方法三:

NestedScrollView顶部第一个控件使用:

android:focusable="true"
android:focusableInTouchMode="true"

这种方法不太可靠,因为有时可行,有时不可行。

关于spinner的问题

  • 自定义的适配器问题:spinner在xml中需要记住设备background为null 才可以显示出下拉标志
  • 如果打算修改文字离下拉标志的距离可以通过设置在适配器中的padding来设置。因为这里的设置会直接影响默认位置的距离

关于Dialog

  • 关于Dialog上使用加载框progressdialog不显示问题
  • 关于Dialog改变message无效的问题
//关于加载框或者是dialogfragment,中途改变message消息无效的问题:
//参考如下写法,验证有效:
mConnectResultTv.setText(mess);
mConnectResultTv.invalidate();
mConnectResultTv.postDelayed(new Runnable() {
	@Override
  public void run() {
  	dismiss();
  }
},1000);

点9图片导致其上图片显示未全屏问题

问题描述:

在app启动之后出现了启动页,在启动页上方会覆盖一张广告图。而广告图显示异常:只显示在左上角(屏幕2190x1900而广告图大小431x91)

处理过程:

  1. 断点得知是这个广告图所在的ImageView的大小 getWidth()和getMeasureWidth()都是431,尝试在此ImageView前面动态设置大小:用了重新设置setLayoutParam,无效

  2. 比对上一版的apk是正常,尝试从svn上找动到的文件➡️找到了是启动页由原来的png改成点9图。

原因:点9图的左侧上侧有拉伸,而右侧下侧是限制显示区域却没有设置,只设置了左侧和上侧。

解决:右侧、下侧都弄上“黑边”

sending message to a Handler on dead thread

toast报这个异常。解决:在主线程创建个Handler,toast写里面,需要吐司的地方去发送消息给这个handler

setVisibility无效问题

现象:view.setVisibility(View.INVISIBLE);无效

原因一:对这个view设置了动画,且给此动画加了属性 anim.setFillAfter(true);

解决:

  • 方案一:
anim.setFillAfter(false);
view.setVisibility(View.INVISIBLE);
  • 方案二:
view.clearAnimation();
view.setVisibility(View.INVISIBLE);
  • 方案三:
view.postdelay延迟100毫秒
  • 方案四:
使用runOnUiThread的方式来实现

如果上述方案都不可行,检查Mainifest.xml,去除android:hardwareAccelerated="false"

对于其他原因,在setVisibility隐藏之后加个刷新。view.invalidate()或view.postinvalidate()。前面俩无效再试试自身requestLayout()或父容器的requestLayout()来强制页面刷新。

ImageView滑动屏幕后显示异常

现象:LinearLayout内有一排iv,iv的scaleType为centerCrop,LinearLayout为RecyclerView内一个item,滑动Rc后iv显示内容变大了

排查过程:用Layout Inspector查看变形的iv的drawing--isOpaque()为false。第一个iv未变形,其isOpaque()为true

解决:尝试修改iv的android:setScaleType="fitXY",问题解决了

解决后再次用Layout Inspector查看,所有iv的drawing--isOpaque()为true