понедельник, 12 декабря 2011 г.

Screen orientation

И так, дамы и господа, сегодня мы подаем под правильным соусом наши activity. Вы наверняка видели в некоторых приложениях настройку, позволяющую устанавливать желаемую ориентацию экрана (портрет, ландшафт, авто). Сегодня мы попробуем сделать так же!

И так, приступим! Сперва создадим добавим в файл settings.xml следующий код.

   
<listpreference android:defaultvalue="1" 
    android:dialogtitle="@string/settings_screen_orientation_title" 
    android:entries="@array/screen_orientation" 
    android:entryvalues="@array/screen_orientation_values" 
    android:key="screen_orientation" 
    android:summary="@string/settings_screen_orientation_summary" 
    android:title="@string/settings_screen_orientation">


добавим соответствующие строки в файл strings.xml

    <string name="settings_screen_orientation_title">Screen orientation</string>
    <string name="settings_screen_orientation_summary">Portrait, landscape or auto</string>
    <string name="settings_screen_orientation">Screen orientation</string>

теперь добавим в файл массивов

    <string-array name="screen_orientation">
        <item>Portrait</item>
        <item>Landscape</item>
        <item>Auto</item>
    </string-array>
    <string-array name="screen_orientation_values">
        <item>1</item>
        <item>2</item>
        <item>3</item>
    </string-array>

Ну вот, с xml почти закончили. Осталось только добавить в AndroidManifest.xml в описание activity, которой мы хотим самостоятельно задавать ориентацию, следующий параметр

            android:configChanges="orientation"

например
   <activity android:label="@string/app_name" 
     android:name="ru.liogames.memotrix.layouts.GameOverLayout"
     android:configChanges="orientation">
   </activity>

Это скажет системе что мы хотим получать уведомления, когда поменяется ориентация.
Теперь перейдем к непосредственно программированию. В activity, которой мы хотим управлять необходимо переопределить  метод onConfigurationChanged(Configuration newConfig)

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
    }
и в нем указать непосредственно, что мы хотим.

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        SharedPreferences mPrefs = PreferenceManager.getDefaultSharedPreferences(this);
        String ScreenOrient = mPrefs.getString("screen_orientation", "1");
        int screen_orientation = Integer.parseInt(ScreenOrient);
        switch(screen_orientation)
        {
        case 1:
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            break;
        case 2:
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
            break;
        case 3:
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
            break;
        }
    }

Здесь мы берем SharedPreferences, соотнесенные контексту нашего приложения, выдираем из них значение screen_orientation,и в зависимости от него задаем желаемую ориентацию через setRequestedOrientation().
Все то же самое необходимо провернуть и с методом onStart(). Тут важно не путать onStart() с onCreate(),т.к. onStart() зовется позже, например он зовется при возвращении к нашей activity из любой другой.
Ну вот собственно и все, после этих изысканий activity начинает вести себя в зависимости от настроек. Есть только одна очень важная особенность. Если для activity заданы два xml для разных ориентаций, то тот, что расположен в layout-land будет игнорироваться. Т.е. всегда будет использоваться файл от портретной ориентации. если это не устраивает, придется самостоятельно загружать соответствующий файл. Либо можно пойти грязным путем и исключить из манифеста уведомление,но в таком случае, система сперва сама загрузит layout какой посчитает нужным, а после этого вызовет наш onStart()
На этом заканчиваем наш кулинарный эксперимент, надеюсь будет вкусно, спасибо за внимание.
</listpreference>

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

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