Проверьте ориентацию на телефоне Android

Как я могу проверить, находится ли телефон Android в ландшафте или портрете?

21 ответов


текущая конфигурация, используемая для определения ресурсов для извлечения, доступна из ресурсов"


Если вы используете getResources ().getConfiguration().ориентации на некоторых устройствах вы получите это неправильно. Мы использовали этот подход изначально в http://apphance.com. Благодаря удаленному журналированию Apphance мы могли видеть его на разных устройствах, и мы видели, что фрагментация играет свою роль здесь. Я видел странные случаи: например, чередование портрета и квадрата(?!) на HTC Desire HD:

CONDITION[17:37:10.345] screen: rotation: 270 orientation: square
CONDITION[17:37:12.774] screen: rotation: 0 orientation: portrait
CONDITION[17:37:15.898] screen: rotation: 90
CONDITION[17:37:21.451] screen: rotation: 0
CONDITION[17:38:42.120] screen: rotation: 270 orientation: square

или вообще не менять ориентацию:

CONDITION[11:34:41.134] screen: rotation: 0
CONDITION[11:35:04.533] screen: rotation: 90
CONDITION[11:35:06.312] screen: rotation: 0
CONDITION[11:35:07.938] screen: rotation: 90
CONDITION[11:35:09.336] screen: rotation: 0

С другой стороны, width () и height () всегда верны (он используется оконным менеджером, поэтому лучше быть). Я бы сказал, что лучшая идея-всегда проверять ширину/высоту. Если вы задумаетесь на мгновение, это именно то, что вы хотите - узнать, меньше ли ширина высоты (портрет), противоположность (пейзаж) или они одинаковы (квадрат).

тогда это сводится к этому простому коду:

public int getScreenOrientation()
{
    Display getOrient = 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;
}

другой способ решения этой проблемы - не полагаться на правильное возвращаемое значение с дисплея, а полагаться на разрешение ресурсов Android.

создать файл layouts.xml в папке res/values-land и res/values-port следующего содержания:

res / values-земля / макеты.XML-код:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <bool name="is_landscape">true</bool>
</resources>

res / values-порт / макеты.XML-код:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <bool name="is_landscape">false</bool>
</resources>

в исходном коде вы можете получить доступ к текущей ориентации следует:

context.getResources().getBoolean(R.bool.is_landscape)

полный способ указать текущую ориентацию телефона:

    public String getRotation(Context context){
    final int rotation = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getOrientation();
           switch (rotation) {
            case Surface.ROTATION_0:
                return "portrait";
            case Surface.ROTATION_90:
                return "landscape";
            case Surface.ROTATION_180:
                return "reverse portrait";
            default:
                return "reverse landscape";
            }
        }

Chear Бинь Нгуен


вот фрагмент кода демо, как получить ориентацию экрана было рекомендовано hackbod и Martijn:

Trigger триггер при изменении ориентации:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
        int nCurrentOrientation = _getScreenOrientation();
    _doSomeThingWhenChangeOrientation(nCurrentOrientation);
}

❷ получить текущую ориентацию как hackbod рекомендую:

private int _getScreenOrientation(){    
    return getResources().getConfiguration().orientation;
}

❸There являются альтернативным решением для получения текущей ориентации экрана follow следуйте Martijn устранение:

private int _getScreenOrientation(){
        Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
        return display.getOrientation();
}

Примечание: Я был попробовать реализовать ❷ & ❸ , Но при ориентации RealDevice (NexusOne SDK 2.3) он возвращает неправильную ориентацию.

★Так что я рекомендуют использовать раствор❷, чтобы получить ориентацию экрана, которые имеют больше преимуществ: ясно, просто и работать как шарм.

★Проверьте тщательно возврат ориентации, чтобы обеспечить правильный, как мы ожидали (может быть ограничено зависит от спецификации физических устройств)

надеюсь, что это поможет,


int ot = getResources().getConfiguration().orientation;
switch(ot)
        {

        case  Configuration.ORIENTATION_LANDSCAPE:

            Log.d("my orient" ,"ORIENTATION_LANDSCAPE");
        break;
        case Configuration.ORIENTATION_PORTRAIT:
            Log.d("my orient" ,"ORIENTATION_PORTRAIT");
            break;

        case Configuration.ORIENTATION_SQUARE:
            Log.d("my orient" ,"ORIENTATION_SQUARE");
            break;
        case Configuration.ORIENTATION_UNDEFINED:
            Log.d("my orient" ,"ORIENTATION_UNDEFINED");
            break;
            default:
            Log.d("my orient", "default val");
            break;
        }

использовать getResources().getConfiguration().orientation Это правильный путь.

вам просто нужно следить за различными типами ландшафтов, ландшафтом, который обычно использует устройство, и другим.

все еще не понимаю, как это сделать.


прошло некоторое время с тех пор, как большинство этих ответов были опубликованы, а некоторые используют теперь устаревшие методы и константы.

я обновил Ярек код чтобы не использовать эти методы и константы:

protected int getScreenOrientation()
{
    Display getOrient = getWindowManager().getDefaultDisplay();
    Point size = new Point();

    getOrient.getSize(size);

    int orientation;
    if (size.x < size.y)
    {
        orientation = Configuration.ORIENTATION_PORTRAIT;
    }
    else
    {
        orientation = Configuration.ORIENTATION_LANDSCAPE;
    }
    return orientation;
}

