2011-01-15 2 views
19

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

+7

Сначала поверните устройство первым. – noelicus

+0

Откат назад Название третьей стороны редактируется как вопрос (и тем более его ответы) касаются ориентации как общей проблемы, а не того, в частности, одного метода. –

ответ

5

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

+0

Любая идея, почему getOrientation устарела? Насколько я могу судить, getRotation делает то же самое. –

+1

Если вы должны поддерживать API 7, вы не можете использовать 'getRotation', это API 8 и далее. – mxcl

37

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

getResources().getConfiguration().orientation

Developer Documentation

public int orientation
С: API Уровень 1

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

+0

Хорошее решение, когда вам нужно поддерживать более старые версии ОС. Кажется более надежным, чем 'getOrientation()'. – azdev

+0

До сих пор это единственное решение, которое работало правильно для меня! –

+0

Кажется, что getOrientation() всегда возвращался ORIENTATION_UNDEFINED, если я не поворачивал экран после загрузки активности. таким образом, избегает этой проблемы. – Keith

46

getOrientation() устарел, но это не обязательно корень вашей проблемы. Это правда, что вы должны использовать getRotation() вместо getOrientation(), но вы можете использовать его только в том случае, если вы настроите Android 2.2 (API Level 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()); 

} 

Проверьте, если экран вашего устройства был заблокирован в настройках устройстваНастройки> Дисплей> Auto- Поверните экран. Если этот флажок не установлен, Android не будет сообщать изменения ориентации в вашу активность. Чтобы быть ясным: он не перезапустит действие. В моем случае я получаю только , как вы описали.

Вы можете проверить это из вашей программы, если добавить эти строки в 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); 

Он вернется , если автоматический поворот выключен и если автоматический поворот является на. Еще одна попытка.В исходной программе вы, возможно, установили в манифесте

android:screenOrientation="portrait" 

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

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

+0

Только 26 голосов? Это действительно полезно! – Sonhja

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(); 
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); 
     } 
4

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

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

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

Лучшие luck- надежды этот ответ поможет тот, кто работает в нем.

+1

Зачем вам вручную переключаться через код? Для этого предназначены конфигурации компоновки./res/layout и/res/layout-land. – afollestad

Смежные вопросы