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

之前Java的一直顺手就写了,在写Kt时有点小不同,为了省得忘记,顺便做个笔记

基础过度

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

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

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")
根据提供的引用内容,出现了两个关于Kotlin的错误信息。第一个引用中显示了一个无法解析依赖的错误,指出无法下载kotlin-reflect.jar文件。第二个引用中显示了一个关于kotlin-gradle-1.8.10.jar (org.jetbrains.kotlin:kotlin-reflect)",这个错误通常是由于Gradle无法找到所需的kotlin-reflect库而引起的。解决这个问题的方法是确保你的项目的Gradle配置正确,并且指定了正确的Kotlin版本。 你可以尝试以下几个步骤来解决这个问题: 1. 确保你的项目的build.gradle文件中包含了正确的Kotlin版本和kotlin-gradle-plugin版本。你可以在build.gradle文件中找到类似于以下代码的部分: ```groovy ext { kotlin_version = '1.8.10' } dependencies { // ... implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" // ... } buildscript { // ... dependencies { // ... classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // ... } } ``` 请确保kotlin_version变量的值与你想要使用的Kotlin版本一致,并且在dependencies和buildscript的classpath中正确引用了kotlin-gradle-plugin。 2. 如果你已经确认了build.gradle文件中的配置正确无误,那么可能是因为Gradle无法从远程仓库下载kotlin-reflect.jar文件。你可以尝试清除Gradle的缓存并重新构建项目。在命令行中执行以下命令: ```shell ./gradlew clean ``` 然后重新构建项目: ```shell ./gradlew build ``` 这将清除Gradle的缓存并重新下载所需的依赖。 3. 如果上述步骤***切换到其他网络环境来解决这个问题。 希望以上步骤能够帮助你解决问题。如果你还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

远方那座山

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值