Cegah rotasi layar di Android

315

Saya memiliki salah satu kegiatan saya yang ingin saya hindari memutar karena saya memulai AsyncTask, dan rotasi layar membuatnya restart.

Apakah ada cara untuk mengatakan kegiatan ini "JANGAN memutar layar meskipun pengguna menggoyangkan teleponnya seperti orang gila"?

Sephy
sumber
11
Anda dapat menangani perubahan orientasi layar dan AsyncTasks. Mencegah perubahan orientasi layar hanyalah solusi malas. Dan tidak sulit untuk membuat AsyncTask tetap hidup dalam perubahan orientasi :)
Romain Guy
56
Akan jauh lebih bermanfaat untuk benar-benar memberikan solusi atau kode, Romain, daripada hanya menyatakan "solusi ada dan itu tidak sulit".
Peter vdL
2
Anda dapat menggunakan setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED);
mcy

Jawaban:

467

Menambahkan

android:screenOrientation="portrait" 

atau

 android:screenOrientation="landscape" 

ke <activity>elemen dalam manifes dan Anda selesai.

lbedogni
sumber
95
Harap perhatikan bahwa ini hanya menyembunyikan bug di aplikasi Anda, sehingga kecil kemungkinannya bagi pengguna untuk menemukannya. Tapi mereka tetap akan melakukannya. Setiap perubahan konfigurasi dapat menyebabkan aktivitas Anda dimulai kembali. Anda benar-benar perlu menulis aktivitas Anda dengan benar untuk menangani tugas async saat memulai kembali.
hackbod
1
Ini tidak berhasil untuk saya dalam satu kasus. Saya mengatur layar ke lanskap sebelum membuka aplikasi. Ketika saya membuka aplikasi, layar diputar ke potret dan menyebabkan panggilan kedua ke asynctask.
user522559
2
Anda perlu mengatur hal-hal untuk "terbuka dalam mode potret" DAN "selalu tetap dalam mode potret". Melakukan hanya 1 tidak ada gunanya.
Carol
1
@hackbod bagaimanapun, ini adalah nomor 1 hit google untuk "aplikasi android mencegah rotasi layar," kebutuhan saya tidak ada hubungannya dengan tugas
chiliNUT
7
@hackbod Bagaimana cara kita menulis aktivitas kita dengan benar untuk mengatasi masalah ini?
user41805
127

Anda dapat mengikuti logika di bawah ini untuk mencegah layar putar otomatis saat Anda AsyncTaskmenjalankan:

  1. Simpan orientasi layar Anda saat ini di dalam aktivitas Anda menggunakan getRequestedOrientation().
  2. Nonaktifkan orientasi layar otomatis menggunakan setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR).
  3. Jalankan / jalankan AsyncTask.
  4. Di akhir Anda AsyncTaskmengembalikan status orientasi sebelumnya menggunakan setRequestedOrientation(oldOrientation).

Harap perhatikan bahwa ada beberapa cara untuk mengakses Activity(yang berjalan pada utas UI) properti di dalam AsyncTask. Anda dapat mengimplementasikan Anda AsyncTasksebagai kelas dalam atau Anda dapat menggunakan pesan Handleryang menyodok Activiykelas Anda .

Emre Yazici
sumber
9
Jauh lebih baik daripada jawaban yang dipilih.
Matej
3
ide bagus :) Anda tidak harus menyimpan orientasi layar Anda saat ini, Anda dapat menggunakan ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED
fligant
Ini sepertinya luar biasa, @re, terima kasih! Sepertinya "Terlalu bagus untuk menjadi kenyataan!" Perhatikan sejumlah besar diskusi tentang masalah ini: stackoverflow.com/q/3821423/294884 ... pakar android, apakah ada kelemahan di sini ?! Terima kasih sekali lagi ..
Fattie
3
Sampah!! Ini TIDAK BEKERJA jika perangkat BEGIN IN LANDSCAPE MODE. Apa apaan! Sux: O
Fattie
@Emre, Kode ini tidak berfungsi dalam kasus tertentu. Misalnya, jika pengguna mengubah orientasinya antara awal AsyncTask Anda dan yang terakhir. Anda akan menyimpan dan memulihkan orientasi yang salah saat itu.
Pacerier
27

Di file Manifest Anda, untuk setiap Kegiatan yang Anda ingin mengunci rotasi layar, tambahkan: jika Anda ingin menguncinya dalam mode horizontal:

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

atau jika Anda ingin menguncinya dalam mode vertikal:

<activity
            ...
            ...
            android:screenOrientation="portrait">
Sara
sumber
24

Cara termudah yang saya temukan untuk melakukan ini adalah dengan meletakkan

this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

dalam onCreate, setelahnya

setContentView(R.layout.activity_main);

begitu...

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

Daripada masuk ke AndroidManifest, Anda bisa melakukan ini:

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

Satu-satunya kelemahan di sini adalah ia membutuhkan API level 18 atau lebih tinggi. Jadi pada dasarnya ini adalah ujung tombak.

Antuan Develle Claude
sumber
Bagian ini menonaktifkan tombol beranda dan aplikasi terbaru dan bahkan setelah melepaskan kunci dengan SCREEN_ORIENTATION_FULL_SENSOR, yang dalam keadaan dinonaktifkan. Di 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>
Li Che
sumber
2

Atribut berikut pada ACTIVITY di AndroidManifest.xml adalah yang Anda butuhkan:

android:configChanges="orientation"

Jadi, simpul aktivitas penuh adalah:

<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>
Ben
sumber
1

Menambahkan:

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

Tambahkan yang berikut ke AndroidManifest.xml Anda

[app> src> main> AndroidManifest.xml]

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

Contoh:

<?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>
andrewoodleyjr
sumber
0

Jika Anda menggunakan Alat Pengembang Android (ADT) dan Eclipse, Anda dapat membuka AndroidManifest.xml -> tab Aplikasi -> turun dan pilih aktivitas Anda. Terakhir, pilih orientasi yang Anda inginkan. Anda dapat memilih salah satu dari banyak opsi.

Husam
sumber
0

Anda harus menambahkan kode berikut dalam file manifes.xml. Aktivitas yang tidak boleh dirotasi, dalam aktivitas itu tambahkan elemen ini

android:screenOrientation="portrait"

Maka itu tidak akan berputar.

Simon Chius
sumber
0

Anda bisa mencoba cara ini

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

Muhaiminur Rahman
sumber
0

Gunakan AsyncTaskLoader untuk menjaga data Anda tetap aman bahkan jika aktivitas berubah, alih-alih menggunakan AsyncTask yang merupakan cara yang lebih baik untuk membangun aplikasi daripada mencegah rotasi layar.

Bbake Waikhom
sumber
0

Cegah Rotasi Layar cukup tambahkan baris berikut ini di Manifes Anda.

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

Ini bekerja untuk saya.

DEVSHK
sumber
0

Pengguna "portrait"dalam file AndroidManifest.xml Anda mungkin tampak seperti solusi yang bagus. Tapi itu memaksa perangkat tertentu (yang berfungsi terbaik dalam lanskap) untuk masuk ke potret, bukan mendapatkan orientasi yang tepat. Pada versi Android terbaru, Anda akan mendapatkan kesalahan. Jadi saran saya lebih baik digunakan "nosensor".

<activity
        ...
        ...
        android:screenOrientation="nosensor">
Md Imran Choudhury
sumber