尝试显示从一个片段到另一个片段的传递对象的数据时出现 NullPointerException

Getting NullPointerException when trying to display the data of passed object from one fragment to another

这是我在发件人片段上的代码

 override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val view = inflater.inflate(R.layout.fragment_list_card,container,false)
        rcvAdapter = CardAdapter(cardList,this)
        view.cardRecyclerView.layoutManager = LinearLayoutManager(container?.context,LinearLayoutManager.VERTICAL,false)
        view.cardRecyclerView.adapter = rcvAdapter
        return view
    }
    override fun onClick(card: Card) {
        val cardBundle  = Bundle()
        cardBundle.putSerializable("Card",card)
        val infoFrag = CardInfoFrag()
        infoFrag.arguments = cardBundle
        val transaction = activity?.supportFragmentManager?.beginTransaction()
        transaction?.replace(R.id.fragmentContainer,infoFrag)
        transaction?.commit()
    }

这是接收器上的代码

class CardInfoFrag : Fragment() {
    private val card : Card? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val bundle = Bundle(arguments)
        val card : Card = bundle.getSerializable("Card") as Card
        Log.d("CARDINFO: ",card.name+" "+ card.cardDate+" "+card.cardNum)
    }
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        cardNameInfo.text = card?.name
        cardExDateInfo.text = card?.cardDate
        cardNumInfo.text = card?.cardNum
        return inflater.inflate(R.layout.fragment_card_info,container,false)
    }
}

cardList 声明为 ArrayList<Card>

Card对象

class Card (val cardNum : String, val cardDate : String, val name : String) :Serializable{

}

logcat,当我尝试使用传递的对象中的数据创建新片段时,说我的 cardNameInfo.text 不能为空,而日志命令清楚地表明我收到了对象并且它的数据。我无法弄清楚可能导致问题的原因

如有任何提示,我们将不胜感激

尝试一次,当您得到 Bundle 时,arguments 已经是一个 Bundle 对象。也许如果你做这样的事情它可能会起作用:(我的回答基于 this 回答 :))

class CardInfoFrag : Fragment() {

    ...

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val bundle: Bundle? = arguments

        bundle?.let{

          val card : Card = it.getSerializable("Card") as Card
          Log.d("CARDINFO: ",card.name+" "+ card.cardDate+" "+card.cardNum) 
        }
        
    }

    ...
}

顾名思义,onCreateView 在创建片段视图之前被调用;因此,在 onCreateView 中,您需要显式使用它将返回的视图来访问任何基础视图。

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    val view = inflater.inflate(R.layout.fragment_card_info,container,false)
    cardNameInfo = view.findViewById<TextView>(R.id.foo1)
    cardExDateInfo= view.findViewById<TextView>(R.id.foo2)
    cardNumInfo= view.findViewById<TextView>(R.id.foo3)

    cardNameInfo.text = card?.name
    cardExDateInfo.text = card?.cardDate
    cardNumInfo.text = card?.cardNum
    return view
}

foo id更改为片段布局中的相应id