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; } }
Я думаю, что этот код может работать после изменения ориентации и вступило в силу
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 }
просто и легко :)
- сделать 2 XML макеты (Т. Е. Портрет и пейзаж )
в файле 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