【Android】创建带参数的 Fragment

在 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")
相关推荐
镜象科技1 小时前
中小学AI心理健康解决方案服务商怎么选?2026年选型参考
android·java·人工智能
脚踏实地,坚持不懈!1 小时前
从 AOSP 源码角度分析 Android 定位性能问题
android
悟道子HD2 小时前
网络安全基本功——MySQL基础
android·mysql·web安全
纪念 2292 小时前
C++ string(三)
android·c++
纪念 2292 小时前
c++ string(最终篇)
android·c++
aqi0011 小时前
鸿蒙版本的电子书阅读APP开放源码啦
android·华为·ai编程·harmonyos·鸿蒙
墨天梦11 小时前
B19_SunnyWeather到阅读客户端
android·kotlin
美狐美颜sdk12 小时前
直播APP源码可以直接接入视频美颜sdk吗?技术方案详解
android·人工智能·音视频·美颜sdk·直播美颜sdk
用户693717500138415 小时前
2026,程序员的时代拐点到了
android·前端·后端
浪潮IT馆17 小时前
Android Studio 非最新版本下载安装教程
android·ide·android studio