Android开发中实际问题记录

问题记录

  • 这篇博客我会不定时更新,记录内容为我在Android开发过程中遇到的实际问题以及解决方法,当然,也会存在未解决的问题,如果各位看官有知道的 方便的话也可以在评论区留言指出,谢谢啦~
    • 开发工具为 Android Studio

问题一(CirclerImageView 设置 selector 不成功)

  • 开源库 CirclerImageView 设置 selector 不成功,点击并不会触发selector 内设的逻辑。(设置了 clickable 的)
    • 虽然它是继承自 ImageView 的,但是这一点并不与 ImageView 一致。
    • 原因未知

问题二(Default Activity Not Found,app出现红叉,build.gradle、values下的文件出现乱码)

  • 有些代码写着写着就跑步起来了,当然,代码本身并没有问题,编译也是没有问题,就是跑不起来,app出现红叉,提示 Default Activity Not Found,但是一检查 <intent-filter>标签加的好好的,这就很奇怪了,明明设置了默认活动的,为什么找不到呢?先不急,仔细看看自己的代码,又发现了 Project 下的 build.gradle 里面的代码居然全变为了乱码,values 下面的文件中的代码也是如此,再深入研究,你又会发现,连新建的项目都出现了这个错误
    • 可以明确的告诉你,并不是你的代码写得有问题,而是 Android Studio 自己的问题,下面有两种解决办法,第一种肯定是可行的,第二种我刚开始弄完之后是可行的,可是后面又时不时的出现错误···所以推荐第一种,简单准确!
    • 解决方法一:将C:\Users\用户名\.AndroidStudio3.4\system\caches这个文件夹直接删除,然后重启Android Studio就行啦
    • 解决方法二:其实就是这四个文件乱码导致的原因(values下有默认三个文件,加上 build.gradle 这个文件),所以我们就改变它们的编码格式即可。
      • 使用任意编译器,打开这四个文件,设置编码为 UTF-8然后保存,就是这么简单,这下重启项目即可。
      • 在这之前,我还使用了其他的方法,比如改Android Studio 的编码格式等等,都不行 0_0吗,真惨

问题三(findViewByPosition() 方法返回值为 null)

  • 在给RecyclerViewItemView实例时,通过LinearLayoutManagerfindViewByPosition()方法拿到的View实例会出现null的情况,前提是在监听 RecyclerView滑动的时候,如下:
public class FragmentRoute extends Fragment {

	···
	//判断是否是第一次滑动
    private static boolean mIsFirstSmooth;
	//一个临时变量,用于记录上一次的位置
    private static int temp;
    ···
    private static final String TAG = "FragmentRoute";

	···

    private void init(View view) {
    	···
    	//因为我一开始是要指定 Item 为中间的一个,所以一开始初始化这个 temp 为 中间位置
        temp = recyclerView.getWidth() / 2;
    	···
    }

    /**
     * 计算 RecyclerView 的滑动距离
     * @return 滑动距离
     */
    public int getSmoothDistance() {
        int now = recyclerView.computeHorizontalScrollOffset();
        //先对第一次滑动作单独处理
        if (mIsFirstSmooth) {
            int ret = Math.abs(now - temp);
            temp = now;
            mIsFirstSmooth = false;
            return ret;
        } else {
        //第一次滑动结束后,后面的都在这块代码中
            int ret = Math.abs(now - temp);
            temp = now;
            return ret;
        }
    }

}
    recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @SuppressLint("ResourceType")
        @Override
        public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
            super.onScrollStateChanged(recyclerView, newState);
				···
			//下面的三个实例会时不时的出现 null 的情况
            apply = manager.findViewByPosition(0);
            my = manager.findViewByPosition(1);
            all = manager.findViewByPosition(2)
            	···
         }
    }

}

  • 原因未解决:推测应该是滑动监听这里有问题,所以我直接在Adapter中去拿View

问题四(计算 recyclerView 滑动距离的方法)

  • 设置计算recyclerView滑动距离的方法
    • 我开始使用的是computeHorizontalScrollOffset()这个方法,后面才感觉并不是从中间的一个Item开始计时的,这里把我搞蒙了0_0(还是太才了,源码没怎么看懂,都是返回0?)
  • 解决:经过我打印出来的结果,这个方法计算的是其他Item到第一个Item的距离,于是,我就写出了这样一个计算RecyclerView滑动距离的方法了(代码比较简单,不作过多说明了,因为我看其他博客都是去计算Item高度,但是那样每个Item高度不一样就不行了,所以我写了一个这样的方法)
    • 注意:我这里的RecyclerView是水平的哦!垂直也是类似的,自己思考咯~
public class FragmentRoute extends Fragment {

	···
	//判断是否是第一次滑动
    private static boolean mIsFirstSmooth;
	//一个临时变量,用于记录上一次的位置
    private static int temp;
    ···
    private static final String TAG = "FragmentRoute";

	···

    private void init(View view) {
    	···
    	//因为我一开始是要指定 Item 为中间的一个,所以一开始初始化这个 temp 为 中间位置
        temp = recyclerView.getWidth() / 2;
    	···
    }

    /**
     * 计算 RecyclerView 的滑动距离
     * @return 滑动距离
     */
    public int getSmoothDistance() {
        int now = recyclerView.computeHorizontalScrollOffset();
        //先对第一次滑动作单独处理
        if (mIsFirstSmooth) {
            int ret = Math.abs(now - temp);
            temp = now;
            mIsFirstSmooth = false;
            return ret;
        } else {
        //第一次滑动结束后,后面的都在这块代码中
            int ret = Math.abs(now - temp);
            temp = now;
            return ret;
        }
    }

}

问题四(SurfaceView 加载黑屏的情况)

  • 一般使用 SurfaceView 重写的三个构造方法(与自定义 View 类似的),默认为 super(调用的父类的),这样就会出现黑屏,绘制不出东西来
  • 解决:手动使用 this 去调用重写的构造方法
    • 原因未知,父类构造方法也是这样实现的
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值