使用意图通过 Android jetpack 导航图传递数据

Using intent to pass data with Android jetpack navigation graph

我已经将这个新的 Android jetpack 导航图实现到一个项目中。我有一个 ListView 具有详细视图,在导航图中定义。

使用此导航图从一个视图到另一个视图的转换效果很好,但是,我现在无法尝试从 ListView 传递数据对象(视图 A,由 Winter 对象)到详细视图(视图 B)。在使用 Jetpack 之前,这对于意图和 startActivity()

来说非常简单

冬季对象:

class Winter(sportName:String, sportType: SportType, sportEquipment:ArrayList<Equipment> ) {

    var sportName = ""
    var sportType = WinterModel.SportType.board
    var sportEquipment = arrayListOf<Equipment>()

    enum class SportType(val type: String){
        board("Board"),
        ski("Ski"),
        engine("Engine")
    }

    init {
        this.sportName = sportName
        this.sportType = sportType
        this.sportEquipment = sportEquipment
    }

}

我希望能够做类似的事情:

val tappedSport = winterSport[position]
val bundle = Bundle()
bundle.putString(SPORT, tappedSport)
Navigation.findNavController(view!!).navigate(R.id.winterSportDetails,bundle)

显然这行不通,因为 winterSport[position] 不是字符串...

如何使用 Jetpack 导航将点击的 Winter 对象传递给视图 B?

编辑:这是我用意图完成的方式。

查看 A(发送)

listView.setOnItemClickListener { _, _, position, _ ->

    val tappedSport = winterSport[position]

    val detailIntent = DetailActivity.newIntent(context, tappedSport)

    startActivity(detailIntent)
}

视图 B(接收)

companion object {

    const val SPORT_NAME = "SPORT_NAME"
    const val SPORT_TYPE = "SPORT_TYPE"
    const val SPORT_EQUIPMENT = "SPORT_EQUIPMENT"

    fun newIntent(context: Context, sport: WinterModel): Intent {
        val detailIntent = Intent(context, DetailActivity::class.java)

        detailIntent.putExtra(SPORT_NAME, sport.sportName)
        detailIntent.putExtra(SPORT_TYPE, sport.sportType.type)
        detailIntent.putExtra(SPORT_EQUIPMENT, sport.sportEquipment.gear)

        return detailIntent
    }
}

//.. Then just access the info in onViewCreated

Intent 的 Extras 存储在 Bundle 中。对于在 putExtra() 中可接受的每种类型,Bundle 上都有一个接受相同类型的等效方法。

例如,对于字符串,您将使用 putString。枚举类型是 Serializable,所以你会使用 putSerializable。对于所有其他类型也是如此。