Paksa aktivitas Android untuk selalu menggunakan mode lansekap


144

Saya menggunakan penampil Android VNC pada HTC G1 saya . Tetapi untuk beberapa alasan, aplikasi itu selalu dalam mode lansekap meskipun G1 saya dalam mode potret. Karena penampil Android VNC adalah open source, saya ingin tahu bagaimana mungkin hard code suatu kegiatan menjadi 'landscape'. Saya ingin mengubahnya untuk menghormati orientasi telepon.

Jawaban:


188

Melihat AndroidManifest.xml ( tautan ), di baris 9:

<activity android:screenOrientation="landscape" android:configChanges="orientation|keyboardHidden" android:name="VncCanvasActivity">

Baris ini menentukan screenOrientationlansekap sebagai, tetapi penulis melangkah lebih jauh dalam mengesampingkan perubahan orientasi layar apa pun configChanges="orientation|keyboardHidden". Ini menunjuk ke fungsi yang ditimpa di VncCanvasActivity.java.

Jika Anda melihat VncCanvasActivity, on line 109 adalah fungsi yang diganti:

@Override
public void onConfigurationChanged(Configuration newConfig) {
  // ignore orientation/keyboard change
  super.onConfigurationChanged(newConfig);
}

Penulis secara khusus memberikan komentar untuk mengabaikan perubahan keyboard atau orientasi.


Jika Anda ingin mengubah ini, Anda dapat kembali ke file AndroidManifest.xml yang ditunjukkan di atas, dan ubah baris ke:

<activity android:screenOrientation="sensor" android:name="VncCanvasActivity">

Ini harus mengubah program untuk beralih dari potret ke lanskap saat pengguna memutar perangkat.

Ini mungkin berhasil, tetapi mungkin mengacaukan tampilan GUI, tergantung pada bagaimana tata letak dibuat. Anda harus bertanggung jawab untuk itu. Juga, tergantung pada bagaimana aktivitas dikodekan, Anda mungkin memperhatikan bahwa ketika orientasi layar diubah, nilai-nilai yang diisi ke dalam setiap kotak input menghilang. Ini juga mungkin harus ditangani.


3
Mengapa configChangesatribut itu dibutuhkan? Tampaknya berfungsi pada ponsel non-keyboard saya tanpa itu ... Dalam situasi apa orientasi akan berubah menjadi potret jika Anda memiliki screenOrientation="landscape"tetapi mengabaikannya configChanges?
Timmmm


bagaimana memaksakan aktivitas bawaan seperti pustaka pilih gambar sistem hanya dalam lanskap atau hanya potret?
Jacky

118

Anda dapat mengatur data yang sama dalam kode java Anda juga.

myActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

Nilai-nilai lain pada ActivityInfo akan memungkinkan Anda mengaturnya kembali ke sensor-driven atau portrait yang dikunci. Secara pribadi, saya suka mengaturnya ke sesuatu di Manifest seperti yang disarankan dalam jawaban lain untuk pertanyaan ini dan kemudian mengubahnya nanti menggunakan panggilan di atas di Android SDK jika ada kebutuhan.


@ Yegor Tidak selalu. Dari android docs:If the activity is currently in the foreground or otherwise impacting the screen orientation, the screen will immediately be changed (possibly causing the activity to be restarted)
Chaitanya

40

Di saya OnCreate(Bundle), saya biasanya melakukan hal berikut:

this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

2
metode manifes dalam jawaban lain sepertinya tidak berfungsi tetapi @anwarma milikmu berhasil
Anup

31

Anda dapat menentukan orientasi suatu aktivitas dalam manifes. Lihat di sini .

<activity android:allowTaskReparenting=["true" | "false"]
...
          android:screenOrientation=["unspecified" | "user" | "behind" |
                                     "landscape" | "portrait" |
                                     "sensor" | "nosensor"]
...
                                       "adjustResize", "adjustPan"] >  

24

Dalam manifes:

<activity  android:name=".YourActivity"
android:screenOrientation="portrait"
android:configChanges="orientation|screenSize">

Dalam aktivitas Anda:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
setContentView(R.layout.your_activity_layout);

11

Berikut ini adalah kode yang saya gunakan untuk menampilkan semua aktivitas dalam mode lansekap:

<activity android:screenOrientation="landscape"
          android:configChanges="orientation|keyboardHidden"
          android:name="abcActivty"/>

2
"orientasi" Jika aplikasi Anda menargetkan API level 13 atau lebih tinggi maka Anda juga harus mendeklarasikan "screenSize"
Mina Fawzy

7

Solusi cepat dan sederhana untuk file AndroidManifest.xml, tambahkan berikut ini untuk setiap aktivitas yang ingin Anda paksa ke mode lansekap:

android:screenOrientation="landscape"

5

Ini berfungsi untuk Xamarin. Android. Di OnCreate ()

RequestedOrientation = Android.Content.PM.ScreenOrientation.Landscape;

