防止Android上的屏幕旋转
Posted
技术标签:
【中文标题】防止Android上的屏幕旋转【英文标题】:Prevent screen rotation on Android 【发布时间】:2011-02-13 10:09:28 【问题描述】:我有一个我想要阻止旋转的活动,因为我正在启动一个 AsyncTask,并且屏幕旋转使它重新启动。
有没有办法告诉这个活动“即使用户疯狂地摇晃他的手机,也不要旋转屏幕”?
【问题讨论】:
***.com/questions/1512045/… 您可以处理屏幕方向更改和 AsyncTasks。防止屏幕方向更改只是一种懒惰的解决方法。而且在方向变化时保持 AsyncTask 的活动并不难:) clamernotes.blogspot.com/2011/04/… 实际提供解决方案或一些代码会更有帮助,Romain,而不是仅仅断言“解决方案存在并且不难”。 你可以使用setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED);
【参考方案1】:
添加
android:screenOrientation="portrait"
或
android:screenOrientation="landscape"
到<activity>
元素中
清单,你就完成了。
【讨论】:
请注意,这只是在您的应用程序中隐藏了一个错误,使用户不太可能被它绊倒。但他们仍然会。任何配置更改都可能导致您的活动重新启动。您确实需要正确编写活动以在异步任务重新启动时处理它。 这在一种情况下对我不起作用。在打开应用程序之前,我将屏幕设置为横向。当我打开应用程序时,屏幕旋转为纵向并导致第二次调用 asynctask。 您需要设置“以纵向模式打开”和“始终保持纵向模式”。只做1是没有意义的。 @hackbod 无论如何,这是谷歌点击“android 应用程序防止屏幕旋转”的第一名,我的需求与异步任务无关 @hackbod 那么我们如何正确地编写我们的活动来处理这个问题呢?【参考方案2】:您可以按照以下逻辑来防止自动旋转屏幕您的AsyncTask
正在运行:
-
使用
getRequestedOrientation()
将您当前的屏幕方向存储在您的活动中。
使用setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR)
禁用自动屏幕方向。
运行/执行您的AsyncTask
。
在您的AsyncTask
末尾使用setRequestedOrientation(oldOrientation)
恢复您之前的定位状态。
请注意,有多种方法可以访问AsyncTask
内的Activity
(在UI 线程上运行)属性。您可以将AsyncTask
实现为内部类,也可以使用消息Handler
戳Activiy
类。
【讨论】:
比选择的答案好多了。 好主意 :) 您没有存储当前屏幕方向,您可以使用 ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED 这看起来不可思议,@emre,谢谢!似乎 “好得令人难以置信!” 请注意关于这个问题的大量讨论:***.com/q/3821423/294884 ... android 专家,这里有什么缺点吗?!再次感谢.. 非常感谢。 废话!!如果设备碰巧以横向模式开始,这不起作用。我勒个去!苏:O @Emre,此代码在某些情况下不起作用。例如。如果用户在 AsyncTask 的开始和结束之间改变了方向。那时你会保存并恢复错误的方向。【参考方案3】:我发现这样做最简单的方法是把
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);
【讨论】:
按预期工作【参考方案4】:在您的 Manifest 文件中,为每个要锁定屏幕旋转的 Activity 添加:如果您想将其锁定为水平模式:
<activity
...
...
android:screenOrientation="landscape">
或者如果你想在垂直模式下锁定它:
<activity
...
...
android:screenOrientation="portrait">
【讨论】:
【参考方案5】:您可以这样做,而不是进入 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 或更高。所以基本上这是矛头。
【讨论】:
这部分正在禁用主页和最近的应用程序按钮,即使在使用 SCREEN_ORIENTATION_FULL_SENSOR 释放锁定后,它仍处于禁用状态。在 Android N 中。【参考方案6】:Activity.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>
【讨论】:
【参考方案7】:您只需要 AndroidManifest.xml 中 ACTIVITY 的以下属性:
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>
【讨论】:
【参考方案8】:添加:
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
...
...
...
【讨论】:
【参考方案9】:将以下内容添加到您的 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>
【讨论】:
【参考方案10】:AndroidManifest.xml 文件中的用户"portrait"
似乎是一个不错的解决方案。但它会强制某些设备(在横向上效果最好)进入纵向,而不是获得正确的方向。在最新的安卓版本上,你会得到一个错误。所以我的建议最好使用"nosensor"
。
<activity
...
...
android:screenOrientation="nosensor">
【讨论】:
【参考方案11】:android:screenOrientation="portrait" 在应用程序标签 上
和
【讨论】:
目前还不清楚如何处理所写的内容,在哪里写。此外,列表中有类似且更清晰的答案,因此不需要答案。【参考方案12】:如果您使用的是 Android Developer Tools (ADT) 和 Eclipse 您可以转到您的 AndroidManifest.xml --> Application 选项卡 --> 向下选择您的活动。最后,选择您喜欢的方向。 您可以选择众多选项之一。
【讨论】:
【参考方案13】:您必须在 manifest.xml 文件中添加以下代码。 不应旋转的活动,在该活动中添加此元素
android:screenOrientation="portrait"
那么它就不会旋转了。
【讨论】:
【参考方案14】:你可以试试这个方法
<?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>
【讨论】:
【参考方案15】:使用 AsyncTaskLoader 来确保您的数据安全,即使活动发生变化,也不要使用 AsyncTask 来构建应用程序,而不是防止屏幕旋转。
【讨论】:
【参考方案16】:防止屏幕旋转只需在您的清单中添加以下行。
<activity
android:name=".YourActivity"
android:screenOrientation="portrait" />
这对我有用。
【讨论】:
以上是关于防止Android上的屏幕旋转的主要内容,如果未能解决你的问题,请参考以下文章
YouTube 视频在 WebView Android 中仅在屏幕旋转时播放音频
UnsatisfiedLinkError - 在 Android 中旋转相机图像数据(在 OpenCV 中使用,而不仅仅是在屏幕上显示)