如何检查Android手机是横向还是纵向?

评论

在类似的线程上查看此答案:stackoverflow.com/a/26601009/3072449

#1 楼

资源的Configuration对象提供了用于确定要检索哪些资源的当前配置:

getResources().getConfiguration().orientation;


您可以通过查看其值来检查方向:

int orientation = getResources().getConfiguration().orientation;
if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
    // In landscape
} else {
    // In portrait
}


更多信息可以在Android Developer中找到。

评论


哦,抱歉,我误会了,我以为你是在说如果配置发生更改,该服务将看不到配置更改。您所描述的是……好吧,它什么也没看到,因为什么都没有改变,因为启动器已锁定屏幕方向并且不允许更改。因此,正确的是.orientation不会更改,因为方向没有更改。屏幕仍然是纵向的。

– Hackbod
2012年2月23日在8:32



我能做的最接近的事情是从传感器读取方向,这涉及我目前不太想知道的数学。

–Archimedes Trajano
2012-2-23在18:21

没有什么可烦的。屏幕尚未旋转,它仍然是纵向屏幕,没有旋转可见。如果要监视用户如何移动手机而不管屏幕如何旋转,那么是的,您需要直接观察传感器,并决定如何解释有关设备移动方式的信息。

– Hackbod
2012年2月24日4:30在

如果屏幕方向固定,这将失败。

– AndroidDev
2013年7月30日14:27在

如果活动锁定了显示(android:screenOrientation =“ portrait”),则此方法将返回相同的值,而与用户如何旋转设备无关。在这种情况下,您将使用加速度计或重力传感器正确确定方向。

–猫
2014年8月21日在23:08

#2 楼

如果在某些设备上使用getResources()。getConfiguration()。orientation,则会出错。我们最初在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


另一方面,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;
}
 


评论


谢谢!不过,初始化“方向”是多余的。

– Mraffen
2014年10月1日14:53

不建议使用getWidth和getHeight。

– FindOut_Quran
2015年10月21日在4:28

@ user3441905,是的。使用getSize(Point outSize)代替。我正在使用API​​ 23。

–WindRider
2015年12月2日,11:13



@ jarek-potiuk已弃用。

–阴间
16年5月18日在1:19



#3 楼

解决此问题的另一种方法是不依赖于显示器的正确返回值,而是依赖Android资源解析。

在文件夹layouts.xmlres/values-land中创建文件res/values-port,其内容如下:

res / values-land / layouts.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)


评论


我喜欢它,因为它使用系统已经确定方向的任何方式

– KrustyGString
15年9月29日在13:59

风景/人像检查的最佳答案!

–vtlinh
16年8月3日在19:02

默认值文件中的值是什么?

– Shashank Mishra
2月26日17:20

#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";
    }
}


评论


您的帖子中有错字-应该说.getRotation()而不是getOrientation

–基思
2012年8月25日在23:44



为此+1。我需要知道确切的方向,而不仅仅是横向与纵向。除非您使用的是SDK 8+,否则getOrientation()是正确的,在这种情况下,应使用getRotation()。 SDK 9+支持“反向”模式。

– Paul
2012年10月16日在20:54

@Keith @Paul我不记得getOrientation()是如何工作的,但是如果使用getRotation(),这是不正确的。获得旋转“使屏幕从其“自然”方向返回旋转。”资源。因此,在电话上说ROTATION_0为纵向可能是正确的,但在平板电脑上,其“自然”方向很可能是横向,而ROTATION_0应该返回横向而不是纵向。

– jp36
13年1月16日在18:55



看起来这是首选的方法,请加入:developer.android.com/reference/android/view/…

– Jaysqrd
13年2月18日在9:26

这是一个错误的答案。为什么要投票? getOrientation(float [] R,float []值)基于旋转矩阵计算设备的方向。

–user1914692
13年7月20日在23:24

#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;
}


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 楼

自从发布了大多数答案以来,已经过去了一段时间,现在有些使用了不推荐使用的方法和常量。

我更新了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

评论


请注意,getOrient.getSize(size)需要13个api级别

–莱斯特
2015年9月24日15:07在

#8 楼

使用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 楼

不管用户是否设置了纵向方向,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;
}


#13 楼

这样可以覆盖所有电话,例如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;
}


#14 楼

我认为此代码可能会在方向更改生效后起作用。调用setContentView之前的新方向。

#15 楼

我认为使用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


请告诉我这个人是否有问题?

#16 楼

我知道的旧帖子。无论方向是什么,都可以互换等。我设计了此功能,该功能用于将设备设置为正确的方向,而无需了解如何在设备上组织纵向和横向特征。
   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); }

    }


魅力十足!

#17 楼

使用这种方法,

    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;
    }


在字符串中您具有方向

#18 楼

有很多方法可以做到,这段代码对我有用

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


#19 楼

我认为这种解决方案很容易

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


评论


通常,如果答案包括对代码意图的解释,以及为什么不引入其他代码就能解决问题的原因,则答案会更有帮助。

–汤姆·阿兰达(Tom Aranda)
17年12月16日在4:17

是的,对此我感到抱歉,如果Configuration.ORIENTATION_PORTRAIT等于纵向,则无需解释此代码检查方向的确切位置:)

–艾萨克·纳比尔(Issac Nabil)
17年12月22日在17:12



#20 楼

只需简单的两行代码

if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
    // do something in landscape
} else {
    //do in potrait
}


#21 楼

简单:)


制作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.




#22 楼

同样值得注意的是,如今,由于布局原因,没有足够的理由使用getResources().getConfiguration().orientation检查显式方向,因为Android 7 / API 24+中引入的多窗口支持可能会在很大程度上干扰布局任一个方向。最好考虑使用<ConstraintLayout>和取决于可用宽度或高度的替代布局,以及其他确定使用哪种布局的技巧,例如是否有某些片段附加到您的活动中。

#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;
}