在Android上防止屏幕旋转

我有一个我想阻止旋转的活动,因为我正在启动一个AsyncTask,屏幕旋转使它重新启动。

有没有办法告诉这个活动“即使用户像疯了一样摇晃他的手机也不要旋转屏幕”?

257072 次浏览

添加

android:screenOrientation="portrait"

 android:screenOrientation="landscape"

<activity>元素/s在

你可以按照下面的逻辑来防止自动旋转屏幕你的AsyncTask正在运行:

  1. 使用getRequestedOrientation()将当前屏幕方向存储在活动中。
  2. 使用setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR)禁用自动屏幕朝向。
  3. 运行/执行你的AsyncTask
  4. AsyncTask结束时,使用setRequestedOrientation(oldOrientation)恢复您之前的方向状态。

请注意,有几种方法可以访问AsyncTask中的Activity(在UI线程上运行)属性。你可以实现你的AsyncTask作为一个内部类,或者你可以使用消息Handler来插入你的Activiy类。

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>

在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>

在你的Manifest文件中,对于每个你想锁定屏幕旋转的Activity添加:如果你想锁定在水平模式:

<activity
...
...
android:screenOrientation="landscape">

或者如果你想锁定在垂直模式:

<activity
...
...
android:screenOrientation="portrait">

如果你正在使用Android开发工具 (ADT)和Eclipse 你可以到AndroidManifest.xml——> 应用程序选项卡——>,然后选择你的活动。最后,选择你喜欢的方向。

.

.

.

我发现最简单的方法就是把

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);
}

而不是进入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或更高。所以基本上这是矛的尖端。

你必须在manifest.xml文件中添加以下代码。 它不应该旋转的活动,在该活动中添加这个元素

android:screenOrientation="portrait"

那么它就不会旋转。

添加:

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
...
...
...
}

你可以试试这种方法

<?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

[应用程序> 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,这是一个更好的方法来构建应用程序,而不是防止屏幕旋转。

防止屏幕旋转只需在清单中添加以下一行。

<activity
android:name=".YourActivity"
android:screenOrientation="portrait" />

这对我很有用。

在你的AndroidManifest.xml文件中的用户"portrait"似乎是一个很好的解决方案。但它会迫使某些设备(在横向环境下工作得最好)进入纵向模式,而不能获得正确的方向。在最新的Android版本上,你会得到一个错误。所以我建议最好使用"nosensor"

<activity
...
...
android:screenOrientation="nosensor">
< p > android: screenOrientation =“portrait" 在应用程序标签<应用程序

而且

< p > & lt;活动 ... ... android: screenOrientation =“locked"祝辞< / p >