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
相关产品推荐
相关产品推荐

