Подтвердить что ты не робот

Ориентация экрана для Android

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

4b9b3361

Ответ 1

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

В качестве примера, на моем 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, если Auto-Rotate выключен и 1, если включен Auto-Rotate. Еще одна попытка. В исходной программе вы можете установить в манифесте

android:screenOrientation="portrait"

Тот же эффект, но на этот раз только для вашей активности. Если вы сделали небольшую тестовую программу, эта возможность была бы устранена (поэтому я рекомендую ее).

Примечание. Да, вся тема ориентации/ротации действительно является "интересной" темой. Попробуйте все, используйте Log.d(), поэкспериментируйте, узнайте.

Ответ 2

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

getResources().getConfiguration().orientation

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

public int orientation
С: API Level 1

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

Ответ 3

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

Ответ 4

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

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

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

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

Ответ 6

/* 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();

Ответ 7

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

@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);
        }