как определить ориентацию устройства Android? - PullRequest
47 голосов
/ 25 февраля 2011

Возможно ли просто определить текущую ориентацию устройства Android, не программируя слушателя и не обрабатывая матрицу положения?В моем приложении я хочу знать только текущую ориентацию - вертикальную или горизонтальную - на данный момент.Однако я не хочу слушать события аксиометрии или другие события.

Ответы [ 7 ]

67 голосов
/ 28 сентября 2012

Вы также можете использовать:

getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE
65 голосов
/ 25 февраля 2011

Используйте метод getRotation:

Display display = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
int rotation = display.getRotation();

Из документации:

Возвращает поворот экрана из его «естественной» ориентации. Возвращаемое значение может быть Surface.ROTATION_0 (без вращения), Surface.ROTATION_90, Surface.ROTATION_180 или Surface.ROTATION_270. Например, если устройство имеет естественно высокий экран, и пользователь повернул его на бок, чтобы перейти в альбомную ориентацию, возвращаемое здесь значение может быть либо Surface.ROTATION_90, либо Surface.ROTATION_270 в зависимости от направления его поворота. Угол поворота нарисованной графики на экране является противоположным направлением физического поворота устройства. Например, если устройство поворачивается на 90 градусов против часовой стрелки, для компенсации рендеринга будет поворачиваться на 90 градусов по часовой стрелке, и поэтому возвращаемое значение здесь будет Surface.ROTATION_90.

Имейте в виду, что getRotation был представлен в Android 2.2. Используйте getOrientation, если ваша цель - старые устройства.

7 голосов
/ 25 февраля 2011

Есть хорошая статья на эту тему, которую нужно прочитать: Один поворот экрана заслуживает другого

1 голос
/ 30 января 2019

Вы можете сделать функцию расширения из приведенного выше кода:

fun AppCompatActivity.getRotation(): Int{
    val display = (baseContext.getSystemService(Context.WINDOW_SERVICE) as WindowManager).defaultDisplay
    val rotation = display.rotation
    when(rotation){
        Surface.ROTATION_90 -> return R.integer.LANDSCAPE
        Surface.ROTATION_270 -> return R.integer.LANDSCAPE
        Surface.ROTATION_180 -> return R.integer.PORTRAIT
        Surface.ROTATION_0 -> return R.integer.PORTRAIT
        else ->
            return R.integer.PORTRAIT
    }
}

В своем каталоге ресурсов создайте файл constants.xml со следующим содержимым:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <integer name="LANDSCAPE">0</integer>
    <integer name="PORTRAIT">1</integer>
</resources>

Ваш кодтогда так же просто, как (например, вертикальное / горизонтальное расположение для Recyclerview во фрагменте:

val a  = activity as AppCompatActivity
        val orientation = a.getRotation()
        when (orientation){
            R.integer.PORTRAIT -> rv.layoutManager = LinearLayoutManager(activity, RecyclerView.VERTICAL,false)
            R.integer.LANDSCAPE -> rv.layoutManager = LinearLayoutManager(activity, RecyclerView.HORIZONTAL,false)
        }
1 голос
/ 14 июня 2015

Я думаю, что самый безопасный и простой способ - добавить тег для некоторого элемента вашей деятельности в XML.Например, установите для тэга видового пейджера «портрет» в макете портрета и установите для него «ландшафт» в альбомной ориентации.Затем в вашей проверке на наличие тега вот так:

if(mViewpager.getTag().equals("portrait"))
  // is in portrait
else
  // is in landscape
1 голос
/ 20 февраля 2014

Вам просто нужно знать высоту и ширину вашего холста ... вашу поверхность ... ваш монитор ... и т.д.

может быть, вы можете получить это с помощью:

if (canvas.getHeight()>canvas.getWidth() ) {
//portrait
}
else
{
//landscape
}
0 голосов
/ 14 августа 2016

Это может не относиться к делу, но если случайно вам нужно это знать, поскольку вы хотите заблокировать устройство в его текущей ориентации, вы можете переключаться между следующими двумя строками кода.

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LOCKED);
...