我有一个我想阻止旋转的活动,因为我正在启动一个AsyncTask,屏幕旋转使它重新启动。
有没有办法告诉这个活动“即使用户像疯了一样摇晃他的手机也不要旋转屏幕”?
添加
android:screenOrientation="portrait"
或
android:screenOrientation="landscape"
到<activity>元素/s在
<activity>
你可以按照下面的逻辑来防止自动旋转屏幕而你的AsyncTask正在运行:
AsyncTask
getRequestedOrientation()
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR)
setRequestedOrientation(oldOrientation)
请注意,有几种方法可以访问AsyncTask中的Activity(在UI线程上运行)属性。你可以实现你的AsyncTask作为一个内部类,或者你可以使用消息Handler来插入你的Activiy类。
Activity
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或更高。所以基本上这是矛的尖端。
那么它就不会旋转。
添加:
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"。
"portrait"
"nosensor"
<activity ... ... android:screenOrientation="nosensor">
而且