我尝试getOrientation()
来获取方向值,但它总是返回0!
答案 0 :(得分:46)
不推荐使用getOrientation(),但这不一定是问题的根源。确实,您应该使用 getRotation()而不是 getOrientation(),但只有在定位到Android 2.2(API级别8)或更高版本时才能使用它。有些人甚至是Google员工有时似乎忘记了这一点。
举个例子,我的HTC渴望运行Android 2.2。 getOrientation()和 getRotation()都报告相同的值:
当你把它“放在头上”时它没有报告(旋转180,这将是值2)。该结果可能是特定于设备的。
首先,如果您使用模拟器或设备,则应明确说明。你知道如何旋转模拟器吗?然后我建议使用onCreate()方法创建一个小测试程序,如下所示:
@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());
}
检查设备的屏幕是否已锁定在设备设置中 设置>显示>自动旋转屏幕。如果取消选中该复选框,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);
如果自动旋转关闭,它将返回 0 ,如果启用了自动旋转,则 1 。 另一个尝试。在原始程序中,您可能已在清单中设置
android:screenOrientation="portrait"
效果相同,但这次只针对您的活动。如果您制作了小型测试程序,那么这种可能性就会被消除(这就是我推荐的原因)。
备注:是的,整个方向/轮换主题确实是一个“有趣”的主题。尝试一下,使用Log.d(),实验,学习。
答案 1 :(得分:37)
如果您想知道当前显示的内容是横向模式还是纵向(可能完全独立于手机的物理旋转),您可以使用:
getResources().getConfiguration().orientation
public int orientation
自:API等级1
屏幕的整体方向。可以是ORIENTATION_LANDSCAPE,ORIENTATION_PORTRAIT或ORIENTATION_SQUARE之一。
答案 2 :(得分:5)
getOrientation()
已弃用。相反,请尝试getRotation()
。
答案 3 :(得分:4)
要避免使用不推荐使用的方法,请使用找到的here Android配置类。它自API lvl 1起作用,仍可在最新的Android设备上运行。 (不予弃用)。
以及示例考虑以下代码段:
Configuration config = getResources().getConfiguration();
if (config.orientation == Configuration.ORIENTATION_PORTRAIT)
{
setContentView(R.layout.portraitStart);
}
else
{
setContentView(R.layout.landscapeStart);
}
祝您好运 - 希望这个答案可以帮助任何遇到它的人。
答案 4 :(得分:2)
您应该使用:
getResources().getConfiguration().orientation
它可以是ORIENTATION_LANDSCAPE
,ORIENTATION_PORTRAIT
之一。
http://developer.android.com/reference/android/content/res/Configuration.html#orientation
答案 5 :(得分:1)
/* 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();
答案 6 :(得分:1)
我认为你需要创建两个不同的布局,并在不同的方向上扩展不同的布局。我给你一个示例代码,对我来说很好。 在自定义适配器的情况下,您可以从您的活动传递“上下文”。 如果您使用自定义适配器,那么您可以尝试以下代码:
@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);
}
答案 7 :(得分:0)
我在NexusOne SDK 2.3上遇到了同样的问题。