обратите внимание, что режим Configuration.ORIENTATION_SQUARE больше не поддерживается.

Я нашел это надежным на всех устройствах, которые я тестировал, в отличие от метода, предполагающего использование getResources().getConfiguration().orientation


Проверьте ориентацию экрана во время выполнения.

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

    // Checks the orientation of the screen
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();

    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
        Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();        
    }
}

есть еще один способ сделать это:

public int getOrientation()
{
    if(getResources().getDisplayMetrics().widthPixels>getResources().getDisplayMetrics().heightPixels)
    { 
        Toast t = Toast.makeText(this,"LANDSCAPE",Toast.LENGTH_SHORT);
        t.show();
        return 1;
    }
    else
    {
        Toast t = Toast.makeText(this,"PORTRAIT",Toast.LENGTH_SHORT);
        t.show();
        return 2;
    }       
}

Android SDK может сказать вам это просто отлично:

getResources().getConfiguration().orientation

Я думаю, что этот код может работать после того, как изменение ориентации вступило в силу

Display getOrient = getWindowManager().getDefaultDisplay();

int orientation = getOrient.getOrientation();

переопределить действие.onconfigurationchanged (конфигурация newConfig) функция и использовать newConfig,ориентация, если вы хотите получить уведомление о новой ориентации перед вызовом setContentView.


Я думаю, что использование getRotationv() не помогает, потому что http://developer.android.com/reference/android/view/Display.html#getRotation%28%29 getRotation () возвращает вращение экрана из его "естественной" ориентации.

поэтому, если вы не знаете "естественной" ориентации, вращение бессмысленно.

Я нашел более простой способ,

  Display display = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
  Point size = new Point();
  display.getSize(size);
  int width = size.x;
  int height = size.y;
  if(width>height)
    // its landscape

пожалуйста, скажите мне, если есть проблема с этим кто-то?


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

   private void initActivityScreenOrientPortrait()
    {
        // Avoid screen rotations (use the manifests android:screenOrientation setting)
        // Set this to nosensor or potrait

        // Set window fullscreen
        this.activity.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

        DisplayMetrics metrics = new DisplayMetrics();
        this.activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);

         // Test if it is VISUAL in portrait mode by simply checking it's size
        boolean bIsVisualPortrait = ( metrics.heightPixels >= metrics.widthPixels ); 

        if( !bIsVisualPortrait )
        { 
            // Swap the orientation to match the VISUAL portrait mode
            if( this.activity.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT )
             { this.activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); }
            else { this.activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT ); }
        }
        else { this.activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR); }

    }

работает как шарм!


используйте этот путь,

    int orientation = getResources().getConfiguration().orientation;
    String Orintaion = "";
    switch (orientation)
    {
        case Configuration.ORIENTATION_UNDEFINED: Orintaion = "Undefined"; break;
        case Configuration.ORIENTATION_LANDSCAPE: Orintaion = "Landscrape"; break;
        case Configuration.ORIENTATION_PORTRAIT:  Orintaion = "Portrait"; break;
        default: Orintaion = "Square";break;
    }

в строке у вас есть Oriantion


есть много способов сделать это , этот кусок кода работает для меня

 if (this.getWindow().getWindowManager().getDefaultDisplay()
                .getOrientation() == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) {
             // portrait mode
} else if (this.getWindow().getWindowManager().getDefaultDisplay()
                .getOrientation() == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {
                      // landscape
        }

простой и легкий :)

  1. сделать 2 XML-макета ( i.E портрет и пейзаж)
  2. в файле java напишите:

    private int intOrientation;
    

    at onCreate способ и до setContentView пишем:

    intOrientation = getResources().getConfiguration().orientation;
    if (intOrientation == Configuration.ORIENTATION_PORTRAIT)
        setContentView(R.layout.activity_main);
    else
        setContentView(R.layout.layout_land);   // I tested it and it works fine.
    

Я думаю, что это решение легко

if (context.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT){
  user_todat_latout = true;
} else {
  user_todat_latout = false;
}

такое это наложение всех телефонов, таких как oneplus3

public static boolean isScreenOriatationPortrait(Context context) {
         return context.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT;
         }

справа код следующим образом:

public static int getRotation(Context context){
        final int rotation = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getOrientation();

        if(rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_180){
            return Configuration.ORIENTATION_PORTRAIT;
        }

        if(rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270){
            return Configuration.ORIENTATION_LANDSCAPE;
        }

        return -1;
    }

также стоит отметить, что в настоящее время существует меньше оснований для проверки явной ориентации с getResources().getConfiguration().orientation Если вы делаете это по причинам макета, как Поддержка Нескольких Окон введенный в Android 7 / API 24 + может немного испортить ваши макеты в любой ориентации. Лучше рассмотреть возможность использования <ConstraintLayout> и альтернативные макеты в зависимости от доступной ширины или высоты, наряду с другими трюками для определения того, какой макет используется, например, наличие или не определенных фрагментов, связанных с вашей деятельностью.


в файле активности:

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

    private void checkOrientation(Configuration newConfig){
        // Checks the orientation of the screen
        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
            Log.d(TAG, "Current Orientation : Landscape");
            // Your magic here for landscape mode          
        } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
            Log.d(TAG, "Current Orientation : Portrait");
            // Your magic here for portrait mode         
        }
    }

и в файле манифеста:

<activity android:name=".ActivityName"
            android:configChanges="orientation|screenSize">

Я надеюсь, что это поможет вам ..!