getArguments() 总是在我的第二个片段中返回 null
getArguments() always returning null in my second fragment
我知道这个问题被问了太多次,但 none 证明对我有用。
我正在尝试使用接口将 Fragment1 的 EditText 中的输入传递给 Fragment2 中的 TextView,并且两者共享一个 Activity,但我已经坚持了一天多了。问题是我从 MainActivity 发送的参数总是空的。
这是我的界面:
interface SendData {
fun sendData(name: String)
}
和 Fragment1.kt:
class Fragment1 : Fragment() {
private lateinit var communicator: SendData
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val rootView = inflater.inflate(R.layout.fragment1_layout, container, false)
communicator = activity as SendData
rootView.btn_send.setOnClickListener {
communicator.sendData(rootView.name_ET.text.toString())
}
return rootView
}
}
Fragment2.kt
class Fragment2 : Fragment() {
var receivedName: String? = ""
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
receivedName = arguments?.getString("NAME")
Log.d("Fragment2", "Receiving: ${arguments.toString()}")
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val rootView = inflater.inflate(R.layout.fragment2_layout, container, false)
rootView.receivedName_TV.text = receivedName
return rootView
}
}
还有 MainActivity.kt
class MainActivity : AppCompatActivity(), SendData {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
supportFragmentManager.beginTransaction().replace(R.id.fragment_container, Fragment1())
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE).commit()
}
override fun sendData(name: String) {
Fragment2().apply {
arguments = Bundle().apply {
putString("NAME", name)
}
Log.d("Fragment1", "Sending: ${arguments.toString()}")
}
supportFragmentManager.beginTransaction().replace(R.id.fragment_container, Fragment2())
.addToBackStack("Fragment2").setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE).commit()
}
}
我正在使用 resource,我什至逐行比较了我的代码和他们的代码,但我看不出我做错了什么。
感谢您提前提供帮助。
您正在呼叫
supportFragmentManager.beginTransaction().replace(R.id.fragment_container, Fragment2())
在新片段上应用,而不是您使用的片段
尝试
supportFragmentManager.beginTransaction().replace(R.id.fragment_container, Fragment2().apply {
arguments = Bundle().apply {
putString("NAME", name)
})
并删除上面这部分
Fragment2().apply {
arguments = Bundle().apply {
putString("NAME", name)
}
基本上我想说的是你的函数应该是这样的
override fun sendData(name: String) {
supportFragmentManager.beginTransaction().replace(R.id.fragment_container, Fragment2().apply {
arguments = Bundle().apply {
putString("NAME", name)
}
})
.addToBackStack("Fragment2").setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE).commit()
}
或
override fun sendData(name: String) {
val f =Fragment2().apply {
arguments = Bundle().apply {
putString("NAME", name)
}
Log.d("Fragment1", "Sending: ${arguments.toString()}")
}
supportFragmentManager.beginTransaction().replace(R.id.fragment_container, f)
.addToBackStack("Fragment2").setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE).commit()
}
我知道这个问题被问了太多次,但 none 证明对我有用。 我正在尝试使用接口将 Fragment1 的 EditText 中的输入传递给 Fragment2 中的 TextView,并且两者共享一个 Activity,但我已经坚持了一天多了。问题是我从 MainActivity 发送的参数总是空的。
这是我的界面:
interface SendData {
fun sendData(name: String)
}
和 Fragment1.kt:
class Fragment1 : Fragment() {
private lateinit var communicator: SendData
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val rootView = inflater.inflate(R.layout.fragment1_layout, container, false)
communicator = activity as SendData
rootView.btn_send.setOnClickListener {
communicator.sendData(rootView.name_ET.text.toString())
}
return rootView
}
}
Fragment2.kt
class Fragment2 : Fragment() {
var receivedName: String? = ""
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
receivedName = arguments?.getString("NAME")
Log.d("Fragment2", "Receiving: ${arguments.toString()}")
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val rootView = inflater.inflate(R.layout.fragment2_layout, container, false)
rootView.receivedName_TV.text = receivedName
return rootView
}
}
还有 MainActivity.kt
class MainActivity : AppCompatActivity(), SendData {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
supportFragmentManager.beginTransaction().replace(R.id.fragment_container, Fragment1())
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE).commit()
}
override fun sendData(name: String) {
Fragment2().apply {
arguments = Bundle().apply {
putString("NAME", name)
}
Log.d("Fragment1", "Sending: ${arguments.toString()}")
}
supportFragmentManager.beginTransaction().replace(R.id.fragment_container, Fragment2())
.addToBackStack("Fragment2").setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE).commit()
}
}
我正在使用 resource,我什至逐行比较了我的代码和他们的代码,但我看不出我做错了什么。 感谢您提前提供帮助。
您正在呼叫
supportFragmentManager.beginTransaction().replace(R.id.fragment_container, Fragment2())
在新片段上应用,而不是您使用的片段 尝试
supportFragmentManager.beginTransaction().replace(R.id.fragment_container, Fragment2().apply {
arguments = Bundle().apply {
putString("NAME", name)
})
并删除上面这部分
Fragment2().apply {
arguments = Bundle().apply {
putString("NAME", name)
}
基本上我想说的是你的函数应该是这样的
override fun sendData(name: String) {
supportFragmentManager.beginTransaction().replace(R.id.fragment_container, Fragment2().apply {
arguments = Bundle().apply {
putString("NAME", name)
}
})
.addToBackStack("Fragment2").setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE).commit()
}
或
override fun sendData(name: String) {
val f =Fragment2().apply {
arguments = Bundle().apply {
putString("NAME", name)
}
Log.d("Fragment1", "Sending: ${arguments.toString()}")
}
supportFragmentManager.beginTransaction().replace(R.id.fragment_container, f)
.addToBackStack("Fragment2").setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE).commit()
}