使用意图通过 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
。对于所有其他类型也是如此。
我已经将这个新的 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
。对于所有其他类型也是如此。