防止Android上的屏幕旋转
我有我的一个活动,我想防止旋转,因为我开始一个AsyncTask,并且屏幕旋转使其重新启动。
有没有办法告诉这个活动“即使用户像疯了一样摇动手机,不要旋转屏幕?
将android:screenOrientation="portrait"
添加到清单或landscape
的<activity>
元素中,就完成了。
您可以按照下面的逻辑来防止在 AsyncTask
运行时自动旋转屏幕:
- 使用
getRequestedOrientation()
将您的当前屏幕方向存储在您的活动中。 - 使用
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR)
禁用自动屏幕方向。 - 运行/执行你的
AsyncTask
。 - 在
AsyncTask
的最后,使用setRequestedOrientation(oldOrientation)
恢复以前的方向状态。
请注意,有几种方法可以访问AsyncTask
Activity
(在UI线程上运行)属性。 你可以实现你的AsyncTask
作为一个内部类,或者你可以使用消息Handler
戳你的Activiy
类。
在你的Manifest文件中,对于你想locking屏幕旋转的每个Activity添加:如果你想locking在水平模式下:
<activity ... ... android:screenOrientation="landscape">
或者如果你想locking在垂直模式下:
<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); }
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,你可以这样做:
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中的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>
加:
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR); ... ... ... }
如果您使用的是Android开发工具 (ADT)和Eclipse ,则可以转到您的AndroidManifest.xml – > 应用程序选项卡 – >然后select您的活动。 最后,select你喜欢的方向。 您可以select多个选项之一。
您必须在manifest.xml文件中添加以下代码。 该活动不应该旋转,在该活动中添加此元素
android:screenOrientation="portrait"
然后它不会旋转。