Android

分类下相关文章

Android 11: IntentService is deprecated

使用 IntentService 实现了一个耗时的功能,但是 Android Studio 编译时警告: IntentService is deprecated 官方文档 https://developer.android.google.cn/reference/android/app/IntentService This class was deprecated in API level 30. IntentService is subject to all the background execution limits imposed with Android 8.0 (API le ...

阅读全文...

Android EditText 输入框设置自动焦点

在 Android App 的新建页面,我想将输入焦点自动设置到第一个输入框上,这样就省去用户点击的麻烦。 在使用了 Data Binding 的情况下,kotlin 的写法: binding.editTextTitle.requestFocus() ...

阅读全文...

Android Activity 中点击 action bar 按钮,跳转 Settings Fragment

需求 想实现点击 app bar / action bar 上的一个按钮,跳转到设置功能页,即 Settings Fragment。 findNavController 实现跳转 由于 action bar 在 main activity layout 中,并不属于任何一个 fragment,所以需要在 activity 中实现。 参考 Fragment 中的 findNavController 用法: findNavController().navigate(R.id.action_FirstFragment_to_SecondFragment) 在 Activity 中使用 findNa ...

阅读全文...

Android App Bar / Action Bar 添加按钮

想要在 Android App 中添加一个配置页面,用来进行基本设置调整。例如: 修改字体大小 修改字体颜色 修改背景图片 对比了一下使用 BottomNavigationView 底部 tabbar 的方案,感觉还是 app bar 比较直观一些。 app bar 也称为 action bar,在界面顶部。新建 Basic Activity 时,自带功能。 https://developer.android.google.cn/training/appbar 将默认的折叠项显示出来 修改 menu xml 文件 <item android:id="@+id/action_ ...

阅读全文...

Android SQLite Union 对多个查询结果进行组合

例如,在 Android App 中,我想从本地 SQLite 数据库中,取所有未完成的任务,及已完成的任务的前50条。限制读取已完成条数是为了防止数据量过大,内存不可控。 Room 中的查询 SQL 在 DAO 代码中: @Query(""" SELECT * FROM ( SELECT * FROM (SELECT * FROM todos WHERE done = 0) UNION SELECT * FROM (SELECT * FROM todos WHERE done = 1 ORDER BY id DESC LIMIT 50) ) OR ...

阅读全文...

Android Room Entity 为某个字段添加索引

担心 Android 本地 SQLite 数据库存储数据过多时,造成查询效率下降,所以想给字段加上索引。 添加索引示例 例如,我想给待办事项这个表(todos)的完成状态字段(done)添加索引。 设置 indices 即可: @Entity( tableName = "todos", indices = [Index(value = ["done", ])] ) data class Todo( var title: String, var content: String, ) { @PrimaryKey(aut ...

阅读全文...

Type mismatch. Required: Context! Found: XxxFragment

在 Fragment 中使用 kotlin 实例化 WallpaperManager: val wallpaperManager = WallpaperManager.getInstance(this) 报错: Type mismatch. Required: Context! Found: XxxFragment 解决方法: val wallpaperManager = WallpaperManager.getInstance(activity) Android Context 是指什么呢? // TODO ...

阅读全文...

RecyclerView 子项 View Holder 的点击事件响应

需求 点击 RecyclerView 中的一个 checkbox 子项,更新本地 sqlite 数据库中的一行数据的选中状态字段。 方案对比: 方案一 (不可行):使用 Data Binding 事件处理机制中的 listener binding。 参考 https://developer.android.com/topic/libraries/data-binding/expressions#listener_bindings 采用这个方案,就能把事件响应方法放在 Fragment 中,也就可以使用 Fragment 中的 View Model 了,进而进行 Room Update 操作。 ...

阅读全文...

Android Hilt 实现依赖注入的自动化管理

Android Sunflower Demo 中看到这样一段代码: import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject @HiltViewModel class PlantListViewModel @Inject internal constructor( plantRepository: PlantRepository, private val savedStateHandle: SavedStateHandle ) : ViewModel() { // ... ...

阅读全文...

No type arguments expected for interface ListAdapter

在实现一个 RecyclerView 的 Adapter 时,类的首行代码即报错: class TodoAdapter : ListAdapter<Todo, TodoAdapter.TodoViewHolder>(TodoDiffCallback()) { 报错提示为: No type arguments expected for interface ListAdapter 很奇怪,明明是完全 copy 的 sunflower 的示例代码,怎么还会报错。 仔细检查发现,Android Studio 自动 import 的类有问题: 默认导入的是: import androi ...

阅读全文...

Android RecyclerView 展示数据列表

RecyclerView 的用途 recycle,回收,使再循环的意思。 用于展示列表数据,通常量很大。如名字所示,RecyclerView 可以循环使用已创建的 view,以提升性能。 RecyclerView 的添加步骤 layout XML 中添加 RecyclerView layout XML 中设置 LayoutManager。用于设置子项的排列布局方式,例如:LinearLayoutManager,GridLayoutManager,StaggeredGridLayoutManager。 Adapter 中实现 RecyclerView.ViewHolder。view holde ...

阅读全文...

Android: Unresolved reference: asLiveData

使用 Android 的 ViewModel 与 LiveData 的代码: class TodoViewModel(private val repository: TodoRepository): ViewModel() { val allTodos: LiveData<List<Todo>> = repository.allTodos.asLiveData() } 编译时报错: Unresolved reference: asLiveData 解决方法 gradle 中添加依赖: implementation "androidx.lifecy ...

阅读全文...

withContext(Dispatchers.IO) 与 viewModelScope.launch(Dispatchers.IO) 的区别

viewModelScope 的作用 viewModelScope.launch(Dispatchers.IO) { // do something } viewModelScope 是一个内置的 CoroutineScope,包含在 ViewModel KTX 扩展中 Dispatchers.IO 是为了注明当前 coroutine 需要运行在一个用来执行 I/O 操作的线程中 当用户从一个界面退出,其对应的 ViewModel 会被销毁,相应的此 ViewModel 的 viewModelScope 会被自动取消 (cancelled),所有运行在 viewModelScop ...

阅读全文...

Android Kotlin 协程 Dispatchers 有哪些值

Dispatchers 有哪些值 Dispatchers.Main:Android 主线程。用于调用 suspend 函数,UI 框架操作,及更新 LiveData 对象。 Dispatchers.IO:非主线程。用于磁盘操作(例如,Room 操作),及网络 I/O 请求(例如,调用服务器 API)。 Dispatchers.Default:非主线程,用于 CPU 密集型操作。例如,list 排序,及 JSON 解析。 这里需要注意的是,在 launch 不加参数时,其默认值是 Dispatchers.Main,而不是 Dispatchers.Default。 Dispatchers.IO ...

阅读全文...

gradle.build 配置中 annotationProcessor 与 kapt 区别

kapt 是什么 kapt 是 Kotlin Annotation processing tool 的缩写。 kapt 与 annotationProcessor 的区别 annotationProcessor 是 Android java 项目中的使用方法 kapt 是 kotlin 项目使用的 First of all, the Kotlin Annotation processing tool (kapt) uses the Java compiler to run annotation processors. If your project contains any Java c ...

阅读全文...

近期节日

查看更多节日