我有一个我想阻止旋转的活动,因为我正在启动AsyncTask,并且屏幕旋转使其重新启动。
有没有办法告诉此活动“即使用户疯狂地摇晃手机也不要旋转屏幕”?
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED);
我有一个我想阻止旋转的活动,因为我正在启动AsyncTask,并且屏幕旋转使其重新启动。
有没有办法告诉此活动“即使用户疯狂地摇晃手机也不要旋转屏幕”?
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED);
Answers:
加
android:screenOrientation="portrait"
要么
android:screenOrientation="landscape"
到<activity>
清单中的元素,您就完成了。
你可以按照下面的逻辑,以防止自动旋转屏幕,而你AsyncTask
正在运行:
getRequestedOrientation()
。setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR)
。AsyncTask
。AsyncTask
还原结束时,您可以使用来恢复以前的方向状态setRequestedOrientation(oldOrientation)
。请注意,可以通过多种方法访问Activity
(在UI线程上运行)属性AsyncTask
。您可以将自己实现AsyncTask
为内部类,也可以使用Handler
戳戳您的Activiy
类的消息。
我发现做到这一点的最简单方法是
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或更高。所以基本上这是矛的尖端。
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>
将以下内容添加到您的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>
如果您使用的是Android开发人员工具(ADT)和Eclipse ,则可以转到AndroidManifest.xml-> 应用程序选项卡->向下并选择您的活动。最后,选择您的首选方向。您可以选择许多选项之一。
你可以这样尝试
<?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>
即使活动发生变化,也可以使用AsyncTaskLoader来确保数据安全,而不是使用AsyncTask来构建应用,这比阻止屏幕旋转是一种更好的方法。
"portrait"
AndroidManifest.xml文件中的用户似乎是一个很好的解决方案。但是,这会迫使某些设备(在横向条件下效果最好)进入纵向状态,而无法获得正确的方向。在最新的Android版本上,您会遇到错误。所以我的建议最好使用"nosensor"
。
<activity
...
...
android:screenOrientation="nosensor">