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



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

459   21  

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

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

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

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-port / layouts.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";
            }
        }

слушать Бинь Нгуен

вот фрагмент кода демо, как получить ориентацию экрана было рекомендовано 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;
}

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

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

Примечание: Я был попробовать реализовать ❷ & ❸ , Но на Роальдович (NexusOne СДК 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 макеты (Т. Е. Портрет и пейзаж )
  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">

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

Comments

    Ничего не найдено.