5分18秒,添加的fragment的id一定要和bottom_nav_manu表单中新添加的那个item的id一样啊!否则就无法跳转!(其实老师后面也强调了)
另外,如果运行时发现界面头上有个白色的留白,可以查看activity_main表单文件,把开头几行中的“android:paddingTop="?attr/actionBarSize"”删掉,这是模板自带的一个留白配置,删掉后就不会有那块白色了。
感谢DeepSeek帮忙排查问题,它是人类的好朋友~(ಥ _ ಥ)
同上节课一样,由于kotlin-android-extensions 插件废弃,导致holder.itemView.item_image以及holder.itemView.item_title相关的代码全都失效,DeepSeek解释说:“holder.itemView.itemImage 是 kotlin-android-extensions 的语法糖,它本质上等价于 holder.itemView.findViewById<ImageView>(R.id.itemImage),但废弃插件后此功能已失效。直接通过 ID 访问视图的方式已被完全移除,必须显式绑定”。下面是它给出的代码。好耶!我好像明白view binding是怎么回事了!我可以举一反三啦!
inner class MyAdapter : RecyclerView.Adapter<MyAdapter.MyViewHolder>() {
// 使用 View Binding 的 ViewHolder
inner class MyViewHolder(private val binding: ItemViewLinearVerticalBinding) :
RecyclerView.ViewHolder(binding.root) {
// 直接通过 binding 访问视图
fun bind() {
binding.itemImage.setImageResource(R.drawable.icon_jetpack)
// 可以在这里添加语句,绑定其他控件
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
// 通过 Binding 类加载布局
val binding = ItemViewLinearVerticalBinding.inflate(
LayoutInflater.from(parent.context),
parent,
false
)
return MyViewHolder(binding)
}
override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
holder.bind() // 调用 ViewHolder 的绑定方法
}
override fun getItemCount() = 20
}
Kotlin1.4之后没有kotlin-android-extension插件了……官方建议使用View Binding。
直接写recycler_view.layoutManager又会报错,无奈问了DeepSeek,它给出了解决方案,编辑器确实没有报错了,但是代码同老师的差别就太大了。我暂时没有能力验证这种方案是否可以同接下来的课程内容兼容,先贴在这里:
class HomeFragment : Fragment(R.layout.fragment_home) {
// 定义 Binding 对象(根据布局文件名称自动生成)
private var _binding: FragmentHomeBinding? = null
private val binding get() = _binding!! // 非空断言仅在 _binding 非空时使用
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
// 初始化 Binding
_binding = FragmentHomeBinding.inflate(inflater, container, false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
// 通过 binding 访问视图
binding.recyclerView.layoutManager = LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false)
// 其他代码(例如设置 Adapter)
}
override fun onDestroyView() {
super.onDestroyView()
// 清理 Binding 避免内存泄漏
_binding = null
}
}
index 不能超过集合size的大小 这个在java中一样的
新版已带 material,无需再增加依赖
课程源码
https://github.com/ThirdPrince/android2021
Kotlin扩展函数与实现机制探索
https://cloud.tencent.com/developer/article/1146533
这个lambda隐形参数,怎么出现的?需要安装什么插件吗?
有用
JsonToKotlinClass 插件
(一)具名参数
(有默认值的参数,不传的情况下,别的参数需要写清楚参数名=值)
read(1,2)
read(start = 2)
(二)重点:方法传参中传递方法
下图,read2方法中的第三个参数为一个方法 action:()->String
【这个参数名为action,action参数名后加了(),代表这个参数是一个方法】
【action后边的()里是这个方法的参数,String是这个方法的返回值】
【如果该方法没有返回值,则为Unit,写法action:()->Unit,代表无参无返回值】
(1)括号内传递action方法参数
在调用read2方法时,参数action,写法参数名 = {方法体}
read2(1,2,action = {
这个里边是action的方法体
最后一行代表这个方法的返回值
"read" //代表这个方法的返回值为read
}
)
(2)括号外传递方法参数(方法参数是参数的最后一个时才可这么写)
不需要写明action={},可以省略action=,直接在小括号的外边写{},{}里边代表这个action方法参数的方法体
(三)可变数量的参数 (vararg修饰的参数)传几个都行
只有一个参数可以被标记为vararg,当vararg不是最后一个参数时,别的参数传递时需要参数名=“”这样传递,用具名参数这样子传递,编辑器才能区分开
如下,world数组前加一个*星号键,就可以把world里的所有元素当做参数传递给append2
(一)方法的定义:
fun 方法名 (参数列表):返回值{方法体}
参数列表:参数名 冒号 参数类型(多个参数用逗号隔开)
示例:fun getSize (num:Int , num2:Int):Int{}
(二)类的分类
普通类:用class声明
方法调用时,直接类名().方法名(不需要和java一样,不用new)
静态类:用object声明(工具类都用object声明)
方法调用时,直接类名.方法(静态类里都是静态方法,不需要构建实例对象)
伴生类:用处:当想要在普通类class声明的类里,定义静态方法的话,写在companion 里
使用:声明在普通类里边,
因为本来想要调用普通类里的方法时,必须类名().方法名
但是如果此方法在伴生类里,则可以直接类名.方法名(省去了构建实例对象)
如下,可直接Person.test() , 原本Person().test
class Person{
companion object{
fun test(){ }
}
}
(三)方法的参数解释
(1)默认参数:参数可设置默认值,可以减少方法重载的数量
(写默认值的参数可不传)
(2)具名参数
(3)可变数量的参数
(一)kotlin中的集合分类
(1)list(有序且长度可变的列表(因可add,remove),通过get(index)获取某个下标的元素)
(2)set(无序,集合里元素唯一,不会有重复元素)
(3)map(键值对,键唯一,值可重复)
(二)集合的创建方式
(list,map,set分别的创建方式)
(三)集合的一些基本操作,常用的方法
(四)集合的一些变换操作
数组的构造函数,it指数组的下⌚️
psvm 快速生成main方法
显示声明 变量:类型 如 val intNumber:Int
文档地址
http://8.136.122.222/book/primary/
位运算
字符转义。一种通过\;一种通过三个引号形式
float默认十进制保留6位小数
Kotlin中数字不存在隐式的拓宽转换,比如一个函数接受的参数位Double,他只能接受Double类型,而不能接受Float或Int类型
kotlin的优点
富有表现力且简洁:少量代码编写功能,提高工作效率
安全性高:可以避免空指针异常等问题
可互操作:可以与Java相互调用
结构化并发:kotlin协程可以使异步代码像阻塞代码一样易于使用
Kotlin必会必知
泛型 in和out的使用
okhttp
ewcyclerview
materialButtontoggleGroup
materialButton
framelayout
我并没有配置 implementation 'com.google.android.material:material:1.5.0' 为什么 <com.google.android.material.button.MaterialButton /> 仍然可以正常显示?
机器人回答
如果您没有在 build.gradle 文件中添加 implementation 'com.google.android.material:material:1.5.0',而仍然可以在布局文件中使用 <com.google.android.material.button.MaterialButton />,则可能是因为您的项目依赖于另一个库或库中包含该依赖项。
例如,如果您的项目依赖于 androidx.appcompat 库,则 androidx.appcompat 库将包含 MaterialButton 控件的依赖项,因此您无需单独添加它们。在这种情况下,如果您在布局文件中使用 MaterialButton 控件,则它将正常显示,因为它已经在 androidx.appcompat 库中可用。
另外,请注意,如果您在应用程序的主题中使用了 MaterialComponents 主题(例如 Theme.MaterialComponents.Light),则您可以在应用程序中使用 Material Design 控件而不需要单独添加其依赖项。这是因为 MaterialComponents 主题已经包含了这些控件的依赖项。
restful网络请求框架retrofit
接上