Изучение кода эмоционально переносит вас в самые разные места: здесь вы чувствуете себя богом, когда создали свой первый макет, а в следующий момент вы боретесь с ленивой ссылкой, которую вы ввели в свой TextView, чтобы только делать ничего такого. Вы должны были знать, что ссылки, эти ленивые болваны, должны иметь НАМЕРЕНИЕ, чтобы на самом деле что-то делать.

Итак, вот я, Икар, взлетающий высоко с новым красивым ландшафтным макетом, созданным с помощью отдельного XML-файла для моего приложения для отслеживания теннисных очков. Запускаю приложение - работает! Я нажимаю кнопки, и оба игрока получают правильный результат, что соответствует моему лучшему пониманию теннисной системы. Закулисная логика прекрасна, я действительно ею горжусь. Макет был доведен до совершенства, ну, без перфекционизма.

О, флип!

Пришло время испытать его на перевороте: я поворачиваю экран. Wohoo! Мой макет работает, выглядит так, как задумано, при необходимости сбрасывается, но подождите!

Да, это появляется, когда вы переворачиваете экран с помощью этого причудливого подхода, имея несколько файлов макета xml, все ваши оценки ... исчезают. Бедная Сиара, она так много работала.

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

Какие уроки вас учат

Но теперь вы, наверное, знаете, что вы всегда можете гуглить! Что вы делаете, отчаянно: «Сохранение состояния поворота экрана». Несколько статей о stackoverflow, одна здесь на Medium, ресурсы для разработчиков Android и даже [отличное!] Видео на YouTube, а также несколько действительно минималистичных и понятных статей для начинающих, которые вы действительно можете понять.

Основная идея, которую вы поймете, выбравшись из бездны отчаяния:

  1. Положите все ценные вещи в корзину *:
@Override
protected void onSaveInstanceState(Bundle outState) {
    //somehow save values of the variables and strings
    outState.putInt("scorePlayerA2", scorePlayerA);
    outState.putString("scoreTeamA2", showScorePlayerA);
... more stuff here...
    super.onSaveInstanceState(outState);
}
  • Эта временная * корзина * называется Bundle, и она может содержать любые ваши ценности: строки, целые числа, шорты и т.д. вы бы наполнили свою реальную корзину.
  • Статус super.onSaveInstanceState (outState); играет важную роль в этом методе, но я понятия не имею о концепции «супер».

2. Выньте их из корзины:

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    //repopulate values
    scorePlayerA = savedInstanceState.getInt("scorePlayerA2");
    showScorePlayerA = savedInstanceState.getString("scoreTeamA2");
... more stuff you put in before...
}
  • Здесь вы в основном распаковываете свою корзину, ссылаясь на нее как на savedInstanceState Bundle, а затем вы выходите из нее .getInt, .getShort или .getString.
  • Не забывайте свое «супер», что бы оно ни значило: super.onRestoreInstanceState (savedInstanceState);

3̶.̶ ̶T̶a̶d̶a̶m̶!̶ ̶I̶t̶ ̶s̶h̶o̶u̶l̶d̶ ̶b̶e̶ ̶w̶o̶r̶k̶i̶n̶g̶ ̶n̶o̶w̶.̶

В некоторых руководствах используются несколько концепций, например, приватная статика, что-то, что немного запутывает вас. Вы спрашиваете, вы почти неукоснительно следуете рекомендациям, вы тестируете и повторно тестируете, вы портите свой onCreate, вы добавляете переменные, которые вам не нужны, и все равно ... ничего не работает.

В этот момент я чуть не швырнул свой ноутбук в камин. Мне повезло - камина нет, а есть только один ноутбук. Пришлось оставаться разумным. Итак, я проверил свою реализацию и дважды проверил свою реализацию. И повторил. Казалось, все по правилам, так что ошибка должна быть чем-то довольно очевидным.

Слишком очевидно, чтобы упоминать

И да, это очевидно. Просто спросите опытных разработчиков, которые никогда не включали это в свои учебные пособия. И спроси я! Единственное, о чем все забыли тебе сказать, это ... ты готов?

3. Покажите, что вы вынули из корзины, чтобы код распаковки корзины выглядел примерно так:

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    //repopulate values
    scorePlayerA = savedInstanceState.getInt("scorePlayerA2");
    showScorePlayerA = savedInstanceState.getString("scoreTeamA2");
    displayGameScoreA(gamesPlayerA);

У меня был этот причудливый подход «любовь-любовь, проигравший-победитель» и теннисный счет 15–30–40–45, что не кажется достаточно логичным, чтобы его можно было реализовать каким-либо другим способом, поэтому я отображал результаты в виде строк в зависимости от виртуальный номер, которым теннисисты никогда не пользуются, и мы надеемся, что они использовали.

Это было сумасшедшее приключение последних двух дней: потребовались миллионы поисковых запросов в Google, несколько попыток поиска на YouTube, много неуверенности в себе, несколько техник самоуспокоения, немного шоколада и настоящий тест на дружбу для моего бедные друзья, которые умеют писать код для Android (я никогда не забуду вас, ребята, которые отвечали и помогали, и особенно вас, которые этого не делали).