Как проверить, имеет ли телефон Android альбом "Пейзаж" или "Портрет"?
Проверьте ориентацию на телефоне Android
Ответ 1
Текущая конфигурация, используемая для определения того, какие ресурсы получить, доступна из объекта Resources Configuration
:
getResources().getConfiguration().orientation;
Вы можете проверить ориентацию, посмотрев на ее значение:
int orientation = getResources().getConfiguration().orientation;
if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
// In landscape
} else {
// In portrait
}
Дополнительную информацию можно найти в Android Developer.
Ответ 2
Если вы используете 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;
}
Ответ 3
Еще один способ решения этой проблемы - не полагаться на правильное возвращаемое значение на дисплее, но полагаться на разрешение ресурсов Android.
Создайте файл layouts.xml
в папках res/values-land
и res/values-port
со следующим содержимым:
RES/значение-земля/layouts.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<bool name="is_landscape">true</bool>
</resources>
RES/значения порта /layouts.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<bool name="is_landscape">false</bool>
</resources>
В исходном коде вы можете теперь получить доступ к текущей ориентации следующим образом:
context.getResources().getBoolean(R.bool.is_landscape)
Ответ 4
Полностью указать текущую ориентацию телефона:
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 Бинь Нгуен
Ответ 5
Вот пример фрагмента кода, как получить ориентацию экрана, рекомендуется hackbod и Martijn:
❶ Триггер при изменении Ориентация:
@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();
}
★ Примечание: Я попробовал оба реализовать ❷ и ❸, но на RealDevice (NexusOne SDK 2.3) Ориентация возвращает неправильную ориентацию.
★ Итак, я рекомендую использовать решение ❷, чтобы получить ориентацию экрана, которая имеет больше преимуществ: четко, просто и работает как шарм.
★ Проверьте правильность возврата ориентации, чтобы убедиться в правильности нашего ожидаемого (может быть, ограниченная зависимость от спецификации физических устройств).
Надеюсь, что это поможет,
Ответ 6
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;
}
Ответ 7
Используйте getResources().getConfiguration().orientation
правильный путь.
Вам просто нужно следить за различными типами ландшафтов, пейзажем, который обычно использует устройство, и другим.
По-прежнему не понимаю, как это можно сделать.
Ответ 8
Прошло некоторое время с тех пор, как большинство этих ответов были опубликованы, а некоторые используют устаревшие методы и константы.
Я обновил код Jarek, чтобы больше не использовать эти методы и константы:
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
Ответ 9
Проверьте ориентацию экрана во время выполнения.
@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();
}
}
Ответ 10
Есть еще один способ сделать это:
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;
}
}
Ответ 11
Android SDK может сказать вам это просто прекрасно:
getResources().getConfiguration().orientation
Ответ 12
Я думаю, что этот код может работать после того, как изменение ориентации вступит в силу
Display getOrient = getWindowManager().getDefaultDisplay();
int orientation = getOrient.getOrientation();
переопределить функцию Activity.onConfigurationChanged(Конфигурация newConfig) и использовать newConfig, ориентацию, если вы хотите получать уведомление о новой ориентации перед вызовом setContentView.
Ответ 13
Я думаю, что использование 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
Скажите, пожалуйста, если есть проблема с этим человеком?
Ответ 14
Протестировано в 2019 году на API 28, независимо от того, установил ли пользователь книжную ориентацию или нет, и с минимальным кодом по сравнению с другим устаревшим ответом, следующее обеспечивает правильную ориентацию:
/** @return The {@link Configuration#ORIENTATION_SQUARE}, {@link Configuration#ORIENTATION_PORTRAIT}, {@link Configuration#ORIENTATION_LANDSCAPE} constants based on the current phone screen pixel relations. */
private int getScreenOrientation()
{
DisplayMetrics dm = context.getResources().getDisplayMetrics(); // Screen rotation effected
if(dm.widthPixels == dm.heightPixels)
return Configuration.ORIENTATION_SQUARE;
else
return dm.widthPixels < dm.heightPixels ? Configuration.ORIENTATION_PORTRAIT : Configuration.ORIENTATION_LANDSCAPE;
}
Ответ 15
Старый пост, который я знаю. Независимо от того, какая ориентация может быть или менялась, и т.д. Я разработал эту функцию, которая используется для установки устройства в правильной ориентации без необходимости знать, как на нем расположены портретные и ландшафтные функции.
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 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); }
}
Работает как шарм!
Ответ 16
Используйте этот способ,
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;
}
в String у вас есть Oriantion
Ответ 17
Есть много способов сделать это, этот кусок кода работает для меня
if (this.getWindow().getWindowManager().getDefaultDisplay()
.getOrientation() == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) {
// portrait mode
} else if (this.getWindow().getWindowManager().getDefaultDisplay()
.getOrientation() == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {
// landscape
}
Ответ 18
Простой и легкий:)
- Сделайте 2 xml макета (например, портрет и пейзаж)
-
В java файле напишите:
private int intOrientation;
при
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.
Ответ 19
Я считаю это решение простым
if (context.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT){
user_todat_latout = true;
} else {
user_todat_latout = false;
}
Ответ 20
такие как наложение всех телефонов, таких как 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;
}
Ответ 21
Также стоит отметить, что в настоящее время существует меньше оснований для проверки явной ориентации с помощью getResources().getConfiguration().orientation
если вы делаете это по причинам макета, поскольку поддержка Multi-Window, представленная в Android 7/API 24+ может немного помешать вашим макетам в любой ориентации. Лучше рассмотреть возможность использования <ConstraintLayout>
и альтернативных макетов в зависимости от доступной ширины или высоты, а также других трюков для определения того, какой макет используется, например, наличие или отсутствие определенных фрагментов, прикрепленных к вашей Деятельности.
Ответ 22
В файле активности:
@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">
Я надеюсь, что это поможет вам..!
Ответ 23
Вы можете использовать это (на основе здесь):
public static boolean isPortrait(Activity activity) {
final int currentOrientation = getCurrentOrientation(activity);
return currentOrientation == ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT || currentOrientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
}
public static int getCurrentOrientation(Activity activity) {
//code based on https://www.captechconsulting.com/blog/eric-miles/programmatically-locking-android-screen-orientation
final Display display = activity.getWindowManager().getDefaultDisplay();
final int rotation = display.getRotation();
final Point size = new Point();
display.getSize(size);
int result;
if (rotation == Surface.ROTATION_0
|| rotation == Surface.ROTATION_180) {
// if rotation is 0 or 180 and width is greater than height, we have
// a tablet
if (size.x > size.y) {
if (rotation == Surface.ROTATION_0) {
result = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
} else {
result = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
}
} else {
// we have a phone
if (rotation == Surface.ROTATION_0) {
result = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
} else {
result = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;
}
}
} else {
// if rotation is 90 or 270 and width is greater than height, we
// have a phone
if (size.x > size.y) {
if (rotation == Surface.ROTATION_90) {
result = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
} else {
result = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
}
} else {
// we have a tablet
if (rotation == Surface.ROTATION_90) {
result = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;
} else {
result = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
}
}
}
return result;
}
Ответ 24
Простой двухстрочный код
if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
// do something in landscape
} else {
//do in potrait
}
Ответ 25
В случае, если вы пытаетесь изменить поведение своего приложения в зависимости от ориентации, посмотрите другой вопрос, подобный этому, касающийся ориентации на Android, на который я ответил здесь.
В нем используется Vapor API - новая структура стиля jQuery, недавно выпущенная для Android, которая предназначена для упрощения разработки приложений.
В примерах я покажу, как вы можете прослушивать глобальные обратные вызовы, связанные с ориентацией устройства, и чтобы ваше приложение выполняло пользовательский код в зависимости от текущей ориентации пользовательского устройства. Например:
$.hook("orientationLandscape").hookIn(
new $$hookee<Activity>(this){
@Override
public void call(String hookName, VaporBundle args){
// landscape code here
}
});
$.hook("orientationPortrait").hookIn(
new $$hookee<Activity>(this){
@Override
public void call(String hookName, VaporBundle args){
// portrait code here
}
});
Вы также можете комбинировать такие вещи, как прослушиватели каналов, используя VaporX, который является в основном селекторами стиля jQuery для Android dev.
Надеюсь, это поможет кому-то!