Евгений Колесников 3 лет назад
Родитель
Сommit
86cdce1018
5 измененных файлов с 70 добавлено и 12 удалено
  1. 36 0
      articles/layout_orientation.md
  2. 23 3
      articles/themes.md
  3. BIN
      img/layout_orientation.png
  4. BIN
      img/layout_orientation2.png
  5. 11 9
      readme.md

+ 36 - 0
articles/layout_orientation.md

@@ -0,0 +1,36 @@
+<table style="width: 100%;"><tr><td style="width: 40%;">
+<a href="../articles/themes.md">Стили и темы. Ресурсы. Фигуры. Обработчики событий.
+</a></td><td style="width: 20%;">
+<a href="../readme.md">Содержание
+</a></td><td style="width: 40%;">
+<a href="../articles/weather.md">Проект погода (начало): геолокация, http(s)-запросы, разбор json, ImageView.
+</a></td><tr></table>
+
+# Ориентация экрана
+
+>Взято [отсюда](http://developer.alexanderklimov.ru/android/orientation.php#whereorientation)
+
+При разработке мобильных приложений со сложным дизайном нередки ситуации, когда при изменении ориентации экрана все выглядит совсем не так, как Вам хотелось бы. В таких случаях выходом из ситуации может стать использование различных шаблонов для книжной и альбомной ориентации устройства. При этом переключение между шаблонами может осуществляться в автоматическом или динамическом (ручном) режиме.
+
+Для автоматического режима достаточно создать дополнительнай файл шаблона для альбомной ориентации.
+
+Создадим дополнительный шаблон с "инженерной" версией калькулятора:
+
+![](../img/calc_landscape.jpeg)
+
+Для этого добавим **одноименный** шаблон, указав ему ориентацию:
+
+![](../img/layout_orientation.png)
+![](../img/layout_orientation2.png)
+
+**Android Studio** автоматически создаст каталог `layout-land` и сохранит туда новый шаблон.
+
+Когда вы создаёте альтернативную разметку, то не забывайте проверять наличие элементов, к которым будете обращаться программно, иначе получите ошибку.
+
+<table style="width: 100%;"><tr><td style="width: 40%;">
+<a href="../articles/themes.md">Стили и темы. Ресурсы. Фигуры. Обработчики событий.
+</a></td><td style="width: 20%;">
+<a href="../readme.md">Содержание
+</a></td><td style="width: 40%;">
+<a href="../articles/weather.md">Проект погода (начало): геолокация, http(s)-запросы, разбор json, ImageView.
+</a></td><tr></table>

+ 23 - 3
articles/themes.md

@@ -3,10 +3,10 @@
 </a></td><td style="width: 20%;">
 <a href="../readme.md">Содержание
 </a></td><td style="width: 40%;">
-<a href="../articles/weather.md">Проект погода (начало): геолокация, http(s)-запросы, разбор json, ImageView.
+<a href="../articles/layout_orientation.md">Ориентация экрана.
 </a></td><tr></table>
 
-`&lt;` `&gt;`
+<!-- `&lt;` `&gt;` -->
 
 # Стили и темы
 
@@ -391,6 +391,10 @@ setContentView(R.layout.activity_main)
 
 # Обработка событий (клик по кнопке)
 
+Существует несколько способов задать обработчики событий:
+
+1. Атрибут **onClick**
+
 Для кнопок (тег **Button**) можно задать обработчик клика, для этого в разметке добавьте атрибут *android:onClick* и задайте имя функции обработчика:
 
 ```xml
@@ -401,6 +405,8 @@ setContentView(R.layout.activity_main)
 
 Чтобы не писать вручную эту функцию можно нажать на её названии клавиши `Alt+Enter` и выбрать действие "Create onOperationClick(view) in MainActivity"
 
+>Если мы вручную добавляли новую *activity*, то нужно в корневой элемент добавить ссылку на класс, который будет работать с этой *activity*: `tools:context=".MainActivity"`
+
 Один и тот же обработчик можно назначить нескольким кнопкам (в калькуляторе можно сделать всего два обработчика: один для числовых кнопок, а второй для функциональных)
 
 В коде обработчика мы должны либо привести параметр *view* к типу **Button**: 
@@ -417,6 +423,20 @@ fun onOperatorClick(view: View) {
 
 Либо в разметке добавить кнопкам атрибут *android:tag* и в коде анализировать его содержимое (ему приведение типов не нужно, т.к. он объявлен в классе **View**)
 
+2. Программное добавление обработчика в классе:
+
+Сначала надо получить экземпляр элемента (для этого используется функция **findViewById**), затем назначить ему событие:
+
+```kt
+val btn_one = findViewById<Button>(R.id.btn_one)
+if (btn_one != null) {
+    btn_one.setOnClickListener {
+        textView.text="hello"
+    }
+}
+```
+
+
 # Дополнение
 
 В мастере создания нового проекта Android Studio для многих шаблонов проект использует библиотеку компонентов MaterialDesign для Android. И он устанавливает тему по умолчанию на основе Theme.MaterialComponents.DayNight.DarkActionBar.
@@ -436,5 +456,5 @@ fun onOperatorClick(view: View) {
 </a></td><td style="width: 20%;">
 <a href="../readme.md">Содержание
 </a></td><td style="width: 40%;">
-<a href="../articles/weather.md">Проект погода (начало): геолокация, http(s)-запросы, разбор json, ImageView.
+<a href="../articles/layout_orientation.md">Ориентация экрана.
 </a></td><tr></table>

BIN
img/layout_orientation.png


BIN
img/layout_orientation2.png


+ 11 - 9
readme.md

@@ -371,24 +371,26 @@ ERD,
 
 1. [Основы языка Kotlin](./articles/kotlin.md)
 
-2. [Первый проект в Android Studio](./articles/android_studio.md)
+1. [Первый проект в Android Studio](./articles/android_studio.md)
 <!-- TODO расписать LinearLayout и TableLayout -->
 
-3. [Стили и темы. Ресурсы. Фигуры. Обработчики событий.](./articles/themes.md)
+1. [Стили и темы. Ресурсы. Фигуры. Обработчики событий.](./articles/themes.md)
 
-4. [Проект погода (начало): геолокация, http(s)-запросы, разбор json, ImageView.](./articles/weather.md)
+1. [Смена ориентации](./articles/layout_orientation.md)
 
-5. [Проект погода (продолжение): SplashScreen (заставка). Выбор города. Выбор и отображение массива значений (почасовая, ежедневная). Разбор XML.](./articles/weather2.md)
+1. [Проект погода (начало): геолокация, http(s)-запросы, разбор json, ImageView.](./articles/weather.md)
 
-6. [Проект "база". Авторизация на сервере (Basic auth, token).](./articles/android_auth.md)
+1. [Проект погода (продолжение): SplashScreen (заставка). Выбор города. Выбор и отображение массива значений (почасовая, ежедневная). Разбор XML.](./articles/weather2.md)
 
-7. [Wear OS](./articles/wear_os.md)
+1. [Проект "база". Авторизация на сервере (Basic auth, token).](./articles/android_auth.md)
 
-8. [Разбор задания предыдущего чемпионата](./articles/wsrf6_1.md)
+1. [Wear OS](./articles/wear_os.md)
 
-9. [Использование регулярных выражений для разбора данных в любом формате](./articles/regex.md)
+1. [Разбор задания предыдущего чемпионата](./articles/wsrf6_1.md)
 
-10. [ViewPager, Fragments, Tabs](./articles/pager.md)
+1. [Использование регулярных выражений для разбора данных в любом формате](./articles/regex.md)
+
+1. [ViewPager, Fragments, Tabs](./articles/pager.md)
 
 <!--