本文章是建立在
利用 Kotlin 的特性,让 Intent 传递数据的方式更优雅
基础上进行调整的,你需要先了解此文章的相关内容再看本文
根据利用 Kotlin 的特性,让 Intent 传递数据的方式更优雅
最后使用的结果就为
class Activity : AppCompatActivity() {
companion object IntentOptions {
var Intent.id by IntentExtraString()
var Intent.name by IntentExtraString()
var Intent.message by IntentExtraString()
}
fun test(intent: Intent) {
intent.id = "1"
intent.name = "pass"
intent.message = "message"
}
}
fun testOutSide(intent: Intent) = with(Activity.IntentOptions) {
val id = intent.id
val name = intent.name
val message = intent.message
}
但此需要定义后每一个Activity对应都需要扩展一次参数,个人嫌太麻烦
便把Intent扩展放到底层BaseActivity中,但这样就变得麻烦,id扩展只能为String,但有可能为Int.这样就没办法扩展,于是定义一个Any的委托
class IntentExtra(private val key: String? = null) {
private val KProperty<*>.extraName: String
get() = this@IntentExtra.key ?: name
operator fun getValue(intent: Intent, property: KProperty<*>): Any? =
intent.extras?.get(property.extraName)
operator fun setValue(intent: Intent, property: KProperty<*>, any: Any?) {
//简单添加几个常用类型,可以扩展添加其他类型
when (any) {
is String ->
intent.putExtra(property.extraName, any)
is Int ->
intent.putExtra(property.extraName, any)
is Boolean ->
intent.putExtra(property.extraName, any)
is Parcelable ->
intent.putExtra(property.extraName, any)
is Serializable ->
intent.putExtra(property.extraName, any)
}
}
}
主要注意在 intent.putExtra无法传入Any.则在setValue中做了类型判断.这里先做几个简单的类型,自己可根据情况扩展
定义好几个常用参数,这些扩展参数在自己项目中基本够用了,同时定义Any类型,这样也可以减少创建的大量的扩展变量
(定义的这些扩展变量其实也可以设置顶级作用域中,这样更方便取值,但不确定这种方式会不会有其他影响,并未设置,如果有清楚的小伙伴可以告诉我)
var Intent.id by IntentExtra()
var Intent.value by IntentExtra()
var Intent.status by IntentExtra()
var Intent.url by IntentExtra()
var Intent.type by IntentExtra()
var Intent.module by IntentExtra()
最后在使用时只要在不同activity中取值转换好对应传入值类型
class OneActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_one)
val id = intent.id as String;
}
}
class TwoActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_one)
val id = intent.id as Int;
}
}
网友评论