← Назад к вопросам

Как что-то поместить в Bundle

1.0 Junior🔥 151 комментариев
#Android компоненты#Работа с данными

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Работа с Bundle в Android

Bundle — это ключевой класс в Android для передачи данных между компонентами (Activity, Fragment, Service и т.д.). Он представляет собой коллекцию пар "ключ-значение", где ключ — это строка (String), а значение может быть одного из поддерживаемых типов.

Основные типы данных, помещаемые в Bundle

Bundle поддерживает ограниченный набор типов, которые должны быть Parcelable или Serializable:

  • Примитивы и их обёртки: int, long, double, boolean, char и др.
  • Массивы примитивов и строк
  • Строки (String) и CharSequence
  • Parcelable объекты (рекомендуемый способ)
  • Serializable объекты (менее эффективно)
  • ArrayList и HashMap для поддерживаемых типов

Как поместить данные в Bundle

Для помещения данных используется семейство методов putXXX(), где XXX — тип данных.

// Создание Bundle
val bundle = Bundle()

// Помещение примитивных типов
bundle.putInt("USER_ID", 42)
bundle.putString("USER_NAME", "Иван Петров")
bundle.putBoolean("IS_PREMIUM", true)
bundle.putDouble("RATING", 4.85)

// Помещение массива
bundle.putStringArray("TAGS", arrayOf("android", "kotlin", "development"))

// Помещение Parcelable объекта (рекомендуется)
val user = User("ivan@example.com", "Ivan")
bundle.putParcelable("USER_OBJECT", user)

// Помещение Serializable объекта (альтернатива)
val settings = AppSettings(theme = "dark", notifications = true)
bundle.putSerializable("APP_SETTINGS", settings)

// Помещение коллекций
bundle.putStringArrayList("CATEGORIES", arrayListOf("Tech", "Science", "Art"))

Практическое использование Bundle

1. Передача данных между Activity

// В исходной Activity
val intent = Intent(this, DetailActivity::class.java).apply {
    putExtra("ITEM_ID", itemId) // putExtra() фактически работает с Bundle
    putExtra("ITEM_TITLE", title)
}
startActivity(intent)

// Или с явным Bundle
val bundle = Bundle().apply {
    putInt("ITEM_ID", itemId)
    putString("ITEM_TITLE", title)
}
val intent = Intent(this, DetailActivity::class.java)
intent.putExtras(bundle)
startActivity(intent)

2. Сохранение состояния Activity/Fragment

// В Activity
override fun onSaveInstanceState(outState: Bundle) {
    super.onSaveInstanceState(outState)
    outState.putString("SEARCH_QUERY", currentQuery)
    outState.putInt("SELECTED_TAB", selectedTabPosition)
}

override fun onRestoreInstanceState(savedInstanceState: Bundle) {
    super.onRestoreInstanceState(savedInstanceState)
    val query = savedInstanceState.getString("SEARCH_QUERY")
    val tab = savedInstanceState.getInt("SELECTED_TAB", 0)
}

3. Передача данных во Fragment

// Создание фрагмента с аргументами
fun newInstance(userId: Int, userName: String): MyFragment {
    return MyFragment().apply {
        arguments = Bundle().apply {
            putInt(ARG_USER_ID, userId)
            putString(ARG_USER_NAME, userName)
        }
    }
}

// В onCreate() фрагмента
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    arguments?.let {
        val userId = it.getInt(ARG_USER_ID)
        val userName = it.getString(ARG_USER_NAME, "")
    }
}

Важные особенности и лучшие практики

  • Размер ограничен: Bundle имеет ограничение на размер данных (обычно 1MB для Intent). Для больших данных используйте другие механизмы.
  • Используйте константы для ключей: Всегда определяйте ключи как константы, чтобы избежать опечаток:
companion object {
    private const val ARG_USER_ID = "user_id"
    private const val ARG_USER_NAME = "user_name"
}
  • Проверяйте наличие данных: Всегда проверяйте, существует ли ключ в Bundle:
val value = if (bundle.containsKey("MY_KEY")) {
    bundle.getString("MY_KEY")
} else {
    "default_value"
}
  • Предпочитайте Parcelable над Serializable: Parcelable оптимизирован для Android и работает быстрее.
  • Bundle не потокобезопасен: Не используйте один Bundle из нескольких потоков одновременно.

Извлечение данных из Bundle

Для извлечения данных используются методы getXXX(), часто с возможностью указать значение по умолчанию:

val id = bundle.getInt("USER_ID", -1) // -1 по умолчанию
val name = bundle.getString("USER_NAME", "") // "" по умолчанию
val user = bundle.getParcelable<User>("USER_OBJECT") // nullable

Bundle — это фундаментальный механизм в Android для временного хранения и передачи данных. Правильное его использование критически важно для создания стабильных и эффективных приложений, особенно при работе с жизненным циклом компонентов и навигацией.