Мне просто не нужно ничего менять при повороте экрана. Мое приложение отображает случайное изображение при первой загрузке, и поворот устройства не должен выбирать другое случайное изображение. Как я могу (просто) остановить это поведение?
Мне просто не нужно ничего менять при повороте экрана. Мое приложение отображает случайное изображение при первой загрузке, и поворот устройства не должен выбирать другое случайное изображение. Как я могу (просто) остановить это поведение?
Ответы:
Как правило, есть три способа сделать это:
Как показывают некоторые ответы, вы можете различить случаи, когда ваша деятельность была создана впервые и восстановлена из savedInstanceState. Это делается путем переопределения onSaveInstanceStateи проверки параметра onCreate.
Вы можете заблокировать действие в одной ориентации, добавив android:screenOrientation="portrait"(или "landscape") <activity>в свой манифест.
Вы можете сказать системе, что вы хотели обрабатывать изменения экрана для себя, указав android:configChanges="orientation|screenSize"в <activity>теге. Таким образом, действие не будет воссоздано, но вместо этого получит обратный вызов (который вы можете игнорировать, так как он бесполезен для вас).
Лично я бы пошел с (3). Конечно, если вам подходит привязка приложения к одной из ориентаций, вы также можете использовать (2).
android:configChanges="orientation|screenSize"
android:configChanges="orientation|screenSize"работает для меня. Спасибо @Pacerier
android:configChanges="orientation|screenSize"значением API> = 13, потому что многие люди считают ваш ответ основным!
Ответ Xion был близок, но # 3 ( android:configChanes="orientation") не сработает, если приложение не имеет уровня API 12 или ниже.
На уровне API 13 или выше размер экрана изменяется при изменении ориентации, поэтому это все равно приводит к тому, что действие изменяется и запускается при изменении ориентации.
Просто добавьте атрибут «screenSize», как я сделал ниже:
<activity
android:name=".YourActivityName"
android:configChanges="orientation|screenSize">
</activity>
Теперь, когда вы меняете ориентацию (и размер экрана меняется), действие сохраняет свое состояние и onConfigurationChanged()вызывается. Это сохранит все, что находится на экране (т.е. веб-страницу в веб-просмотре), когда ориентация изменится.
Узнал об этом с этого сайта: http://developer.android.com/guide/topics/manifest/activity-element.html
Кроме того, это явно плохая практика, поэтому прочитайте ссылку ниже об обработке изменений времени выполнения:
http://developer.android.com/guide/topics/resources/runtime-changes.html
android:configChanges="orientation|screenSize"
Вам просто нужно перейти к AndroidManifest.xmlметкам и внутри или в ярлыках ваших действий, вы должны ввести эту строку кода, как кто-то там сказал:
android:configChanges="orientation|screenSize"
Итак, у вас будет что-то вроде этого:
<activity android:name="ActivityMenu"
android:configChanges="orientation|screenSize">
</activity>
Надеюсь, что это работает!
<activity android:name="com.example.abc"
android:configChanges="orientation|screenSize"></activity>
Просто добавьте android:configChanges="orientation|screenSize"вкладку активности файла манифеста.
Таким образом, активность не будет перезапущена при изменении ориентации.
onSaveInstanceState()и onCreate().
По моему опыту, на самом деле лучше просто правильно обращаться с изменениями ориентации, а не пытаться использовать нестандартное поведение.
Вы должны сохранить изображение, которое отображается в данный момент, onSaveInstanceState()и правильно восстановить его при onCreate()повторном запуске приложения .
android:configChangesследует избегать использования и использовать его только в качестве крайней меры. Пожалуйста, прочтите Обработка изменений времени выполнения для получения дополнительной информации о том, как правильно обрабатывать перезапуск из-за изменения конфигурации».
Это решение на сегодняшний день является лучшим рабочим. В вашем файле манифеста добавить
<activity
android:configChanges="keyboardHidden|orientation|screenSize"
android:name="your activity name"
android:label="@string/app_name"
android:screenOrientation="landscape">
</activity
И в вашем классе деятельности добавьте следующий код
@Override
public void onConfigurationChanged(Configuration newConfig)
{
super.onConfigurationChanged(newConfig);
if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
//your code
} else if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
//your code
}
}
добавить android:configChanges="keyboardHidden|orientation|screenSize"для всех тегов активности приложения в манифесте.
Просто добавьте это к вашему AndroidManifest.xml
<activity android:screenOrientation="landscape">
Я имею в виду, есть тег активности, добавьте это в качестве другого параметра. Если вам нужна книжная ориентация, измените альбомную на портретную. Надеюсь это поможет.
В файле манифеста добавить к каждому виду деятельности это. Это поможет
android:configChanges = "orientation|keyboard|keyboardHidden|screenLayout|screenSize"
http://animeshrivastava.blogspot.in/2017/08/activity-lifecycle-oncreate-beating_3.html
@Override
protected void onSaveInstanceState(Bundle b)
{
super.onSaveInstanceState(b);
String str="Screen Change="+String.valueOf(screenChange)+"....";
Toast.makeText(ctx,str+"You are changing orientation...",Toast.LENGTH_SHORT).show();
screenChange=true;
}
Сохраните детали изображения в вашем onPause()или onStop()и используйте его в onCreate(Bundle savedInstanceState)для восстановления изображения.
РЕДАКТИРОВАТЬ:
Более подробная информация о реальном процессе подробно описана здесь http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle, поскольку в Honeycomb он отличается от предыдущих версий Android.
просто используйте: android:configChanges="keyboardHidden|orientation"
Как отметил Пейсер,
android:configChanges="orientation|screenSize"
Я не знаю, если это лучшее решение, но я опишу его здесь:
Прежде всего, вам нужен сертификат с вашим классом Приложение вашего приложения в вашем манифесте этого:
<application
android:name=".App"
...
Во-вторых, в моем классе App я сделал так:
public class App extends Application {
public static boolean isOrientationChanged = false;
@Override
public void onCreate() {
super.onCreate();
}
@Override
public void onConfigurationChanged(@NotNull Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE ||
newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
isOrientationChanged = true;
}
}
}
В-третьих, вам нужно установить флаг «Изменение ориентации», в моем случае я всегда устанавливаю его при вызове предыдущего действия в навигации приложения, поэтому вызывать его нужно только один раз, когда создается последнее действие.
isOrientationChanged = false;
Поэтому каждый раз, когда я меняю ориентацию моего экрана в этом контексте, я устанавливаю его каждый раз, когда он меняет этот параметр, он проверяет, есть ли изменение ориентации, и если да, он проверяет его на основании значения этого флага.
По сути, мне приходилось использовать его всякий раз, когда я делал асинхронный запрос на модификацию, который он вызывал каждый раз, когда менялась ориентация, постоянно сбой приложения:
if (!isOrientationChanged) {
presenter.retrieveAddress(this, idClient, TYPE_ADDRESS);
}
Не знаю, самое ли это элегантное и красивое решение, но, по крайней мере, здесь оно функционально :)
Добавьте этот код после onCreateметода, в вашей деятельности, содержащейWebView
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}
@Override
protected void onRestoreInstanceState(Bundle state) {
super.onRestoreInstanceState(state);
}
Screen.lockOrientation(this)с github.com/delight-im/Android-BaseLib/blob/master/Source/src/im/… для этого. Это позволяет разблокировать, что не манифест.