android 疑难杂症

本文汇集本人开发要解决一些疑难杂症的代码集合,方便以后自己要用到的时候又跑去搜索解决,只需要来这里 Ctrl + F 搜索一下关键即可。本文也含有来自各前辈的经验,也不记得是谁的链接看到的了,如有知道,则提示一下补全。感谢!!!

RecyclerView 边缘渐变效果

requiresFadingEdge 属性:

  • none(边框颜色不变)
  • horizontal(水平方向颜色变淡)
  • vertical(垂直方向颜色变淡)
  • fadingEdgeLength:用来设置边框渐变的长度

如果只要一部分,则重写 RecyclerView

重写recycleView的类,重新设置返回值。

  • getTopFadingEdgeStrength(); 重写这个方法,设置返回值是0,去掉顶部阴影;
  • getBottomFadingEdgeStrength(); 重写这个方法,设置返回值是0,去底顶部阴影
  • getLeftFadingEdgeStrength(); 重写这个方法,设置返回值是0,去掉左部阴影
  • getRightFadingEdgeStrength(); 重写这个方法,设置返回值是0,去掉右部阴影

Java 获取随机数的常用两种方式

  • new Random()
    new Random().nextInt(4);  //【0,4) 范围 :0,1,2,3 
    
  • Math.random();返回的数值是 [0.0,1.0)范围 double 型数值,由于double类数的精度很高,可以在一定程度下看做随机数,借助(int)来进行类型转换就可以得到整数随机数了
      int max=100,min=1;
      int ran2 = (int) (Math.random()*(max-min)+min); 
      System.out.println(ran2);
    

设置 RecyclerView 滚动到指定的 position item 顶部

继承 LinearSmoothScroller 类,重写 getVerticalSnapPreference() 或者 getHorizontalSnapPreference() 方法,主要看你设置的 LayoutManager 的返现,我这里是设置了竖直方向的滚动,所以我下面重写的是 getVerticalSnapPreference()。

/**
 * @author: Haegyeong
 * @date: 2021/5/9 9:29
 * @description: 设置 RecyclerView 滚动到指定的 position item 顶部
 * @version: 1.0
 */
public class LinearTopSmoothScroller extends LinearSmoothScroller {

    public LinearTopSmoothScroller(Context context) {
        super(context);
    }

    @Override
    protected int getVerticalSnapPreference() {
        return SNAP_TO_START;
    }
}

调用处代码

//设置Item 滚动到前面
mBinding.recyclerview.post(new Runnable() {
       @Override
       public void run() {
           LinearSmoothScroller smoothScroller = new LinearTopSmoothScroller(getContext());
           smoothScroller.setTargetPosition(mAdapter.getFooterViewPosition());
           layoutManager.startSmoothScroll(smoothScroller);
       }
   });

记录一个懵逼 3 小时的 Fragment 异常。

java.lang.IllegalArgumentException: No view found for id 0x7f09012b (com.xxx.abc:id/flContainer) for fragment CommentsLikeFragment{c4cef62 (5951d882-b5db-43d4-9e90-740e067241d7) id=0x7f09012b like}

一般看到提示 No view found for id 0x7f09012b (com.xxx.abc:id/flContainer) for fragment CommentsLikeFragment 那就是找不到 Fragment 的容器ID。
也就是 fragmentTransaction.add( containerViewId, commentFragment, "recommend") ,正常的在 FragmentActivity 或者 Fragment 使用,只要你 对应上 View 布局的容器 id ,就不会报错了。

因为业务需求的功能需要,我在 RecyclerView 的 Item上使用了(在尾部的 FooterView 添加了评论列表),然后一直报这个错误,搞的我都怀疑人生,写了几年都是这样的写法,怎么突然就错了呢,怎么百度、Google 都是说和布局上的容器 Id 对应不上,复制粘贴几十次,都依旧有问题,后面才发现是因为进来页面的时候,因为是添加在 RecyclerView 的 item 中,而进来页面的时候,RecyclerView 的 Item 也还没有 Attach 到 Window上,所以 FragmentContainer 还没找到这个 id,异常就爆出了该异常。

解决方案

//注意:先把 Fragment 添加到 Transaction 中,先不用 commit 
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction()
                .add(footerBinding.flCommentContainer.getId(), commentFragment, "recommend");

然后,使用 addOnAttachStateChangeListener 方法来监听 View 的 attach 状态,只要 view Attach 到 Window 窗口,那么就 调用 fragmentTransaction.commit(); 来提交本次 Fragment 添加,即可成功解决问题。

footerBinding.getRoot().addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
            @Override
            public void onViewAttachedToWindow(View v) {
                footerBinding.getRoot().removeOnAttachStateChangeListener(this);
                if (!commentFragment.isAdded() || !likeFragment.isAdded()) {
                    fragmentTransaction.commit();
                }
            }

            @Override
            public void onViewDetachedFromWindow(View v) {
            }
        });

插件版本与Gradle 对应版本号

image.png

ViewGroup 隐藏显示 View 开启动画,只需要 ViewGroup 添加以下代码就可以了。

android:animateLayoutChanges="true"

你可能感兴趣的:(android 疑难杂症)