android屏幕方向

时间:2011-01-15 01:58:26

标签: android orientation

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

8 个答案:

答案 0 :(得分:46)

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

举个例子,我的HTC渴望运行Android 2.2。 getOrientation() getRotation()都报告相同的值:

  • 0(默认,肖像),
  • 1(设备逆时针旋转90度),
  • 3(设备顺时针90度)

当你把它“放在头上”时它没有报告(旋转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

Developer Documentation

  

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_LANDSCAPEORIENTATION_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上遇到了同样的问题。

这解决了它:Check orientation on Android phone