在 Android 中,严禁通过构造函数给 Fragment 传参。因为当系统因配置变化(如旋转屏幕)或内存回收后重建 Fragment 时,只会调用无参构造函数,导致你通过构造函数传入的参数全部丢失。
1、添加依赖库
kotlin
dependencies {
...
// Kotlin
implementation("androidx.fragment:fragment-ktx:1.8.9")
}
2、创建Fragment
- 通过 Bundle + setArguments() 来传递参数。
kotlin
package com.android.designui.fragmentnav
import android.graphics.BitmapFactory
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import com.android.designui.databinding.FragmentSwiperImageBinding
class SwiperImageFragment: Fragment() {
companion object {
private const val ARG_PATH = "arg_path"
// 工厂方法:创建带参数的Fragment实例
fun newInstance(path: String): SwiperImageFragment {
val fragment = SwiperImageFragment()
val args = Bundle().apply {
putString(ARG_PATH, path)
}
fragment.arguments = args
return fragment
}
}
private lateinit var viewBinding: FragmentSwiperImageBinding
private var path: String? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 获取创建Fragment时传入的参数
arguments?.let {
path = arguments?.getString(ARG_PATH)
}
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
viewBinding = FragmentSwiperImageBinding.inflate(inflater, container, false)
return viewBinding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
// 将图片添加到 ImageView 控件上
path?.let {
val inputStream = context?.assets?.open(it)
val bitmap = BitmapFactory.decodeStream(inputStream)
viewBinding.image.setImageBitmap(bitmap)
inputStream?.close()
}
}
}
3、打开Fragment
cpp
SwiperImageFragment.newInstance("images/1.jpg")