четверг, 3 января 2013 г.

Ориентация приложения


В этой статье мы рассмотрим, как разрабатывать приложения для разных ориентаций устройства. Также я покажу один из простых способов определения типа устройства: планшет или смартфон.


Создадим новый проект. Добавим в строковые ресурсы следующие строки:
<string name="txt_portrait">PORTRAIT</string>
       <string name="txt_landscape">LANDSCAPE</string>
Xml-файл для нашего Activity выглядит следующим образом:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:text="@string/txt_portrait"
        />

</RelativeLayout>
При запуске приложения мы увидим, что отображается макет для портретной ориентации. Поворачивая устройство, приложение будет менять интерфейс, подстраиваясь под текущую ориентацию девайса. Если добавить в метод onCreate для текущего Activity информационный лог, то мы увидим, что при смене ориентации наше Activity перезапускается.

Для разделения макетов на портретный и ландшафтный интерфейс, добавим папку layout-land в ресурсы. «-land» показывает, что данные ресурсы будут использоваться только при ландшафтной ориентации.
Скопируем файл макета из папки layout в layout-land и заменим выводимый текст для TextView на android:text="@string/txt_landscape".
После запуска приложения мы увидим, что приложение использует нужные макеты для соответствующих ориентаций.

Осталось запретить приложению постоянно перезапускать Activity при каждой смене ориентации.
Для этого необходимо добавить в манифесте следующую строчку для текущего Activity: android:configChanges="orientation|screenSize".
Манифест:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="org.snowpard.projects.ten"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="16" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/icon"
        android:label="@string/app_name" >
        <activity
            android:name="org.snowpard.projects.ten.MainActivity"
            android:label="@string/app_name"
            android:configChanges="orientation|screenSize">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
И переопределить в Activity метод onConfigurationChanged() следующим образом:
@Override
public void onConfigurationChanged(Configuration newConfig) {  
 super.onConfigurationChanged(newConfig);
 setContentView(R.layout.main);  
}
Теперь после смены ориентации у нас используется нужный макет и не перезапускается Activity.

Бывают случаи, когда необходимо сделать приложение, которое на смартфонах работает только в портретном режиме, а на планшетах в обеих ориентациях.
Это реализуется в 2 шага:
1. Необходимо определить тип устройства: смартфон или планшет.
2. Не позволять смартфонам менять ориентацию приложения.
Чтобы определить тип устройства, мы поступим следующим образом. Необходимо создать в res/values файл defaults.xml.
<resources>   
    <bool name="isTablet">false</bool>
</resources>
Затем создадим папки: values-large (для 7” планшетов) и values-xlarge (для 10” планшетов). Скопируем файл defaults.xml в созданные папки и заменим значение переменной isTablet на true.
<resources>  
    <bool name="isTablet">true</bool>
</resources>
В нашем Activity добавим атрибут:
private boolean isTablet;
В методе onCreate получим значение из ресурсов:
this.isTablet = getResources().getBoolean(R.bool.isTablet);
Создадим новый метод, который будет определять, нужно ли менять ориентацию для приложения или нет:
private void wasPortrait()
{
 if (!this.isTablet)
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
 else 
  setContentView(R.layout.main);
}
Метод setRequestedOrientation() устанавливает желаемую ориентацию (в данном случае портретную).
Добавим вызов метода wasPortrait() в конец метода onCreate() и в метод onConfigurationChanged().
Полный листинг программы:
public class MainActivity extends Activity {

 private boolean isTablet;
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  
  Log.e("MainActivity", "onCreate");
  
  this.isTablet = getResources().getBoolean(R.bool.isTablet);
  wasPortrait();
 }

 @Override
 public void onConfigurationChanged(Configuration newConfig) {  
  super.onConfigurationChanged(newConfig);
  wasPortrait();  
 }
 
 private void wasPortrait()
 {
  if (!this.isTablet)
   setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
  else 
   setContentView(R.layout.main);
 }
}


Ссылки по теме


  • Исходные коды данного проекта можно скачать отсюда: zip

Комментариев нет:

Отправить комментарий