You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Kotlin中Fragment传递变量为空问题求助

问题分析与修复方案

你的代码存在三个核心问题导致Fragment无法获取到参数:

1. ViewPager加载的Fragment并非你设置参数的实例

在ProfileActivity中,你手动创建了一个带参数的ProfileFragment实例,但ViewPager的Adapter(MyAdapter)在createFragment方法里又new了一个全新的ProfileFragment(),这个新实例没有任何参数,所以自然是null。

2. Fragment成员变量被局部变量覆盖

在ProfileFragment的onCreate方法中,你重新声明了局部变量userNameConst等,这会覆盖类的成员变量,导致成员变量始终为初始值null。

3. 传参的Key不匹配

ProfileActivity中用"name"等字符串作为Bundle的Key,而Fragment中却用companion object里的SENDING_NAME(值为"mqttAndroidClientAddress")去获取,两者完全不对应,肯定拿不到值。


修复步骤

步骤1:修改ProfileActivity,将参数传递给Adapter

class ProfileActivity : AppCompatActivity() {
    private var tabTitle = arrayOf("Perfil", "Actividades", "Membresia")

    @SuppressLint("ResourceType")
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_profile)
        
        val pager = findViewById<ViewPager2>(R.id.viewPagerProfile)
        val tabLayout = findViewById<TabLayout>(R.id.profileMenu)

        // 从Intent中获取参数
        val b = intent.extras
        val name = b?.getString("name") ?: ""
        val address = b?.getString("address") ?: ""
        val userEmail = b?.getString("email") ?: ""
        val phone = b?.getString("phone") ?: ""
        val password = b?.getString("password") ?: ""

        // 将参数传给Adapter
        pager.adapter = MyAdapter(supportFragmentManager, lifecycle, name, address, userEmail, phone, password)

        TabLayoutMediator(tabLayout, pager) { tab, position ->
            tab.text = tabTitle[position]
        }.attach()
    }
}

步骤2:修改MyAdapter,接收参数并创建带参的ProfileFragment

class MyAdapter(
    fragmentManager: FragmentManager,
    lifecycle: Lifecycle,
    private val userName: String,
    private val userAddress: String,
    private val userEmail: String,
    private val userPhone: String,
    private val password: String
) : FragmentStateAdapter(fragmentManager, lifecycle) {
    override fun getItemCount(): Int {
        return 3
    }

    override fun createFragment(position: Int): Fragment {
        return when (position) {
            0 -> ProfileFragment.newInstance(userName, userAddress, userEmail, userPhone, password)
            1 -> SportFragment()
            2 -> EventFragment()
            else -> MessageFragment()
        }
    }
}

步骤3:修复ProfileFragment的变量覆盖和Key匹配问题

class ProfileFragment : Fragment() {
    private var userNameConst: String? = null
    private var userAddressConst: String? = null
    private var userEmailConst: String? = null
    private var userPhoneConst: String? = null
    private var passwordConst: String? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // 去掉var,直接给成员变量赋值
        userNameConst = arguments?.getString(SENDING_NAME)
        userAddressConst = arguments?.getString(SENDING_ADDRESS)
        userEmailConst = arguments?.getString(SENDING_EMAIL)
        userPhoneConst = arguments?.getString(SENDING_PHONE)
        passwordConst = arguments?.getString(SENDING_PASSWORD)
    }

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val view = inflater.inflate(R.layout.fragment_profile, container, false)

        val editUserName = view.findViewById<EditText>(R.id.userName)
        val userAddresEdit = view.findViewById<EditText>(R.id.userAddress)
        val userEmailEdit = view.findViewById<EditText>(R.id.userEmailText)
        val userPhoneEdit = view.findViewById<EditText>(R.id.userPhone)
        val userPasswordEdit = view.findViewById<EditText>(R.id.userPasswordEdit)

        // 用?:处理null情况,避免toString()抛出空指针
        editUserName.setText(userNameConst ?: "")
        userAddresEdit.setText(userAddressConst ?: "")
        userEmailEdit.setText(userEmailConst ?: "")
        userPhoneEdit.setText(userPhoneConst ?: "")
        userPasswordEdit.setText(passwordConst ?: "")

        return view
    }

    companion object {
        const val SENDING_NAME = "name"
        const val SENDING_ADDRESS = "address"
        const val SENDING_EMAIL = "email"
        const val SENDING_PHONE = "phone"
        const val SENDING_PASSWORD = "password"

        @JvmStatic
        fun newInstance(
            userName: String,
            userAddress: String,
            userEmail: String,
            userPhone: String,
            password: String
        ): ProfileFragment {
            val args = Bundle().apply {
                putString(SENDING_NAME, userName)
                putString(SENDING_ADDRESS, userAddress)
                putString(SENDING_EMAIL, userEmail)
                putString(SENDING_PHONE, userPhone)
                putString(SENDING_PASSWORD, password)
            }
            return ProfileFragment().apply { arguments = args }
        }
    }
}

步骤4:(可选)优化MainActivity的传参方式

可以直接用Intent的putExtra方法,不需要额外创建Bundle,代码更简洁:

// MainActivity的login方法中替换原传参代码
val intent = Intent(this, ProfileActivity::class.java).apply {
    putExtra("name", name)
    putExtra("address", address)
    putExtra("email", email)
    putExtra("phone", phone)
    putExtra("password", password)
}
startActivity(intent)

内容的提问来源于stack exchange,提问作者scorpions78

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 04:54:12