И так, приступим! Сперва создадим добавим в файл 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>
Комментариев нет:
Отправить комментарий