Mode orientasi “potret”

298

Saya mencoba untuk memaksa mode "portrait" untuk aplikasi saya karena aplikasi saya sama sekali tidak dirancang untuk mode "landscape".

Setelah membaca beberapa forum, saya menambahkan baris ini di file manifes saya:

<application 
  android:debuggable="true"
  android:icon="@drawable/icon" 
  android:label="@string/app_name"
  android:screenOrientation="portrait">

Tapi itu tidak berfungsi di perangkat saya (HTC Desire). Ini beralih dari "portrait" lo "landscape", mengabaikan garis dari file manifes.

Setelah lebih banyak forum membaca, saya mencoba menambahkan ini dalam file manifes saya:

<application 
  android:debuggable="true"
  android:icon="@drawable/icon" 
  android:label="@string/app_name"
  android:configChanges="orientation"       
  android:screenOrientation="portrait">

dan fungsi ini di kelas aktivitas saya:

public void onConfigurationChanged(Configuration newConfig)
{
    super.onConfigurationChanged(newConfig);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}

Tetapi sekali lagi, tidak berhasil.

thomaus
sumber

Jawaban:

531

Jangan menerapkan orientasi ke elemen aplikasi , sebaliknya Anda harus menerapkan atribut ke elemen aktivitas , dan Anda juga harus mengatur configChangesseperti yang disebutkan di bawah ini.

Contoh:

<activity
   android:screenOrientation="portrait"
   android:configChanges="orientation|keyboardHidden">
</activity>

Ini diterapkan dalam file manifes AndroidManifest.xml.

C0deAttack
sumber
26
Untuk apa konfigurasi?
Dror
71
@Orchestrator, configChanges berarti bahwa perubahan konfigurasi ditangani oleh aktivitas itu sendiri. Tanpa itu, aktivitas akan dimulai kembali jika ada perubahan orientasi. Anda mungkin bertanya, apakah Anda telah menentukan bahwa orientasi "potret" bagaimana itu akan berubah? Itu dapat berubah jika Anda meluncurkan aktivitas lain yang mengubah orientasi, maka aktivitas baru itu keluar, mengembalikan Anda ke aktivitas Anda. Sebagai contoh, maksud pengambilan gambar default pada Samsung Galaxy S3 melakukan itu dalam orientasi tertentu.
Gordon McCreight
2
@GordonMcCreight, Bisakah Anda jelaskan ini dengan contoh nyata "Anda mungkin bertanya, jika Anda telah menentukan bahwa orientasi adalah" potret "bagaimana itu akan berubah? Itu dapat berubah jika Anda meluncurkan aktivitas lain yang mengubah orientasi, maka itu aktivitas baru keluar, mengembalikan Anda kembali ke aktivitas Anda. "
Tushar Pandey
3
Tentu, @TusharPandey. Jika saya ingat dengan benar, satu-satunya tempat yang membuat kami berduka adalah ketika aktivitas kami meluncurkan maksud pengambilan gambar default pada Samsung Galaxy S3. Pada dasarnya, kami hanya ingin mengambil gambar dan mendapatkan hasilnya. Namun, ketika niat kamera kembali, itu menyebabkan perubahan orientasi yang menghapus status dalam aktivitas kami, karena kami tidak percaya kami perlu melindungi dari itu (mengingat bahwa seluruh aplikasi kami hanya pernah dalam orientasi "potret"). Bagaimana dan mengapa Galaxy S3 melakukan ini di luar pemahaman saya (memang terbatas).
Gordon McCreight
8
Mengapa "keyboardHidden" dimasukkan?
gonzobrains
24

Catat itu

android:screenOrientation="portrait"     
android:configChanges="orientation|keyboardHidden"

ditambahkan dalam file manifes - tempat aktivitas didefinisikan.

Pointer NULL
sumber
13

Saya pikir android:screenOrientation="portrait"dapat digunakan untuk kegiatan individu. Jadi gunakan atribut itu dalam <activity>tag seperti:

<activity android:name=".<Activity Name>"
    android:label="@string/app_name" 
    android:screenOrientation="portrait">
   ...         
</activity>
Pinki
sumber
13

Jika Anda memiliki banyak aktivitas seperti milik saya, dalam aplikasi Anda, atau jika Anda tidak ingin memasukkan kode untuk setiap tag aktivitas dalam manifes Anda dapat melakukan ini.

di kelas Basis Aplikasi Anda, Anda akan mendapatkan panggilan balik siklus hidup

jadi pada dasarnya apa yang terjadi di untuk setiap aktivitas saat membuat buat di Kelas Aplikasi dapat dipicu di sini adalah kode ..

