Почему бы не использовать всегда android: configChanges= "keyboardHidden|ориентация"?



мне было интересно, почему бы не использовать android:configChanges="keyboardHidden|orientation" в каждой (почти каждой ;)) деятельности?



товары:




  • не нужно беспокоиться о том, что ваша деятельность была повернута

  • быстрее


Не так красиво:




  • нужно изменить ваши макеты, если они зависят от размера экрана (например, макеты с двумя столбцами или так)


плохое:




  • не гибкий способ, чтобы иметь разные раскладки по различной направленности

  • не очень хорошо при использовании фрагментов


но если мы не используем разные макеты, почему бы и нет?

532   4  

4 ответов:

Быстрая Фон

по умолчанию, когда некоторые ключевые изменения конфигурации происходят на Android (общий пример-изменение ориентации), Android полностью перезапускает текущую деятельность, чтобы помочь ему приспособиться к таким изменениям.

при определении android:configChanges="keyboardHidden|orientation" в вашем AndroidManifest вы говорите Android: "пожалуйста, не выполняйте сброс по умолчанию, когда клавиатура вытащена или телефон повернут; я хочу справиться с этим сам. Да, я знаю, кто я. делать"

это хорошая вещь? Скоро увидим...

нет забот?

один из плюсов вы начинаете с того, что есть:

не нужно беспокоиться о том, что ваша деятельность была повернута

во многих случаях люди ошибочно полагают, что, когда у них есть ошибка, которая создается изменением ориентации ("вращение"), они могут просто исправить, указав android:configChanges="keyboardHidden|orientation".

, android: configChanges= "keyboardHidden / ориентация" - это не более чем бандаж. По правде говоря, есть много способов инициировать изменение конфигурации. Например, если пользователь выбирает новый язык (т. е. локаль изменилась), ваша деятельность будет перезапущена таким же образом, как и при изменении ориентации. Если вы хотите, вы можете посмотреть список всех различных типов изменений конфигурации.

Edit: что еще более важно, хотя, как hackbod указывает в комментариях, ваша активность также будет перезапущен, когда ваше приложение находится в фоновом режиме и Android решает освободить память, убив его. Когда пользователь вернется в ваше приложение, Android попытается перезапустить действие таким же образом, как если бы было какое-то другое изменение конфигурации. Если вы не можете справиться с этим-пользователь не будет счастлив...

другими словами, с помощью android:configChanges="keyboardHidden|orientation" Это не решение для ваших "забот."Правильный путь чтобы закодировать свои действия так, чтобы они были довольны любым перезапуском Android бросает на них. Это хорошая практика, которая поможет вам в будущем, так что привыкай.

поэтому, когда я должен использовать его?

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

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

, если по какой-то причине вы используете другой макет, когда устройство находится в ландшафте, тот факт, что Android перезагружает вашу активность, хорош, потому что он затем загрузит правильный макет. [Если вы используете переопределение для такого действия и хотите сделать какой-то волшебный макет во время выполнения... ну, удачи - это далеко не простая]

Краткий Обзор

непременно, если android:configChanges="keyboardHidden|orientation" подходит для вас, а затем использовать его. Но пожалуйста обязательно проверьте, что происходит, когда что-то меняется, потому что изменение ориентации-это не единственный способ запуска полного перезапуска активности.

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

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

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

Я не вижу почему.... случайные перезагрузки в порядке, на мой взгляд... configChanges обрабатывает большинство случаев для меня... ну, может быть, в некоторых типах приложений это может быть проблемой, но это действительно зависит от типа приложения и как вы восстанавливаете состояние при перезапуске приложения... Когда одно из моих приложений перезагружается, пользователь регистрируется обратно, и последнее действие открывается моим кодом, и пользователь jus теряет некоторые шаги, чтобы вернуться туда, где он был, но не имеет большого значения.. В другом случае некоторое состояние всегда сохраняется, а некоторое состояние всегда восстанавливается перезапуск. Когда активность перезапускалась, это должно было быть то, что приложение не было использовано или что-то еще... так что никаких проблем... В игре, например, это может быть проблемой, может быть, или в каком-то другом типе приложения я не знаю...

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

Так убейте меня, но я использую это в разных приложениях довольно успешно... android:configChanges="locale|keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize" Но я понимаю, что для некоторых специальных приложений это может быть не очень хорошо, но большинство приложений могут жить это просто нормально.

Да, я думаю, что пауза сделает это быстрее, чем освобождение игрока. Все равно пауза.

теперь нашли решение, которое не будет приостанавливать песню.

укажите в манифесте, что вы будете обрабатывать изменение конфигурации для ориентации экрана, а затем использовать метод onConfigurationChanged для загрузки файла макета. Делая это в logCat я вижу onPause, onCreate & onResume не вызываются, и поэтому песня не является приостановленный.

  1. обновите манифест для обработки ориентации.

    android:configChanges="orientation|screenSize"
    
  2. добавить этот код

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        // TODO Auto-generated method stub      
        super.onConfigurationChanged(newConfig);        
        setContentView(R.layout.activity_main);
    }
    

Comments

    Ничего не найдено.