4

Itu dia!! Lama menunggu perbaikan ini.

Saya memiliki masalah Android lama tentang memulai dua kali aktivitas yang memerlukan mode lansekap (terprogram): setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)

Sekarang Android membuat mode Landscape di awal.


3

Arslan, mengapa Anda ingin memaksakan orientasi secara tata bahasa, meskipun sudah ada cara dalam manifes <activity android:name=".youractivityName" android:screenOrientation="portrait" />


Saya bukan penanya, tapi mungkin dia ingin memaksa secara programatis karena dia ingin memaksanya pada waktu tertentu?
Hamzah Malik

1

Melakukannya dalam kode adalah IMO salah dan bahkan lebih jika Anda memasukkannya ke dalam onCreate. Lakukan dalam manifes dan "sistem" mengetahui orientasi dari awal aplikasi. Dan meta jenis ini atau "pedoman" tingkat atas HARUS ada dalam manifes. Jika Anda ingin membuktikannya pada diri sendiri, setel istirahat di onCreate Activity. Jika Anda melakukannya dalam kode di sana ia akan dipanggil dua kali: dimulai dalam mode Portrait kemudian beralih ke Lansekap. Ini tidak terjadi jika Anda melakukannya di manifes.


1
Saya tidak setuju. Melakukan apa pun dalam kode sebagai lawan melalui manifes selalu menjadi metode yang saya sukai. Berdasarkan prinsip tanggung jawab tunggal, manifes hanya harus berkaitan dengan properti tingkat aplikasi, izin, dan ikatan API. Saya sebenarnya tidak setuju dengan tag <activity> yang hadir sama sekali dalam manifes aplikasi dan jadi saya tidak pernah memasangnya di sana (dan berfungsi dengan baik). Bagaimana suatu kegiatan disajikan jelas merupakan masalah presentasi. Aktivitas Anda harus sepenuhnya bertanggung jawab atas bagaimana presentasi itu disajikan dan oleh karena itu saya biasanya meletakkan semua logika presentasi dalam kode tampilan / aktivitas.
Datang

0

Untuk Android 4.0 (Ice Cream Sandwich) dan yang lebih baru, saya perlu menambahkan ini, di samping landscapenilainya.

android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"

Hanya menggunakan keyboardHidden|orientationmasih akan menghasilkan kebocoran memori dan rekreasi kegiatan saya saat menekan tombol daya.


Peringatan praktik buruk! Ini tidak ada hubungannya dengan memaksa aktivitas dalam mode lansekap. Anda juga harus menerapkan penyimpanan dan rekreasi keadaan aktivitas Anda. Itulah pengetahuan dasar Pengembangan Android. Jangan mengatasinya dengan perbaikan yang diretas ini. Aktivitas ini dapat selalu ditutup oleh sistem jika perlu lebih banyak memori.
Roel

@Roel, yah itu satu-satunya cara untuk mencegah aktivitas untuk memutar kembali ke potret ketika misalnya Anda memutar perangkat. Ini mencegah bahwa konfigurasi ini mempengaruhi aktivitas.
Peterdk

Maaf untuk pesan sedikit pemarah, tapi saya mengujinya dan saya tidak semua nilai ini untuk mode lansekap. Ketika Anda menambahkan semua nilai ini berarti Anda menangani sendiri perubahan di onConfigurationChanged () alih-alih aktivitas baru saja dimulai kembali (dan Anda harus mengimplementasikannya!) Tetapi jika Anda memaksakan landchape, rotasi tidak akan terjadi.
Roel

Hai, beberapa dari mereka mungkin tidak diperlukan, tetapi menghilangkan semuanya akan menghasilkan masalah rotasi aneh. Saya tidak bisa mengujinya sekarang, tetapi ketika saya sedang mengembangkan aplikasi yang harus dalam lanskap sepanjang waktu, hanya menggunakan orientation|screensizetidak cukup dalam semua kasus. Itu akan autorotate kembali ke potret.
Peterdk

Konfigurasi ini juga digunakan dalam Iklan Seluler Google dan SDK Iklan lainnya. Dari situlah saya mendapatkannya.
Peterdk

0

Gunakan ActivityInfo (android.content.pm.ActivityInfo) di metode onCreate Anda sebelum memanggil metode setLayout seperti ini

this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);


0

Tambahkan Garis Berikut dalam Aktivitas

Anda harus masuk dalam setiap Aktivitas

untuk lansekap

android:screenOrientation="landscape"
tools:ignore="LockedOrientationActivity"

untuk potret

android:screenOrientation="portrait"
tools:ignore="LockedOrientationActivity"

Berikut Contoh MainActivity

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="org.thcb.app">
    <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=".MainActivity"
            android:screenOrientation="landscape"
            tools:ignore="LockedOrientationActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity android:name=".MainActivity2"
            android:screenOrientation="portrait"
            tools:ignore="LockedOrientationActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.