#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.xml
和res/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 楼
这样可以覆盖所有电话,例如oneplus3public 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;
}
评论
在类似的线程上查看此答案:stackoverflow.com/a/26601009/3072449