public class MyApplication extends Application{

@Override
    public void onCreate() {
        super.onCreate();  

  registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
            @Override
            public void onActivityCreated(Activity activity, Bundle bundle) {
                activity.setRequestedOrientation(
                        ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);


// for each activity this function is called and so it is set to portrait mode


            }

            @Override
            public void onActivityStarted(Activity activity) {

            }

            @Override
            public void onActivityResumed(Activity activity) {

            }

            @Override
            public void onActivityPaused(Activity activity) {

            }

            @Override
            public void onActivityStopped(Activity activity) {

            }

            @Override
            public void onActivitySaveInstanceState(Activity activity, Bundle bundle) {

            }

            @Override
            public void onActivityDestroyed(Activity activity) {

            }
        });
}

saya harap ini membantu.

Muneef M
sumber
1
Jawaban yang efisien! ini harus menjadi jawaban yang benar, terutama bagi mereka yang mengembangkan aplikasi kompleks yang sangat bergantung pada sejumlah besar Kegiatan.
FEBRYAN ASA PERDANA
10

Atur mode Portrait atau Landscape , masing-masing Tambahkan baris.

Impor di bawah baris:

import android.content.pm.ActivityInfo;

Tambahkan baris di bawah tepat di atas setContentView(R.layout.activity_main);

Untuk Potret :

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//Set Portrait

Untuk Lansekap :

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//Set Landscape

Ini pasti akan berhasil.

Parth Patel
sumber
1
Ini gagal dengan Android 9 pada beberapa perangkat - transisi rotasi layar terlihat sesaat bahkan jika Anda hanya menggunakan PORTRAIT
Igor Wojda
Bisakah Anda menentukan info perangkat yang Anda hadapi ini, jika mungkin
Parth Patel
4

Menurut dokumentasi Android, Anda juga harus sering memasukkan screenSizeperubahan konfigurasi yang dimungkinkan.

android:configChanges="orientation|screenSize"

Jika aplikasi Anda menargetkan API level 13 atau lebih tinggi (sebagaimana dinyatakan oleh atribut minSdkVersion dan targetSdkVersion), maka Anda juga harus mendeklarasikan konfigurasi "screenSize", karena itu juga berubah ketika perangkat beralih antara orientasi potret dan lanskap.

Juga, jika Anda semua termasuk nilai keyboardHiddendi contoh Anda, sebaiknya tidak Anda kemudian juga mempertimbangkan locale, mcc, fontScale, keyboarddan lain-lain? ..

Martynas
sumber
3

Saya memiliki baris ini di AndroidManifest.xml saya

<activity 
    android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale"
    android:label="@string/app_name" android:name="Project Name"
    android:theme="@android:style/Theme.Black.NoTitleBar">

Yang saya ubah menjadi (baru ditambahkan android:screenOrientation="portrait")

<activity 
    android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale"
    android:label="@string/app_name" android:name="Project Name"
    android:screenOrientation="portrait"
    android:theme="@android:style/Theme.Black.NoTitleBar">

Ini memperbaikinya bagi saya.

Ian Jamieson
sumber
2

Sesuatu untuk melengkapi: Saya telah memperbarui aplikasi baru-baru ini, yang sebelumnya berfungsi dalam mode lansekap dan potret, dan saya ingin versi yang diperbarui harus bekerja dalam mode potret, jadi saya menambahkan

android:screenOrientation="portrait"

ke aktivitas yang sesuai, dan hanya macet ketika saya menguji pembaruan. Lalu saya menambahkan

android:configChanges="orientation|keyboardHidden"

juga, dan itu berhasil.

pengguna2819453
sumber
1
Jika ini bukan jawaban untuk pertanyaan, mungkin menambahkannya sebagai komentar akan membantu.
JPReddy
Pastikan Anda menambahkannya ke aktivitas bukan untuk blok aplikasi
Waran-
1

Saya pikir Anda ingin menambah android:configChanges="orientation|keyboardHidden"aktivitas Anda? Jika tidak, aktivitas akan dimulai kembali dari perubahan konfigurasi. Itu onConfigurationChangedtidak akan dipanggil kemudian, hanyaonCreate

Nanne
sumber
1

