getArguments () всегда возвращает null во втором фрагменте - PullRequest
0 голосов
/ 19 июня 2020

Я знаю, что этот вопрос задавали слишком много раз, но ни один из них не работает для меня. Я пытаюсь передать ввод в EditText из Fragment1 в TextView во Fragment2, используя интерфейс, и оба разделяют одно действие, но я застрял в нем уже больше суток. Проблема в том, что аргумент, который я отправляю из 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()
    }
}

Я использую ресурс , и я даже сравнил свой код с их строкой линии, и я не вижу, что делаю не так. Заранее спасибо за помощь.

1 Ответ

1 голос
/ 19 июня 2020

Вы вызываете

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