android屏幕方向

我尝试getOrientation()获取方向值,但它总是返回0!

Solutions Collecting From Web of "android屏幕方向"

getOrientation()已被弃用,但这不是问题的根本。 确实,您应该使用getRotation()而不是getOrientation(),但是只有在您定位到Android 2.2(API Level 8)或更高版本时才能使用它。 有些人甚至Google员工有时似乎忘记了这一点。

作为一个例子,在我的HTC运行Android 2.2的愿望。 getOrientation()getRotation()都报告相同的值:

  • 0(默认,肖像),
  • 1(装置90度逆时针),
  • 3(顺时针装置90度)

当你把它放在“头上”时,它不会报告(旋转180,这将是值2)。 这个结果可能是特定于设备的。

首先,你应该清楚,如果你使用模拟器或设备。 你知道如何旋转模拟器吗? 然后我会推荐使用像这样的onCreate()方法创build一个小testing程序:

 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); WindowManager mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE); Display mDisplay = mWindowManager.getDefaultDisplay(); Log.d("ORIENTATION_TEST", "getOrientation(): " + mDisplay.getOrientation()); } 

检查您的设备屏幕是否已locking在设备设置 设置>显示>自动旋转屏幕中 。 如果该checkbox未选中,则Android不会将方向更改报告给您的活动。 要清楚:它不会重新启动活动。 在我的情况下,我只得到0 ,就像你所描述的。

如果您将这些行添加到onCreate()中,您可以从程序中检查

 int sysAutoRotate = 0; try { sysAutoRotate = Settings.System.getInt(getContentResolver(), Settings.System.ACCELEROMETER_ROTATION); } catch (SettingNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } Log.d("ORIENTATION_TEST", "Auto-rotate Screen from Device Settings:" + sysAutoRotate); 

如果自动旋转closures,则返回0;如果自动旋转打开,则返回1 。 另一个尝试。 在您的原始程序中,您可能已经在清单中设置

 android:screenOrientation="portrait" 

同样的效果,但这次只适用于你的活动。 如果你做了这个小testing程序,这个可能性将会被消除(这就是我推荐它的原因)。

备注:是的,整个定位/旋转主题确实是一个“有趣”的话题。 试试看,使用Log.d(),试验,学习。

如果您想知道当前显示的内容是处于横向模式还是纵向模式(可能完全独立于手机的物理旋转),您可以使用:

getResources().getConfiguration().orientation

开发者文档

公共int方向
因为:API级别1

屏幕的整体方向。 可能是ORIENTATION_LANDSCAPE,ORIENTATION_PORTRAIT或ORIENTATION_SQUARE之一。

getOrientation()已被弃用。 相反,尝试getRotation()

要避免使用Deprecated方法,请使用此处find的Androidconfiguration类。 它起作用API lvl 1,仍然在最新的Android设备上工作。 (不弃用)。

作为例子考虑下面的代码片段:

 Configuration config = getResources().getConfiguration(); if (config.orientation == Configuration.ORIENTATION_PORTRAIT) { setContentView(R.layout.portraitStart); } else { setContentView(R.layout.landscapeStart); } 

祝你好运,希望这个答案有助于谁遇到它。

你应该使用:

 getResources().getConfiguration().orientation 

它可以是ORIENTATION_LANDSCAPEORIENTATION_PORTRAIT

http://developer.android.com/reference/android/content/res/Configuration.html#orientation

 /* First, get the Display from the WindowManager */ Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay(); /* Now we can retrieve all display-related infos */ int width = display.getWidth(); int height = display.getHeight(); int orientation = display.getOrientation(); 

我认为你需要创build两个不同的布局,并在不同的方向上膨胀不同的布局。 我给你一个对我来说工作正常的示例代码。 在自定义适配器的情况下,您可以从您的活动传递“上下文”。 如果你使用的是自定义适配器,那么你可以试试这个代码:

 @Override public View getView(final int position, View convertView, ViewGroup parent) { View rowView = convertView; ViewHolder holder = null; int i = context.getResources().getConfiguration().orientation; if (rowView == null) { LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); if (i == Configuration.ORIENTATION_PORTRAIT) { rowView = inflater.inflate(R.layout.protrait_layout, null, false); } else { rowView = inflater.inflate(R.layout.landscape_layout, null, false); } holder = new ViewHolder(); holder.button = (Button) rowView.findViewById(R.id.button1); rowView.setTag(holder); } else { holder = (ViewHolder) rowView.getTag(); } return rowView; } 

另外明智的是你可以直接在代码中设置两种不同的布局

  int i = context.getResources().getConfiguration().orientation; if (i == Configuration.ORIENTATION_PORTRAIT) { ArrayAdapter<String> adt = new ArrayAdapter<String>(getApplicationContext(), R.layout.protrait_layout, name); } else { ArrayAdapter<String> adt = new ArrayAdapter<String>(getApplicationContext(), R.layout.landscape_layout, name); } 

我在NexusOne SDK 2.3上遇到了同样的问题。

这解决了它: 在Android手机上检查方向 。