Kotlin 开发Android笔记之Kotlin开发篇
省略findViewById()方法
正常写法:
val btn = findViewById<Button>(R.id.btn)
btn.setOnClickListener {
Toast.makeText(this,"提示",Toast.LENGTH_SHORT).s
}
但Kotlin项目在创建的时候引用了插件apply plugin: ‘kotlin-android-extensions’,所以就能省略findViewById,从而简写。推荐写法:需要导入btn控件的包:
import kotlinx.android.synthetic.main.activity_main.*
btn.setOnClickListener {
Toast.makeText(this,"提示",Toast.LENGTH_SHORT).show()
}
在Activity中使用Menu
在activity中重写onCreateOptionsMenu方法:
/**
* 显示布局,返回false不显示menu
*/
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
menuInflater.inflate(R.menu.main,menu)
return true
}
main资源文件的布局:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/add_item"
android:title="Add"/>
<item android:id="@+id/remove_itrm"
android:title="Remove"/>
</menu>
设置菜单执行操作:
/**
* 菜单执行操作
*/
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when(item.itemId){
R.id.add_item -> Toast.makeText(this,"You Clicked Add",Toast.LENGTH_SHORT).show()
R.id.remove_itrm -> Toast.makeText(this,"You Clicked Remove",Toast.LENGTH_SHORT).show()
}
return true
}
Intent跳转Activity
显式的跳转:
//FirstActivity::class.java相当于java中的FirstActivity.class
val intent = Intent(this,FirstActivity::class.java)
startActivity(intent)
隐式的跳转:
首先在要响应的Activity中配置<intent - filter>
activity android:name=".activity.FirstActivity">
<intent-filter>
<!--指明当前activity可以响应的action-->
<action android:name="com.xie.learnkotlin1.ACTION_START"/>
<!--指明一些附加信息-->
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
//隐式跳转,需要在配置文件要跳转的Activity中注明action和category
val intent = Intent("com.xie.learnkotlin1.ACTION_START")
//Category为DEFAULT时可以不用写。
intent.addCategory("android.intent.category.DEFAULT")
startActivity(intent)
快速定位当前页面是哪一个Activity
在项目所有Activity的基类里面添加打印:
Log.d("BaseActivity",javaClass.simpleName)
javaClass.simpleName会输出当前页面的名称:
2020-09-07 21:29:13.908 1704-1704/com.xie.learnkotlin1 D/BaseActivity: MainActivity
2020-09-07 21:29:20.097 1704-1704/com.xie.learnkotlin1 D/BaseActivity: FirstActivity
Kotlin语言实现多个控件的点击事件
首先XML布局中添加:
android:onClick="onClick"
在对应的activity中实现onClick方法:
fun onClick(view: View) {
when(view?.id){
R.id.btn1 ->{
//点击事件逻辑
}
R.id.btn2 ->{
//点击事件逻辑
}
R.id.btn2 ->{ob
//点击事件逻辑
}
}
}
Kotlin开始使用AlertDialog
使用apply函数来实现:
AlertDialog.Builder(this).apply {
setTitle("This is Dialog")
setMessage("something impotent")
setCancelable(false)
setPositiveButton("OK"){
dialog, which ->
}
setNegativeButton("Cancel"){
dialog, which ->
}
show()
}
Kotlin隐藏状态栏
放到对应activity的oncreate()方法里面即可,最好放到基类里面,这样就不用每个activity都重复写
supportActionBar?.hide()
Kotlin自定义集成组件
以标题栏为例:
先布局layout_title.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:id="@+id/back"
android:text="back"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/title_text"
android:layout_centerInParent="true"
android:text="Title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<Button
android:layout_alignParentRight="true"
android:id="@+id/edit"
android:text="EDIT"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</RelativeLayout>
然后定义一个TtitleLayout来继承LinearLayout:
/**
* 自定义集成标题栏
*/
class TitleLayout (context: Context, attrs:AttributeSet): LinearLayout(context,attrs){
init {
//引入标题栏布局
LayoutInflater.from(context).inflate(R.layout.layout_title,this)
back.setOnClickListener {
//as 用于Kotlin里面的类型强转
val activity = context as Activity
activity.finish()
}
edit.setOnClickListener {
Toast.makeText(context,"You clicked EditButton",Toast.LENGTH_SHORT).show()
}
}
}
最后使用时直接在布局里面加入该控件即可
<com.xie.learnkotlin1.ui.TitleLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
Kotlin延迟初始化
延迟初始化使用lateinit关键字。
private lateinit var string:String
变量在延迟初始化后,后续即使不对该变量进行非空判断,一样的可以正常编译,但这样做的风险就是我们在调用该变量之前一定要确保已经初始化,不然程序就会崩溃。所以要慎用
判断变量是否已经初始化
if(::string.isLateinit){ //表示已经初始化
}
if(!::string.isLateinit){ //表示没有初始化
}
Kotlin函数扩展
函数扩展的意思是即使在不修改某个类的源码的其情况下,仍然可以打开这个类,向该类添加新的函数。
函数扩展的语法结构:
fun ClassName.methodName(Param1:Int,param2:Int):Int{
return 0
}
实例:统计字符串中的字母数量:
fun String.letterCount():Int{
var count=0
for (char in this){
if (char.isLetter()) {
count++
}
}
return count
}
调用的时候:
"ASCxfger23dfr".letterCount()