Kotlin 开发Android笔记之Kotlin开发篇

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()
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值