Jika Anda ingin mendukung berbagai orientasi debugdan releasepengembangan, tulislah (lihat https://developer.android.com/studio/build/gradle-tips#share-properties-with-the-manifest ).

Di build.gradledalam appfolder Anda tulis:

android {
    ...
    buildTypes {
        debug {
            applicationIdSuffix '.debug'
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            // Creates a placeholder property to use in the manifest.
            manifestPlaceholders = [orientation: "fullSensor"]
        }
        release {
            debuggable true
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            // Creates a placeholder property to use in the manifest.
            manifestPlaceholders = [orientation: "portrait"]
        }
    }
}

Kemudian di AndroidManifestAnda dapat menggunakan "orientasi" variabel ini dalam Activity:

<activity
    android:name=".LoginActivity"
    android:screenOrientation="${orientation}" />

Anda dapat menambahkan android:configChanges:

manifestPlaceholders = [configChanges: "", orientation: "fullSensor"]dalam debug dan manifestPlaceholders = [configChanges: "keyboardHidden|orientation|screenSize", orientation: "portrait"]rilis,

<activity
    android:name=".LoginActivity"
    android:configChanges="${configChanges}"
    android:screenOrientation="${orientation}" />
CoolMind
sumber
-8

Jawaban singkat: Jangan lakukan itu.

Mendesain ulang aplikasi Anda sehingga dapat berjalan dalam mode potret dan lansekap. Tidak ada yang namanya UI yang tidak dapat dirancang untuk berfungsi baik dalam potret maupun lanskap; hanya pengembang yang malas atau tidak imajinatif.

Alasannya agak sederhana. Anda ingin aplikasi Anda dapat digunakan oleh audiens seluas mungkin pada sebanyak mungkin perangkat yang berbeda. Dengan memaksakan orientasi layar tertentu, Anda mencegah aplikasi Anda berjalan (biasanya) pada perangkat yang tidak mendukung orientasi itu dan Anda membuat frustrasi dan mengasingkan pelanggan potensial yang lebih memilih orientasi yang berbeda.

Contoh: Anda mendesain aplikasi Anda untuk memaksa mode potret. Pelanggan mengunduh aplikasi pada perangkat 2-in-1 yang sebagian besar mereka gunakan dalam mode lansekap.
Konsekuensi 1: Aplikasi Anda tidak dapat digunakan, atau pelanggan Anda terpaksa melepas perangkat mereka, memutarnya, dan menggunakannya dalam orientasi yang tidak akrab atau nyaman bagi mereka.
Konsekuensi 2: Pelanggan merasa frustrasi dengan desain non-intuitif aplikasi Anda dan menemukan alternatif atau membuang aplikasi sepenuhnya.

Saya berjuang dengan ini dengan aplikasi sekarang dan sebagai konsumen dan pengembang, saya benci itu. Sama bermanfaatnya dengan aplikasi ini, sama fantastisnya dengan fitur yang ditawarkannya, saya benar-benar membenci aplikasi tersebut karena memaksa saya untuk menggunakan orientasi yang bertentangan dengan setiap cara saya menggunakan perangkat saya.

Anda tidak ingin pelanggan membenci aplikasi Anda.


Saya tahu ini tidak langsung menjawab pertanyaan, jadi saya ingin menjelaskannya secara lebih rinci bagi mereka yang penasaran.

Ada kecenderungan bagi pengembang untuk benar-benar pandai menulis kode dan benar-benar buruk dalam mendesain. Pertanyaan ini, meskipun kedengarannya seperti pertanyaan kode dan penanya tentu merasa seperti pertanyaan kode, sebenarnya adalah pertanyaan desain.

Pertanyaan sebenarnya adalah "Haruskah saya mengunci orientasi layar di aplikasi saya?" Penanya memilih untuk merancang UI agar berfungsi dan hanya terlihat baik dalam mode potret. Saya menduga itu untuk menghemat waktu pengembangan atau karena alur kerja aplikasi sangat kondusif untuk tata letak potret (umum untuk game seluler). Tetapi alasan-alasan itu mengabaikan semua faktor penting nyata yang memotivasi desain yang tepat.

  1. Keterlibatan pelanggan - Anda ingin pelanggan merasa tertarik ke dalam aplikasi Anda, bukan didorong keluar dari situ. Aplikasi harus bertransisi dengan lancar dari apa pun yang dilakukan pelanggan Anda sebelum membuka aplikasi Anda. (Inilah alasan mengapa sebagian besar platform memiliki prinsip-prinsip desain yang konsisten, sehingga sebagian besar aplikasi terlihat kurang lebih sama meskipun tidak perlu.)

  2. Respons pelanggan - Anda ingin pelanggan bereaksi positif terhadap aplikasi Anda. Mereka harus menikmati menggunakannya. Bahkan jika itu adalah aplikasi penggajian untuk bekerja, itu harus menjadi kesenangan bagi mereka untuk membukanya dan masuk. Aplikasi ini harus menghemat waktu pelanggan Anda dan mengurangi frustrasi atas alternatif. (Aplikasi yang mengganggu pengguna membangun kebencian terhadap aplikasi Anda yang tumbuh menjadi kebencian terhadap merek Anda.)

  3. Konversi pelanggan - Anda ingin pelanggan Anda dapat dengan cepat dan mudah berpindah dari browsing ke berinteraksi. Ini adalah tujuan akhir dari aplikasi apa pun, untuk mengubah tayangan menjadi pendapatan. (Aplikasi yang tidak menghasilkan pendapatan adalah pemborosan waktu Anda untuk membangun, dari perspektif bisnis.)

UI yang dirancang dengan buruk mengurangi keterlibatan dan respons pelanggan yang pada akhirnya menghasilkan pendapatan yang lebih rendah. Dalam dunia mobile-centric (dan terutama pada subjek mode portrait / landscape display), ini menjelaskan mengapa desain web responsif adalah masalah besar. Walmart Kanada memperkenalkan desain responsif di situs web mereka pada November 2013 dan melihat peningkatan konversi pelanggan sebesar 20% . O'Neill Clothing menerapkan desain web responsif dan pendapatan dari pelanggan yang menggunakan perangkat iOS meningkat 101,25% , dan 591,42% dari pelanggan yang menggunakan perangkat Android .

Ada juga kecenderungan bagi pengembang untuk fokus pada penerapan solusi tertentu (seperti penguncian orientasi tampilan), dan sebagian besar pengembang di situs ini akan sangat senang untuk membantu mengimplementasikan solusi tersebut, tanpa mempertanyakan apakah itu adalah yang terbaik solusi untuk masalah tersebut.

Mengunci orientasi layar Anda adalah desain UI yang setara dengan menerapkan loop do-while. Apakah Anda benar-benar yakin ingin melakukannya dengan cara itu, atau adakah alternatif yang lebih baik?

Jangan paksa aplikasi Anda ke mode tampilan tunggal. Investasikan waktu dan upaya ekstra untuk membuatnya responsif.

Thomas
sumber
2
Saya mengerti dan setuju dengan Anda tentang hal itu karena UI yang dirancang dengan buruk. Tapi itu tidak mengubah fakta bahwa Anda MUNGKIN PERLU melakukannya, dan bagaimanapun kerangka kerja harus memiliki kemampuan tersebut, secara umum. Anda tidak pernah tahu seperti apa aplikasi yang akan datang dan perlu dilakukan, jadi pertanyaannya masih valid.
Z. Khullah
1
Kamu tidak salah. Saya pikir jawaban saya sebagian didorong oleh frustrasi yang saya miliki dengan beberapa aplikasi yang melakukan ini tidak perlu dan itu benar-benar merusak pengalaman. Saya akan mengatakan bahwa jumlah kasus yang sah untuk mengunci mode tampilan sangat kecil (dan masih bisa dilakukan dan lebih disukai, hanya saja tidak sesuai anggaran). Ini mengingatkan masalah lain; dengan coding menjadi semudah itu ada banyak pengembang amatir menulis aplikasi karena mereka tahu kode tetapi tanpa belajar bagaimana melakukan UI atau desain, atau bahkan praktik terbaik dasar (aplikasi Java yang menginstal di \ AppData - EWWWW).
Thomas
1
Saya sedang membangun aplikasi VR. Orientasi HARUS lanskap untuk kacamata untuk melakukan keajaiban mereka. Itulah salah satu contoh UI yang tidak dapat dirancang untuk berfungsi baik dalam potret maupun lanskap. Game juga mungkin harus memaksakan orientasi tertentu. Saya yakin ada banyak kasus yang sah.
Raslanove
1
Sementara StackExchange ada untuk menjawab pertanyaan spesifik, jawaban harus ditulis untuk diterapkan secara umum agar jawaban tersebut bermanfaat bagi orang lain. Pengembangan jauh lebih dari sekedar menulis kode dan alasan ada begitu banyak aplikasi sampah di dunia adalah karena begitu banyak pengembang lupa - atau tidak pernah belajar - prinsip penting ini. Saya pribadi akan menambahkan bahwa jika Anda melakukan VR pada telepon Anda melakukan VR yang salah - tetapi biaya telah mendorong permintaan untuk VR ke platform yang seharusnya tidak pernah mendukungnya.
Thomas
1
Saya tidak setuju dengan jawaban ini, tetapi menjawab pertanyaan yang tidak ditanyakan.
bmovement