Android

分类下相关文章

在 RecyclerView 条目数超过一屏时,下拉滚动导致 checkbox 状态混乱

Bug 现象 陪媳妇在医院生二娃的时候,用自己新开发的一个 Todo 管理的 Android App 记录待办事宜。当待办事项列表条目很多,超过一屏,此时下拉滚动查看更多事项,会发现这些待办事项的完成状态发生错乱。并且引发我的壁纸生成机制被频繁触发,功能失效。。。 由于记录的事情太多也很重要,引起极度不适,气得我差点卸载,给自己 Google Play 上 1 星差评。 导致 checkbox 状态混乱的原因 为了节省内存,RecyclerView 滚动时,会将移出可视范围、不可见的条目做回收。 如果条目中 (View Holder)包含 CheckBox,在回收时,会自动将 CheckBox ...

阅读全文...

Android Fragment 顶部工具栏显示回退按钮

场景 一个 Main Activity,多个 Fragment 组成的 Android App。 界面1,列表页:list fragment 界面2,详情页:detail fragment 当列表页进入详情页时,想在 fragment 顶部的 toolbar 看到回退按钮。 kotlin 实现代码 由于这里的 toolbar 输入 Main Activity,所以在 Activity 里添加: private lateinit var appBarConfiguration: AppBarConfiguration override fun onCreate(savedInstanceS ...

阅读全文...

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) 的区别

CoroutineScope withContext lifecycleScope viewModelScope 该如何选择 CoroutineScope, withContext, lifecycleScope, 和 viewModelScope 是 Android 中用于协程管理的不同组件和类。这些组件和类可以帮助您在 Android 应用程序中正确地使用协程。 CoroutineScope:是一个顶层接口,用于管理协程以及它们运行的线程。您可以使用GlobalScope创建全局作用域,但通常建议为每个组件或任务创建自己的范围,以便在需要终止时可以更好地控制它们。 withConte ...

阅读全文...