问题记录
- 这篇博客我会不定时更新,记录内容为我在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)
- 在给
RecyclerView
找Item
的View
实例时,通过LinearLayoutManager
的findViewByPosition()
方法拿到的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
去调用重写的构造方法- 原因未知,父类构造方法也是这样实现的