Kotlin实战基础 - Activity、Fragment传递参数
基础过度
在我的认知中,关于Activity → Fragment
、Fragment → Fragment
传值方式一般有以下几种
- 传统
setArguments
方式,主要是通过Bundle
传递 - 接口回调
- 类似
EventBus
三方框架 - 除传统方式外,主要是采用的是
观察者模式
-
-
- Java 版本
-
- Activity之间传递数据
- Activity 传值到 Fragment
- Kotlin 版本
-
- Activity 之间传递数据
-
- 基本类型数据
- 数组
- 集合(基本类型)
- 对象(data class)
- 集合(对象)
- Activity 传值到 Fragment
-
- 传统方式
- instantiate 方式
-
Java 版本
Activity之间传递数据
Activity 传值到 Fragment
-
传递
TestFragment testFragment= new TestFragment();
Bundle args = new Bundle();
args.putInt("id", 666);
testFragment.setArguments(args); -
接收
Bundle bundle = getArguments();
id = bundle.getInt("id");
伪代码示例
if (null == testFragment) {
testFragment= new TestFragment();
}
Bundle bundle = new Bundle();
bundle.putString("name", "拍照");
testFragment.setArguments(bundle);
//方法一传参数
Fragment instantiate = TestFragment.instantiate(this, TestFragment.class.getName(), bundle);
//方法二传参数
getSupportFragmentManager().beginTransaction().replace(R.id.ll_replace, instantiate).addToBackStack(this.getClass().getSimpleName()).commit();
// getSupportFragmentManager().beginTransaction().replace(R.id.ll_replace, takePhotoFragment).addToBackStack(this.getClass().getSimpleName()).commit();
Kotlin 版本
只要是熟悉Kotlin语法的朋友,应该不用看,更多的是为了从Java刚转到Kt的朋友,gogogo ~
Activity 之间传递数据
基本类型数据
传递
val bundle = Bundle()
bundle.putString("String", "text")
bundle.putInt("Int", 2)
val intent = Intent(this, BActivity::class.java)
intent.putExtras(bundle)
startActivity(intent)
接收
val bundle = intent.extras
val int = bundle?.getInt("Int")
val string = bundle?.getString("String")
数组
-
传递
val bundle = Bundle()
val array = arrayOf("元素1", "元素2")
bundle.putStringArray("array", array)
val intent = Intent(this, BActivity::class.java)
intent.putExtras(bundle)
startActivity(intent) -
接收
val bundle = intent.extras
val array = bundle?.getStringArray("array")
集合(基本类型)
-
传递
val bundle = Bundle()
val arrayList = arrayListOf("元素1", "元素2")
bundle.putStringArrayList("arrayList", arrayList)
val intent = Intent(this, BActivity::class.java)
intent.putExtras(bundle)
startActivity(intent) -
接收
val bundle = intent.extras
val arrayList = bundle?.getStringArrayList("arrayList")
关于Kt序列化的部分,我之后会补入一篇的!!!
对象(data class)
传递
val bundle = Bundle()
val data = TextData(true, "测试", "数据")
bundle.putParcelable("textData", data)
val intent = Intent(this, BActivity::class.java)
intent.putExtras(bundle)
startActivity(intent)
接收
val bundle = intent.extras
val data = bundle?.getParcelable<TextData>("textData")
Log.e("TAG", "object: $data")
注意这里的data class 需要序列化, 我们可以通过注解@Parcelize简化代码
import android.os.Parcelable
import kotlinx.android.parcel.Parcelize
@Parcelize
data class TextData(
val result: Boolean,
val note: String,
val `data`: String
) : Parcelable
集合(对象)
传递
val bundle = Bundle()
val data1 = TextData(true, "成功", "成功数据")
val data2 = TextData(false, "失败", "失败数据")
val objectArrayList = arrayListOf(data1, data2)
bundle.putParcelableArrayList("objectArrayList", objectArrayList)
val intent = Intent(this, BActivity::class.java)
intent.putExtras(bundle)
startActivity(intent)
接收
val bundle = intent.extras
val objectArrayList = bundle?.getParcelableArrayList<TextData>("objectArrayList")
Log.e("TAG", "getData: $objectArrayList")
Activity传参到Fragment
Activity 传值到 Fragment
传统方式
-
发送方
val fragment = MvPagerFragment()
val bundle = Bundle()
bundle.putString("args", "靓仔")
fragment.arguments = bundle -
接收方
var any = arguments?.get("args")
instantiate 方式
instantiate 方式可能已过时,但目前尚可使用
-
发送方
val bundle = Bundle()
bundle.putString("type", "1")
var personalCollectionFragment =
Fragment.instantiate(this, PersonalCollectionFragment::class.java.name, bundle)//以下是我在项目中用到的一段伪代码,可以借鉴
binding.vp.adapter = object : FragmentStateAdapter(this) {
override fun createFragment(position: Int) = when (position) {
0 -> PersonalDynamicFragment()
1 -> personalCollectionFragment
else -> PersonalLikeFragment()
}override fun getItemCount() = titleList.size
}
-
接收方
var any = arguments?.get("type")