Проверьте ориентацию на телефоне 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;
}
}
Я думаю, что этот код может работать после того, как изменение ориентации вступило в силу
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-макета ( i.E портрет и пейзаж)
-
в файле 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">
Я надеюсь, что это поможет вам ..!