Kotlin中如何将Session ID从Activity传递到Fragment并正确获取
现有代码核心错误点
- Intent仅用于启动Activity、服务、广播组件,无法直接启动Fragment,你用
Intent(baseContext, MenuFragment::class.java)再调用startActivity的写法本身不符合Android组件调用规则,Fragment需要通过FragmentManager的事务进行加载。 - 你在Fragment的
onCreateView方法里把取值代码写在了return语句之后,这部分代码永远不会被执行,属于不可达代码。 - Fragment中不存在
intent1这个变量,你在Activity中定义的局部变量intent1无法被Fragment直接访问。
正确修改方案
1. 修改Activity加载Fragment的代码
把原来用Intent启动Fragment的代码替换为Fragment事务传参的写法:
// 方式1:直接传参 val menuFragment = MenuFragment() val bundle = Bundle() bundle.putString("EXTRA_SESSION_ID", userEnteredEmail) menuFragment.arguments = bundle // R.id.fragment_container是你布局中用来承载Fragment的容器控件ID supportFragmentManager.beginTransaction() .replace(R.id.fragment_container, menuFragment) .commit() // 方式2:配合Fragment的newInstance方法使用(更规范,推荐) val menuFragment = MenuFragment.newInstance(userEnteredEmail) supportFragmentManager.beginTransaction() .replace(R.id.fragment_container, menuFragment) .commit()
2. 修改Fragment的取值代码
调整代码位置,通过arguments获取传递的参数:
import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment import kotlinx.android.synthetic.main.fragment_menu.* class MenuFragment : Fragment() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) } override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { return inflater.inflate(R.layout.fragment_menu, container, false) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) // 在这里获取传递的Session ID val sessionId = arguments?.getString("EXTRA_SESSION_ID") // 后续可直接使用sessionId变量 } companion object { // 官方推荐的Fragment传参封装写法 @JvmStatic fun newInstance(sessionId: String) = MenuFragment().apply { arguments = Bundle().apply { putString("EXTRA_SESSION_ID", sessionId) } } } }
内容的提问来源于stack exchange,提问作者ABI
相关产品推荐
相关产品推荐

