Kotlin 如何去查找控件并使用
方式1:finviewbyId查找控件,并设置属性
class Main5Activity : AppCompatActivity() {
var tv: TextView? = null
/**
* 注意这里不能直接使用,必须是初始化
* var tv: TextView
* */
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main5)
tv = findViewById(R.id.activity_id) as TextView
tv!!.setText("设置文本")
tv!!.setTextSize(20f)
tv!!.setTextColor(Color.parseColor("#123add"))
}
}
方式2: 导入布局,直接通过id设置
1.导包 import kotlinx.android.synthetic.main. activity_main5. * 颜色标注部分是你的布局名称
2.直接通过布局中的id 查找到控件 ,并设置属性
tv.text="包裹布局,设置文本"
1:方式3 :导入布局,直接通过id设置
1.申明一个属性代理
private val tv :TextView by lazy{
findViewById(R.id.tv) as TextView
}
2.直接就可以使用了
tv.text="通过属性代码设置文本书信"
tv.textSize= 20F
3.lazy 是kotlin 属性代理的一个实例,他提供了延迟加载机制,换句话说lazy提供了初始化TextView的方法,不过真正意义上的初始化发生在TextView实例第一次使用的时候 ,lazy默认是线程安全的 ,name如何切换到线程不安全的呢?代码如下:
private val tv :TextView by lazy(LazyThreadSafetyMode.NONE){
findViewById(R.id.tv) as TextView
}
注意:这里lazy属性代理,前面的修饰符只能是 val 不能是var,如果是var修饰可以采用下面这种方式来解决
lateinit 的使用还是有很多限制的,比如只能在不可 null 的对象上使用,比须为var,不能为 primitives(Int、Float之类)等等,不过这样逼迫你一定要初始化这个变量的做法,确实能减少我们在开发中的遗漏,从而提高开发效率。
至于 lazy 技术,实际上是 Delegate Properties 的一个应用,也就是属性代理了。在 Kotlin 当中,声明成员属性,除了直接赋值,还可以用 Delegate 的方式来声明,这个 Delegate 需要根据成员的类型(val 或者 var)来提供相应的 getValue 和 setValue 方法,比如一个可读写的 Delegate,需要提供下面的方法:
下面通过一个例子来说明自定义Delegate,来访问SharePreference
然后我们就可以使用了,不需要关系SharedPreference了,下面是使用的代码
于是我们再也不需要重复写那些 getSharedPreference,也不用 edit、commit,再见那些 edit 之后忘了 commit 的日子。有没有觉得非常赞!