Предотвращение вращения экрана на Android
У меня есть один из моих видов деятельности, которые я хотел бы предотвратить от вращения, потому что я начинаю AsyncTask, и вращение экрана делает его перезапуск.
есть ли способ сказать это действие "не поворачивайте экран, даже если пользователь трясет свой телефон, как сумасшедший"?
13 ответов:
добавить
android:screenOrientation="portrait"или
android:screenOrientation="landscape"до
<activity>элемент / s внутри манифест и все готово.
вы можете следовать логике ниже, чтобы предотвратить автоматический поворот экрана пока код
AsyncTaskработает:
- сохранить текущую ориентацию экрана внутри вашей деятельности с помощью
getRequestedOrientation().- отключить автоматическую ориентацию экрана с помощью
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR).- выполнить/выполнить ваш
AsyncTask.- в конце
AsyncTaskвосстановление предыдущего состояния ориентации с помощьюsetRequestedOrientation(oldOrientation).обратите внимание, что есть несколько способов доступа
Activity(который работает в потоке пользовательского интерфейса) свойства внутриAsyncTask. Вы можете реализовать свойAsyncTaskкак внутренний класс, или вы можете использоватьHandlerвот ткни своимActiviyкласса.
в файле манифеста для каждого действия, которое вы хотите заблокировать поворот экрана, добавьте: если вы хотите заблокировать его в горизонтальном режиме:
<activity ... ... android:screenOrientation="landscape">или если вы хотите зафиксировать его в вертикальном режиме:
<activity ... ... android:screenOrientation="portrait">
самый простой способ, который я нашел, чтобы сделать это было поставить
this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);в onCreate, сразу после
setContentView(R.layout.activity_main);так...
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); }
активности.java
@Override public void onConfigurationChanged(Configuration newConfig) { try { super.onConfigurationChanged(newConfig); if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { // land } else if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) { // port } } catch (Exception ex) { }AndroidManifest.xml
<application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name="QRCodeActivity" android:label="@string/app_name" android:screenOrientation="landscape" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application>
вместо того, чтобы идти в AndroidManifest, вы можете просто сделать это:
screenOrientation = getResources().getConfiguration().orientation; getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED); ... AsyncTask screenOrientation = getResources().getConfiguration().orientation; @Override protected void onPostExecute(String things) { context.setRequestedOrientation(PlayListFragment.screenOrientation); or context.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR); }единственным недостатком здесь является то, что он требует API уровня 18 и выше. Так что в основном это наконечник копья.
следующий атрибут активности в AndroidManifest.XML-это все, что вам нужно:
android:configChanges="orientation"Итак, полный узел активности будет:
<activity android:name="Activity1" android:icon="@drawable/icon" android:label="App Name" android:excludeFromRecents="true" android:configChanges="orientation"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity>
добавить:
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR); ... ... ... }
Если вы используете Android Developer Tools (ADT) и затмение вы можете пойти на свой AndroidManifest.xml -->приложение tab --> спуститесь вниз и выберите свою деятельность. Наконец, выберите предпочтительную ориентацию. Вы можете выбрать один из многих вариантов.
вы должны добавить следующий код в манифесте.XML-файл. Действие, для которого оно не должно вращаться, в этом действии добавьте этот элемент
android:screenOrientation="portrait"тогда он не будет вращаться.
вы можете попробовать этот способ
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.itclanbd.spaceusers"> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".Login_Activity" android:screenOrientation="portrait"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application>
добавьте следующее К вашему AndroidManifest.xml
[ app > src > main > AndroidManifest.xml ]
<activity android:name=".MainActivity" android:configChanges="orientation" android:screenOrientation="portrait"/>пример:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="xxx.zzzzzz.yyyyy"> <uses-permission android:name="A-PERMISSION" /> <application> <activity android:name=".MainActivity" android:screenOrientation="portrait" android:configChanges="orientation"> </activity> </application> </manifest>
использовать AsyncTaskLoader чтобы сохранить ваши данные в безопасности, даже если активность меняется, вместо использования AsyncTask это лучший способ для создания приложений, чем предотвращение вращения экрана.
Comments