Bagaimana saya bisa mendapatkan orientasi layar saat ini?

190

Saya hanya ingin mengatur beberapa flag ketika orientasi saya berada di landscape sehingga ketika aktivitas dibuat kembali di onCreate () saya bisa beralih antara apa yang dimuat di portrait vs landscape. Saya sudah memiliki layout-land xml yang menangani tata letak saya.

public void onConfigurationChanged(Configuration _newConfig) {

        if (_newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
            this.loadURLData = false;
        }

        if (_newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
            this.loadURLData = true;
        }

        super.onConfigurationChanged(_newConfig);
    }

Over-riding onConfigurationChanged akan mencegah layout-land xml saya memuat dalam orientasi lanskap.

Saya hanya ingin mendapatkan orientasi perangkat saya saat ini di onCreate (). Bagaimana saya bisa mendapatkan ini?

Sheehan Alam
sumber

Jawaban:

475
Activity.getResources().getConfiguration().orientation
EboMike
sumber
8
Ini hanya menyediakan dua nilai ORIENTATION_PORTRAIT dan ORIENTATION_LANDSCAPE. Apakah ada cara untuk mendapatkan keempat nilai dari ActivityInfo? (Itu juga LANDSCAPE_REVERSE dan PORTRAIT_REVERSE)
HRJ
18
@HRJ Anda dapat menggunakan getWindowManager (). GetDefaultDisplay (). GetRotation ()
MKJParekh
24
getWindowManager (). getDefaultDisplay (). getRotation () mengembalikan rotasi dengan referensi ke orientasi "alami" layar, yaitu untuk tablet akan mengembalikan Surface.ROTATION_0 dalam mode lansekap, sedangkan untuk ponsel akan mengembalikan nilai yang sama untuk potret.
Zoltán
65
int orientation = this.getResources().getConfiguration().orientation;
if (orientation == Configuration.ORIENTATION_PORTRAIT) {
    // code for portrait mode
} else {
    // code for landscape mode
}

Ketika superclass thisadalahContext

Daniel
sumber
28

Di beberapa perangkat void onConfigurationChanged()mungkin macet. Pengguna akan menggunakan kode ini untuk mendapatkan orientasi layar saat ini.

public int getScreenOrientation()
{
    Display getOrient = getActivity().getWindowManager().getDefaultDisplay();
    int orientation = Configuration.ORIENTATION_UNDEFINED;
    if(getOrient.getWidth()==getOrient.getHeight()){
        orientation = Configuration.ORIENTATION_SQUARE;
    } else{ 
        if(getOrient.getWidth() < getOrient.getHeight()){
            orientation = Configuration.ORIENTATION_PORTRAIT;
        }else { 
             orientation = Configuration.ORIENTATION_LANDSCAPE;
        }
    }
    return orientation;
}

Dan gunakan

if (orientation==1)        // 1 for Configuration.ORIENTATION_PORTRAIT
{                          // 2 for Configuration.ORIENTATION_LANDSCAPE
   //your code             // 0 for Configuration.ORIENTATION_SQUARE
}
Sakthimuthiah
sumber
1
Harap perhatikan bahwa getOrient.getWidth () dan getOrient.getHeight () sudah tidak digunakan lagi sekarang.
valerybodak
Harus ditandai sebagai jawaban yang benar dengan cara yang lebih detail
Zapnologica
1
Harus ditandai sebagai jawaban yang benar dan berfungsi paling baik di semua kondisi. Tetapi harap dicatat bahwa anivaler berkata getActivity (). GetWindowManager (). GetDefaultDisplay (). GetWidth () dan getHeight () sudah tidak digunakan lagi sekarang). Silakan gunakan getSize (Point outsize). Ini dapat digunakan sebagai melewati objek titik baru dan itu akan mendapatkan anggota x dan y.
Mahendra Chhimwal
seperti Point outSize = new point (); getOrient.getSize (outSize); if (outSize.x == outSize.y) mengembalikan SQUARE;
Mahendra Chhimwal
Pikir saya akan menunjukkan, bahwa Configuration.ORIENTATION_SQUARE sudah usang dan sementara itu mungkin telah didefinisikan sebagai 0 pada 2013, itu didefinisikan sebagai 3, sementara Configuration.ORIENTIATION_UNDEFINED didefinisikan sebagai 0. Ceria.
Dave
26
int rotation =  getWindowManager().getDefaultDisplay().getRotation();

ini akan memberikan semua orientasi seperti normal dan mundur

dan menanganinya seperti

int angle = 0;
switch (rotation) {
    case Surface.ROTATION_90:
        angle = -90;
        break;
    case Surface.ROTATION_180:
        angle = 180;
        break;
    case Surface.ROTATION_270:
        angle = 90;
        break;
    default:
        angle = 0;
        break;
}
AndroidBeginner
sumber
final int angle = (rotation == Surface.ROTATION_90) ? 90 : (rotation == Surface.ROTATION_180) ? 180 : (rotation == Surface.ROTATION_270) ? 270 : 0;
Andrey Syrokomskiy
12
getActivity().getResources().getConfiguration().orientation

perintah ini mengembalikan nilai int 1 untuk Portrait dan 2 untuk Landscape

Rudolf Coutinho
sumber
4

Jika ada orang yang ingin mendapatkan deskripsi orientasi yang bermakna (seperti yang diteruskan onConfigurationChanged(..)dengan itu reverseLandscape, sensorLandscapedan sebagainya), cukup gunakangetRequestedOrientation()

a.ch.
sumber
1

Di kelas aktivitas Anda, gunakan metode di bawah ini:

 @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);

        // Checks the orientation of the screen
        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {

            setlogo();// Your Method
            Log.d("Daiya", "ORIENTATION_LANDSCAPE");

        } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {

            setlogoForLandScape();// Your Method
            Log.d("Daiya", "ORIENTATION_PORTRAIT");
        }
    }

Kemudian untuk menyatakan bahwa aktivitas Anda menangani perubahan konfigurasi, edit elemen yang sesuai dalam file manifes Anda untuk menyertakan android:configChangesatribut dengan nilai yang mewakili konfigurasi yang ingin Anda tangani. Nilai yang mungkin tercantum dalam dokumentasi untuk android:configChangesatribut (nilai yang paling umum digunakan adalah "orientasi" untuk mencegah restart ketika orientasi layar berubah dan "keyboardHidden" untuk mencegah memulai kembali ketika ketersediaan keyboard berubah). Anda dapat mendeklarasikan beberapa nilai konfigurasi dalam atribut dengan memisahkannya dengan pipa | karakter.

<activity android:name=".MyActivity"
          android:configChanges="orientation|keyboardHidden"
          android:label="@string/app_name">

Itu saja!!

DalveerSinghDaiya
sumber
0

jika Anda ingin menimpa metode onConfigurationChanged dan tetap ingin melakukan hal-hal dasar maka pertimbangkan untuk menggunakan super.onConfigyrationChanged () sebagai pernyataan pertama dalam metode overriden.

Samarth S
sumber
0

Saya hanya ingin mengusulkan alternatif lain yang akan membuat Anda khawatir:

android:configChanges="orientation|keyboardHidden" 

menyiratkan bahwa kami secara eksplisit menyatakan tata letak yang akan disuntikkan.

Dalam kasus kami ingin menyimpan injeksi otomatis berkat tata letak-tanah dan folder tata letak. Yang harus Anda lakukan adalah menambahkannya ke onCreate:

    if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
        getSupportActionBar().hide();

    } else if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
        getSupportActionBar().show();
    }

Di sini, kami menampilkan atau tidak actionbar tergantung pada orientasi ponsel

Z3nk
sumber