我有一个活动,因为我正在启动AsyncTask,所以希望防止其旋转屏幕,屏幕旋转会使其重新启动。
有没有一种方法可以告诉这个活动,“即使用户使劲晃动手机,也不要旋转屏幕”?
android:screenOrientation="portrait"
或者 android:screenOrientation="landscape"
在清单文件中添加<activity>
元素/元素组,即可完成。
getRequestedOrientation()
将当前屏幕方向存储在您的活动中。setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR)
禁用自动屏幕方向。AsyncTask
。AsyncTask
结束时,使用setRequestedOrientation(oldOrientation)
恢复先前的方向状态。AsyncTask
内部访问运行在UI线程上的Activity
属性。 您可以将AsyncTask
实现为内部类,或者您可以使用消息Handler
来提醒您的Activity
类。The easiest way I found to do this was to put
this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
在onCreate中,紧接着
setContentView(R.layout.activity_main);
so...
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
在您的清单文件中,对于每个要锁定屏幕旋转的 Activity,请添加以下内容:如果您想在横向模式下锁定屏幕旋转:
<activity
...
...
android:screenOrientation="landscape">
或者如果您想将其锁定在垂直模式:
<activity
...
...
android:screenOrientation="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或更高。所以基本上这是矛头所在。
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>
"portrait"
用户可能会感觉是个好的解决方案。但它会强制某些设备(最适合横屏的设备)进入纵向模式,导致无法获得正确的方向。在最新的Android版本中,您将会遇到错误。因此,我的建议是最好使用"nosensor"
。<activity
...
...
android:screenOrientation="nosensor">
[ 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>
添加:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
...
...
...
}
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>
android:screenOrientation="portrait"
这将使活动仅以竖直方向显示,并防止其随设备旋转而旋转。如果要禁用横向旋转,将“portrait”更改为“landscape”。但是,请注意,如果您的应用需要在不同方向下提供不同的布局或行为,则不应使用此方法。 - Dan LewsetRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED);
这行代码来锁定屏幕方向。 - mcy