Я искал всюду и не могу найти никакого способа сделать это вообще:Как определить наличие ландшафтной версии макета во время выполнения?
В моем проекте у меня есть две папки ресурсов для макетов: один называется «макет», а другой называется «макет» -земельные участки". Это знакомый способ иметь два отдельных макета для каждой активности, которые будут использоваться в зависимости от текущей ориентации. Проблема в том, что у меня нет отдельных макетов макета для каждой деятельности, и не все действия даже требуют другой макет для ландшафтного режима.
Что я сделал, это переопределение по умолчанию onConfigurationChanged
, чтобы предотвратить изменения ориентации (с соответствующим configChanges="orientation"
в манифесте). Это избавило меня от многих головных болей, набивающих вещи в Bundles каждый раз, когда пользователь наклонил их экран. Однако, в некоторых случаях, я на самом деле хочу изменений ориентации. Всякий раз, когда в папке «макет-земля» есть соответствующий макет, я хочу, чтобы ориентация менялась, как обычно. Всякий раз, когда этого не происходит, я хочу, чтобы onConfigurationChanged
подавлял событие изменения ориентации.
Я сделал родительский BaseActivity
класс, который расширяет Activity
и является базовым классом для всех моих мероприятий, и отменяет onConfigurationChanged
:
@Override
public void onConfigurationChanged(android.content.res.Configuration newConfig)
{
super.onConfigurationChanged(newConfig);
if(...there is a layout-land version of the current activity's layout...)
{
setRequestedOrientation(newConfig.orientation);
}
else
{
// Do nothing, since raising the orientation change event
// to change from a portrait layout to the same portrait layout is silly.
}
}
Единственная загвоздка в том, что я не могу найти какой-либо способ определения, является ли есть версия макета для моего макета. Я уже знаю идентификатор ресурса текущего макета (полученный в моем классе BaseActivity
путем переопределения setContentView
), но и альбомная версия макета, и портретная версия имеют один и тот же идентификатор, и я не вижу легкого способа для объекта Resources
скажите мне, какая версия макета мне дает, когда я спрашиваю об этом конкретный ресурс по id. Должен быть способ сделать это. Что мне не хватает?
Переопределение 'onConfigurationChanged()' просто для того, чтобы избежать сохранения состояния - это просто плохая практика, и я вернусь, чтобы укусить вас позже. – kcoppock
Существование 'onSaveInstanceState' - это плохая практика. Идея о том, что вы должны быть готовы к тому, чтобы ваше приложение было полностью утилизировано в любой момент времени, просто потому, что пользователь повернул телефон плохой дизайн. Кроме того, _how_ избежит сохранения состояния, чтобы вернуться, чтобы укусить меня? Помните, что единственная причина, по которой я это делаю, - избегать ситуаций, когда диалог может появляться в то время, когда пользователь наклоняет свой экран. Пользовательские данные сохраняются в моем приложении всякий раз, когда он изменяется (в том числе в 'onSaveInstanceState', если необходимо.) – Alex
Допустим, ваше приложение запущено, и пользователь решает открыть уведомление. Теперь ваше приложение находится в фоновом режиме. В зависимости от использования памяти ваше приложение может быть остановлено или уничтожено (по крайней мере, оно будет приостановлено) до того, как пользователь будет выполнен. Когда пользователь нажимает «назад», чтобы вернуться к вашей активности, активность воссоздается, и все ваши данные, содержащиеся в этом экземпляре активности, исчезли. – kcoppock