本文主要用于记录自己开发过程中觉得好用的编码技巧,主要来自于第三版的《第一行代码Android》以及博客。

启动Activity

常见的启动Activity的方法是

val intent = Intent(this, MyActivity::class.java)
intent.putExtra("param1", "data1")
intent.putExtra("param2", "data2")
startActivity(intent)

使用这种方法每次都要重复编码,且容易忘记需要传递的参数的信息,可以通过在Activity中定义静态方法来简化,如下所示:

class MyActivity : AppCompatActivity(){
...
companion object {
fun actionStart(context: Context, data1:String, data2:String) {
val intent = Intent(context, MyActivity::class.java)
intent.putExtra("param1", data1)
intent.putExtra("param2", data2)
context.startActivity(intent)
}
}
}

需要启动MyActivity时,只要调用MyActivity.actionStart(this, "data1", "data2)即可。

视图绑定

书中提到了kotlin-android-extensions插件可以使开发人员直接通过id来使用控件,而不再需要findviewbyid。但是在新版的Android Studio中,该插件默认不启用。手动启用后,会提示我们插件已经被废弃了。而视图绑定(View Binding )作为jetpack的一部分,提供了类似的功能。

想要启用该功能,首先需要配置模块层级的build.gradle文件:

android {
...
buildFeatures {
viewBinding true
}
}

如果某个布局文件不需要该功能,则可以添加tools:viewBindingIgnore="true"

之后的使用方法参考:View Bindingkotlin-android-extensions插件也被废弃了?扶我起来

全局获取Context

可以定制一个Application类,管理一些全局的状态信息。

class MyApplication : Application() {
companion object {
@SuppressLint("StaticFieldLeak")
lateinit var context: Context
}

override fun onCreate() {
super.onCreate()
context = applicationContext
}
}

并在AndoridManifest.xml中的标签下,指定name为该类即可,如:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="x.x.x">
<application
android:name=".MyApplication"
android:allowBackup="true"
...>
<activity android:name=".MainActivity">
...
</activity>
</application>
</manifest>

这样,通过MyApplication.context即可使用Context了。

简化Toast

Toast可以显示字符串或者字符资源,普通用法为:

Toast.makeText(this, "String", Toast.LENGTH_SHORT).show()

可以通过扩展函数和上一节的全局context进行简化:

// 用法:"String".showToast()
fun String.showToast(duration: Int = Toast.LENGTH_SHORT) {
Toast.makeText(MyApplication.context, this, duration).show()
}

// 用法:R.string.app_name.showToast()
fun Int.showToast(duration: Int = Toast.LENGTH_SHORT) {
Toast.makeText(MyApplication.context, this, duration).show()
}