Ngăn xoay màn hình trên Android


315

Tôi có một trong những hoạt động mà tôi muốn ngăn không cho xoay vì tôi đang bắt đầu sử dụng AsyncTask và xoay màn hình sẽ khiến nó khởi động lại.

Có cách nào để nói với hoạt động này "KHÔNG QUAY LẠI màn hình ngay cả khi người dùng lắc điện thoại như điên"?



11
Bạn có thể đối phó với thay đổi hướng màn hình AsyncT task. Ngăn chặn thay đổi hướng màn hình chỉ là một cách giải quyết lười biếng. Và không khó để giữ AsyncTask tồn tại qua các thay đổi định hướng :)
Romain Guy


56
Sẽ thực sự hữu ích hơn rất nhiều khi thực sự cung cấp một giải pháp hoặc một số mã, Romain, thay vì chỉ khẳng định "một giải pháp tồn tại và nó không khó".
Peter vdL

2
bạn có thể sử dụng setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED);
mcy

Câu trả lời:


467

Thêm vào

android:screenOrientation="portrait" 

hoặc là

 android:screenOrientation="landscape" 

đến <activity>phần tử / s trong bảng kê khai và bạn đã hoàn thành.


95
Xin lưu ý rằng đây chỉ là một lỗi trong ứng dụng của bạn, khiến người dùng ít gặp phải lỗi này hơn. Nhưng họ vẫn sẽ. Mọi thay đổi cấu hình có thể khiến hoạt động của bạn khởi động lại. Bạn thực sự cần phải viết chính xác hoạt động của mình để xử lý tác vụ không đồng bộ khi nó khởi động lại.
hackbod

1
Điều này đã không làm việc cho tôi trong một trường hợp. Tôi đã đặt màn hình thành ngang trước khi mở ứng dụng. Khi tôi mở ứng dụng, màn hình xoay sang chân dung và thực hiện cuộc gọi thứ hai tới asynctask.
dùng522559

2
Bạn cần đặt mọi thứ thành "mở ở chế độ dọc" "luôn ở chế độ dọc". Chỉ làm 1 là vô nghĩa.
Carol

1
@hackbod bất kể, đây là số 1 google hit cho "ứng dụng android ngăn xoay màn hình", nhu cầu của tôi không liên quan gì đến các tác vụ không đồng bộ
chiliNUT

7
@hackbod Làm thế nào để chúng ta viết chính xác hoạt động của mình để giải quyết vấn đề này?
dùng41805

127

Bạn có thể làm theo logic bên dưới để ngăn màn hình tự động xoay trong khi bạn AsyncTaskđang chạy:

  1. Lưu trữ hướng màn hình hiện tại của bạn bên trong hoạt động của bạn bằng cách sử dụng getRequestedOrientation().
  2. Vô hiệu hóa định hướng màn hình tự động bằng cách sử dụng setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR).
  3. Chạy / thực hiện của bạn AsyncTask.
  4. Khi kết thúc AsyncTaskkhôi phục trạng thái định hướng trước đó của bạn bằng cách sử dụng setRequestedOrientation(oldOrientation).

Xin lưu ý rằng có một số cách để truy cập Activity(chạy trên luồng UI) trong một thuộc tính AsyncTask. Bạn có thể thực hiện AsyncTasknhư là một lớp bên trong hoặc bạn có thể sử dụng tin nhắn Handlerchọc Activiylớp của bạn .


9
Tốt hơn nhiều so với câu trả lời được chọn.
Matej

3
ý tưởng tuyệt vời :) bạn không lưu trữ hướng màn hình hiện tại của mình, bạn có thể sử dụng ActivityInfo.SCREEN_ORIENTATION_UNSPECifyED
fligant

Điều này có vẻ khó tin, @emre, cảm ơn! Có vẻ như "Quá tốt là đúng!" Lưu ý số lượng thảo luận khổng lồ về vấn đề này: stackoverflow.com/q/3821423/294884 ... các chuyên gia Android, có bất kỳ nhược điểm nào ở đây không?! Cảm ơn một lần nữa .. rất nhiều.
Fattie

3
Chết tiệt !! Điều này KHÔNG LÀM VIỆC nếu thiết bị xảy ra BEGIN IN MODE CẢNH QUAN. Cái quái gì thế! Sux: O
Fattie

@Emre, Mã này không hoạt động trong một số trường hợp nhất định. Ví dụ: nếu người dùng thay đổi hướng của mình giữa lúc bắt đầu AsyncTask và kết thúc của nó. Bạn đã lưu và khôi phục lại hướng sai.
Pacerier

27

Trong tệp Bản kê khai của bạn, đối với mỗi Hoạt động mà bạn muốn khóa xoay màn hình, hãy thêm: nếu bạn muốn khóa nó ở chế độ nằm ngang:

<activity
        ...
        ...
        android:screenOrientation="landscape">

hoặc nếu bạn muốn khóa nó ở chế độ dọc:

<activity
            ...
            ...
            android:screenOrientation="portrait">

24

Cách dễ nhất tôi tìm thấy để làm điều này là đặt

this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

trong vòng onCreate, ngay sau đó

setContentView(R.layout.activity_main);

vì thế...

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

7

Thay vì đi vào AndroidManifest, bạn có thể làm điều này:

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);
}

Hạn chế duy nhất ở đây là nó yêu cầu API cấp 18 trở lên. Vì vậy, về cơ bản đây là đầu của ngọn giáo.


Phần này đang vô hiệu hóa nút ứng dụng gia đình và gần đây và ngay cả sau khi phát hành khóa với SCREEN_ORIENTATION_FULL_SENSOR, nó ở trạng thái bị vô hiệu hóa. Trong Android N.
kAmol

6

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>

2

Thuộc tính sau đây về HOẠT ĐỘNG trong AndroidManifest.xml là tất cả những gì bạn cần:

android:configChanges="orientation"

Vì vậy, nút hoạt động đầy đủ sẽ là:

<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>

1

Thêm vào:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
        ...
        ...
        ...
}

1

Thêm phần sau vào AndroidManifest.xml của bạn

[ứng dụng> src> chính> AndroidManifest.xml]

<activity android:name=".MainActivity"
          android:configChanges="orientation"
          android:screenOrientation="portrait"/>

Thí dụ:

<?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>


0

Bạn phải thêm đoạn mã sau vào tệp manifest.xml. Hoạt động không nên xoay, trong hoạt động đó thêm phần tử này

android:screenOrientation="portrait"

Sau đó, nó sẽ không xoay.


0

Bạn có thể thử theo cách này

<?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>


0

Sử dụng AsyncTaskLoader để giữ an toàn cho dữ liệu của bạn ngay cả khi hoạt động thay đổi, thay vì sử dụng AsyncTask , đó là cách tốt hơn để xây dựng ứng dụng thay vì ngăn xoay màn hình.


0

Ngăn chặn Xoay màn hình chỉ cần thêm dòng sau vào Bản kê khai của bạn.

<activity
        android:name=".YourActivity"
        android:screenOrientation="portrait" />

Điều này làm việc cho tôi.


0

Người dùng "portrait"trong tệp AndroidManifest.xml của bạn có vẻ như là một giải pháp tốt. Nhưng nó buộc các thiết bị nhất định (hoạt động tốt nhất trong phong cảnh) phải đi vào chân dung, không có được định hướng thích hợp. Trên phiên bản Android mới nhất, bạn sẽ gặp lỗi. Vì vậy, đề nghị của tôi là tốt hơn để sử dụng "nosensor".

<activity
        ...
        ...
        android:screenOrientation="nosensor">
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.