В этой статье мы рассмотрим, как разрабатывать приложения для
разных ориентаций устройства. Также я покажу один из простых способов
определения типа устройства: планшет или смартфон.
<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
Комментариев нет:
Отправить комментарий