Использование намерения для передачи данных с графиком навигации Jetpack Android - PullRequest
1 голос
/ 11 июня 2019

Я завершил внедрение этого нового графика навигации Jetpack Android в проект.У меня есть 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] не является строкой ...

Как я могу передать подключенный объект Winter в View B с помощью навигации Jetpack?

Редактировать: Вот как я бы сделал это с намерениями.

Просмотр 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

1 Ответ

3 голосов
/ 11 июня 2019

Дополнения намерения хранятся в комплекте. Для каждого типа, приемлемого в putExtra(), в Bundle существует эквивалентный метод, который принимает этот же тип.

Например, для строки вы должны использовать putString. Типы перечислений Serializable, поэтому вы должны использовать putSerializable. Аналогично для любого другого типа.

...