熬夜再战Android之修炼Kotlin-【findView】篇
前提
前面我们学了Kotlin语言,趁热打铁我们试试Kotlin在Android中的应用。
如果是新手,请先学完Android基础。
推荐先看小空之前写的熬夜Android系列,再来尝试。
👉实践过程
😜方式一
使用扩展,如果你第一次创建项目的时候选择的是Kotlin语言,则默认带有该插件,如果选择的默认是Java语言,则需要手动添加。
该方式的优点就是对编程人员来说可以直接拿到View的id,不需要定义变量和findViewById。
在项目的build文件开头添加【app->build.gradle】
apply plugin: 'kotlin-android-extensions'
之后在Activity中添加import,固定格式的。
import kotlinx.android.synthetic.main.修改为你的布局名称.*
【*】代表的是该布局下的所有控件,如果只需要指定控件,将【*】改为控件名即可,如下示例
import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.activity_main.mytextview
之后就可以直接在代码中使用控件的id来进行响应操作了。
<TextView
android:id="@+id/myText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="8dp"
android:text="芝麻粒儿和空名先生"
android:textStyle="bold"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
但是方便的同时,问题的隐患也存在着,在底层仍然回归原始使用的是findViewById,所以会对性能有影响。
😜方式二
使用findViewById,这个仍然有两种方式,方式一是【lateinit】关键字,但是存在坑,详情看这(在 Kotlin 代码中慎用 lateinit 属性zhuanlan.zhihu.com/p/31297995 )
推荐方式二使用【lazy】,如下:
private val myText: TextView by lazy { findViewById<TextView>(R.id.myText) }
private val myImg: ImageView by lazy { findViewById<ImageView>(R.id.myImg) }
private val imageView: ImageView by lazy { findViewById<ImageView>(R.id.imageView) }
private val myBtn: Button by lazy { findViewById<Button>(R.id.myBtn) }
上面是在Activity中的使用,而在Fragment中又怎么用呢?
class LoginFragment : Fragment() {
private var myText: TextView? = null
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
//设置布局
return inflater.inflate(R.layout.login_fragment, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
myText = view.findViewById(R.id.myText)
myText?.setText("动态修改文本")
}
}
除了上面的写法,Android官方给了我们更好的解决方案:
class LoginFragment : Fragment() {
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
//设置布局
return inflater.inflate(R.layout.login_fragment, container, false)
}
private lateinit var myText: TextView
private lateinit var myImg: ImageView
private lateinit var imageView: ImageView
private lateinit var myBtn: Button
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
//查找view
myText = view.findViewById(R.id.myText)
myImg = view.findViewById(R.id.myImg)
imageView = view.findViewById(R.id.imageView)
myBtn = view.findViewById(R.id.myBtn)
}
}
还有另外方式就是使用自动化插件,在【File-Setting-Plugins】市场搜索关键字【findview】,看最新的几个,挑选自己用的顺手的使用即可。
作者:芝麻粒儿
链接:https://juejin.cn/post/7021457050496401415
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。