Loading...Wait a Minute!

低级错误: kotlin 中 thread 创建

1
2
3
thread {

}.start()

这样写?有问题吗
报错:java.lang.IllegalThreadStateException

我靠为啥?最后检查之后:
应该用 Thread{}.start(), 看到了没?是 首字母大写的 Thread,为什么???

要知道 这个写法是没有错的,thread { /* 代码块 */ },将代码块交给 threadlambda 表达式,这个表达式会在新线程中执行,所以上面这个操作相当于重复执行了这个线程,就会报错了。
所以要么:

1
2
3
thread {
// 执行的内容
}

要么

1
2
3
4
5
6
7
8
9
10
11
Thread {

}.start()

// 或者

val myThread = Thread {
// 这里是要在新线程中执行的代码
}
// 这里可以进行其他操作
myThread.start() // 当准备好要启动线程时调用这个方法。
  

Android 获取 相册中的所有截图

首先,在 Android 清单文件 (AndroidManifest.xml) 中添加以下权限请求:

1
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

动态申请权限

1
2
3
4
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE), MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE)
return
}

查询系统 MediaStore 的 Images 表来获取所有截图的 Uri,你可以通过设置 selection 条件来只获取截图。这里假设截图保存在 “Screenshots” 文件夹中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
val projection = arrayOf(
MediaStore.Images.Media._ID,
MediaStore.Images.Media.BUCKET_DISPLAY_NAME,
MediaStore.Images.Media.DATE_TAKEN
)
val cursor = contentResolver.query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
projection,
MediaStore.Images.Media.BUCKET_DISPLAY_NAME + " LIKE ?", arrayOf("%Screenshots%"),
MediaStore.Images.Media.DATE_TAKEN + " DESC"
)
val screenshotUris = ArrayList<Uri>()
if (cursor != null) {
// 获取索引
val idColumn = cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID)
while (cursor.moveToNext()) {
// 获取图片的uri
val id = cursor.getLong(idColumn)
val uri =
ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, id)
screenshotUris.add(uri)
Log.d("测试:screenshotUri",uri.toString())
}
cursor.close()
}
Log.d("测试:screenshotUris 数量",screenshotUris.size.toString())
  

Android-处理多层Viewpager滑动冲突

处理多层ViewPage嵌套产生滑动冲突的问题

场景

在项目中我们经常会遇到一下类似的嵌套效果,ViewPager从主页可以一直右滑经过每个页面。

1
2
3
4
5
6
7
8
9
graph LR
A(MainActivity: BottomNavigationView + ViewPager)-->B1(主页 : TabLayout + ViewPager)
A-->B2(发现 : TabLayout + ViewPager)
A-->B3(我的 : 普通布局)
B1-->C1(tab1 : TabLayout + ViewPager)-->RecycleView1-->items1
B1-->C2(tab1 : TabLayout + ViewPager)-->RecycleView2-->items2
B1-->C3(tab1 : TabLayout + ViewPager)-->RecycleView3-->items3
B2-->D1(tab1....)
B3-->E1(内容)

效果图

Android-虚拟导航键显示隐藏监听及自动设定高度

虚拟导航键显示隐藏监听及自动设定高度

问题描述

某些型号在某些布局下使用虚拟导航栏不能自动调整布局,导致遮挡。特别是华为手机。。。

问题解决步骤

  1. 获取根布局
  2. 设置 ViewTree 的全局界面监听
  3. 当捕获到界面更新时,去判断虚拟导航键是否弹出或隐藏然后做出相应的操作

:D 一言句子获取中...