Kotlin实战基础 - Activity、Fragment传递参数

发布时间 2023-04-26 16:16:57作者: cps666

基础过度

在我的认知中,关于Activity → FragmentFragment → Fragment 传值方式一般有以下几种

  • 传统setArguments方式,主要是通过Bundle传递
  • 接口回调
  • 类似EventBus三方框架
  • 除传统方式外,主要是采用的是观察者模式

      • Java 版本
        • Activity之间传递数据
        • Activity 传值到 Fragment
      • Kotlin 版本
        • Activity 之间传递数据
          • 基本类型数据
          • 数组
          • 集合(基本类型)
          • 对象(data class)
          • 集合(对象)
        • Activity 传值到 Fragment
          • 传统方式
          • instantiate 方式

Java 版本

Activity之间传递数据

可直接前往 → 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 之间传递数据

Java版本:Activity之间数据传递

我有点懒,直接copy了这里的伪代码,做个笔记 ~

基本类型数据

传递

 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")