ориентация экрана Android - PullRequest
20 голосов
/ 15 января 2011

Я пытался getOrientation() получить значение ориентации, но оно всегда возвращает 0!

Ответы [ 8 ]

46 голосов
/ 09 февраля 2011

getOrientation () устарела, но это не обязательно корень вашей проблемы. Это правда, что вы должны использовать getRotation () вместо getOrientation () , но вы можете использовать его, только если вы нацелены на Android 2.2 (уровень API 8) или выше. Некоторые люди и даже гуглеры иногда забывают об этом.

Как пример, на моем HTC desire работает 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 (), экспериментируйте, учитесь.

37 голосов
/ 15 января 2011

Если вы хотите знать, находится ли отображаемый в данный момент контент в альбомном или портретном режиме (возможно, полностью не зависящий от физического поворота телефона), вы можете использовать:

getResources().getConfiguration().orientation

Документация для разработчиков

Публичная ориентация
Начиная с: Уровень API 1

Общая ориентация экрана. Может быть одним из ORIENTATION_LANDSCAPE, ORIENTATION_PORTRAIT или ORIENTATION_SQUARE.

5 голосов
/ 15 января 2011

getOrientation() устарело. Вместо этого попробуйте getRotation().

4 голосов
/ 15 марта 2013

Чтобы избежать использования устаревших методов, используйте класс конфигурации Android, найденный здесь .Он работает с API lvl 1 и до сих пор работает на последних устройствах Android.(Не рекомендуется).

В качестве примера рассмотрим следующий фрагмент кода:

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

Удачи - надеюсь, этот ответ поможет тому, кто столкнется с ним.

2 голосов
/ 04 сентября 2014

Вы должны использовать:

getResources().getConfiguration().orientation

Это может быть один из ORIENTATION_LANDSCAPE, ORIENTATION_PORTRAIT.

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

1 голос
/ 20 апреля 2012

Я думаю, вам нужно создать две разные раскладки и раздувать разные раскладки с разной ориентацией.Я даю вам пример кода, который отлично работает для меня.«Контекст» вы можете перейти от своей деятельности в случае использования специального адаптера.Если вы используете нестандартный адаптер, вы можете попробовать этот код:

@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);
        }
1 голос
/ 23 мая 2011
/* 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();
0 голосов
/ 22 февраля 2011

У меня была такая же проблема в NexusOne SDK 2.3.

Это решило это: Проверьте ориентацию на телефоне Android .

...