Главная » Разработка для Android » Изменение конфигурации во время выполнения программы

0

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

Подобное  поведение  не всегда уместно и желательно.  Например, не- которые  изменения конфигурации (ориентация экрана  в пространстве, доступность  клавиатуры) могут произойти только  лишь из-за того, что пользователь повернул устройство или выдвинул клавиатуру. Вы можете настраивать,  каким образом ваше приложение будет реагировать  на по- добные изменения,  обнаруживая их и выполняя собственные  действия.

Чтобы  заставить  Активность отслеживать изменения конфигурации при выполнении программы, добавьте в ее узел в манифесте  атрибут android:configChanges, указав, какие именно  события  хотите обра- батывать.

Перечислим значения,  с помощью которых можно описать изменения конфигурации:

оrientation — положение экрана изменено с портретного на альбомное

(или наоборот);

keyboardHidden — клавиатура выдвинута  или спрятана;

fontScale — пользователь изменил предпочтительный размер шрифта;

locale — пользователь выбрал новые языковые  настройки;

keyboard  — изменился тип клавиатуры; например,  телефон  может иметь 12-клавишную панель, при повороте которой появляется полноценная клавиатура;

touchscreen или navigation — изменился тип клавиатуры или способ навигации.  Как правило, такие события не встречаются.

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

Вы можете выбирать несколько событий, которые хотите обрабатывать самостоятельно, разделяя их символом |.

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

Листинг 3.5. Описание  Активности для обработки динамических изменений ресурсов

<activity android:name=".TodoList" android:label="@string/app_name" android:theme="@style/TodoTheme" android:configChanges="orientation|keyboardHidden"/>

Наличие атрибута  android:configChanges отменяет  перезапуск приложения при заданных изменениях конфигурации. Вместо этого внутри Активности срабатывает  метод onConfigurationChanged. Переопределите его, чтобы появилась возможность обрабатывать  изменения в конфигура- ции. Используйте переданный объект Configuration, чтобы получить новые значения,  как показано в листинге 3.6. Не забудьте вызвать одноименный метод из родительского класса и перезагрузить измененные значения  со всех ресурсов, которые используются внутри Активности.

Листинг 3.6. Обработка  изменения конфигурации внутри кода программы

@Override

public void onConfigurationChanged(Configuration _newConfig) {

super.onConfigurationChanged(_newConfig);

[ … Обновите пользовательский интерфейс, используя данные

Продолжение ?

Листинг 3.6 (продолжение)

из ресурсов … ]

if (_newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { [ … Реакция на измененную ориентацию экрана … ]

}

if (_newConfig.keyboardHidden == Configuration.KEYBOARDHIDDEN_NO) { [ … Реакция на выдвигание/задвигание клавиатуры … ]

}

}

На момент вызова обработчика  onConfigurationChanged данные из ре- сурсов, используемых внутри Активности, уже обновлены и имеют актуаль- ные значения, поэтому применять их безопасно.

Любые изменения конфигурации, которые не были явно помечены для обработки внутри вашего приложения, приведут к перезапуску Активности, минуя вызов метода onConfigurationChanged.

Источник: Майер P. Android 2 : программирование приложений для планшетных компьютеров и смартфонов : [пер. с англ. ] / Рето Майер. — М. : Эксмо, 2011. — 672 с. — (Мировой компьютерный бестселлер).

По теме:

  • Комментарии