防止Android上的屏幕旋转

Sep*_*phy 302 android screen rotation

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

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

lbe*_*gni 445

android:screenOrientation="portrait" 
Run Code Online (Sandbox Code Playgroud)

要么

 android:screenOrientation="landscape" 
Run Code Online (Sandbox Code Playgroud)

<activity>清单中的元素,你已经完成了.

  • 请注意,这只是隐藏了您应用中的错误,使用户不太可能绊倒它.但他们仍然会.任何配置更改都可能导致您的活动重新启动.您确实需要正确编写活动以在重新启动时处理异步任务. (90认同)
  • @hackbod我们如何正确地编写我们的活动来处理这个问题? (7认同)
  • 您需要将事物设置为"以纵向模式打开"*和*"始终保持纵向模式".只做1是没有意义的. (2认同)

Emr*_*ici 124

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

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

请注意,有几种方法可以访问Activity(在UI线程上运行)的属性AsyncTask.您可以将您AsyncTask的内容类实现为内部类,也可以使用Handler戳您的Activiy类的消息.

  • 比选定的答案要好得多. (9认同)
  • 废话!如果设备碰巧在景观模式中开始,这**不起作用**.我勒个去!苏克斯:哦 (3认同)
  • 好主意:)你没有存储你当前的屏幕方向你可以使用ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED (2认同)

Sar*_*ara 26

在您的清单文件中,对于要锁定屏幕旋转的每个活动添加:如果要以水平模式锁定它:

<activity
        ...
        ...
        android:screenOrientation="landscape">
Run Code Online (Sandbox Code Playgroud)

或者如果要在垂直模式下锁定它:

<activity
            ...
            ...
            android:screenOrientation="portrait">
Run Code Online (Sandbox Code Playgroud)


Pau*_*der 23

我发现这样做最简单的方法就是放

this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
Run Code Online (Sandbox Code Playgroud)

在onCreate之后,就在之后

setContentView(R.layout.activity_main);
Run Code Online (Sandbox Code Playgroud)

所以...

@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
Run Code Online (Sandbox Code Playgroud)


小智 6

您可以这样做,而不是进入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);
}
Run Code Online (Sandbox Code Playgroud)

这里唯一的缺点是它需要API级别18或更高.所以基本上这是矛的尖端.


Li *_*Che 5

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) {       
     }   
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)