Data is not transferred from activity to fragment

I'm trying to write a data transfer from an activity to a fragment, but I'm catching "NullPointerException" Code MainActivity:

val btn1 = findViewById<Button>(R.id.button)
        btn1.setOnClickListener {
            BlankFragment2.getNewInstance(321)
            val fm = supportFragmentManager
            val ft = fm.beginTransaction()
            ft.replace(R.id.fragment, BlankFragment2())
            ft.commit()
        }

Code Fragment:

class BlankFragment2 : Fragment() {
    var str: Int = 0
    companion object {
        fun getNewInstance(args: Int): BlankFragment2 {
            val fragment = BlankFragment2()
            fragment.arguments?.putInt("one", args)
            return fragment
        }
    }
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        // Inflate the layout for this fragment
        str = arguments!!.getInt("one")
        
        return inflater.inflate(R.layout.fragment_blank2, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        val txt = view.findViewById<TextView>(R.id.textTest)
        txt.text = str.toString()
    }
}

I know about protection against null-values, and the problem is that I am sure that the value is passed and null cannot be there

Upvotes: 0

Views: 32

Answers (1)

Dinkar Kumar
Dinkar Kumar

Reputation: 2250

instead of
ft.replace(R.id.fragment, BlankFragment2()

you should use

ft.replace(R.id.fragment, BlankFragment2.getNewInstance(321).

Because your BlankFragment2.getNewInstance(321) statement above is kind of useless to the fragmentManager. FragmentManager is creating fragment using BlankFragment2() as you provided the Fragment in the replace call. And that is the reason for nullpointerexception because in reality, your Fragment didn't get any int value at all as the Fragment instance used was created with the empty constructor.

And also update your companion object code like below.

 companion object {
        fun getNewInstance(args: Int): BlankFragment2 {
            val fragment = BlankFragment2()
            val args = Bundle()
            args.putInt("one", args)
            fragment.setArguments(args)
            return fragment
        }
    }

because right now your code is actually not setting argument but try to access argument and setting value to it.

Upvotes: 1

Related Questions