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()
}