【问题标题】:getArguments() always returning null in my second fragmentgetArguments() 在我的第二个片段中总是返回 null
【发布时间】:2020-10-10 01:12:35
【问题描述】:

我知道这个问题被问了太多次,但没有一个证明对我有用。 我正在尝试使用接口将 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,我什至将我的代码与他们的代码逐行进行了比较,但我看不出我做错了什么。 感谢您提前提供帮助。

【问题讨论】:

    标签: android android-fragments kotlin parameter-passing mobile-application


    【解决方案1】:

    你在打电话

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

    【讨论】:

    • 哇。我真的很感激这一点。现在好了。我根本没想到这是问题所在。 :)
    猜你喜欢
    • 1970-01-01
    • 2012-09-13
    • 1970-01-01
    • 1970-01-01
    • 2016-02-17
    • 1970-01-01
    • 1970-01-01
    • 2013-03-30
    相关资源
    最近更新 更多