Большая подборка ресурсов для изучения Android-разработки
В этой статье собраны полезные ресурсы, которые могут пригодиться всем Android-разработчикам, независимо от уровня знаний.
Также советуем взглянуть на наш вводный материал — рассказываем, как начать разрабатывать под Android.
Для новичков
Ресурсы, которые могут оказаться полезными для любого Java-программиста, начинающего разрабатывать под Android.
- Android-разработка для начинающих
Простой курс для новичков, разработанный Google, поможет быстро изучить основы и фундаментальные концепции Android-разработки.
- Знакомство с Android-разработкой
Простое, легкое и полное руководство для начинающих разработчиков, желающих написать своё первое приложение на Android.
- Android Development CodeLabs
Это один из лучших ресурсов, о котором должны узнать все начинающие Android-разработчики.
- Глоссарий Google Android
Если вы вступаете в огромный мир разработки под Android, то очевидно, что вы столкнётесь со множеством новых понятий и терминов. Не беспокойтесь, Google разработал интерактивный и простой в использовании глоссарий с примерами кода, который облегчит вашу жизнь.
- Официальное руководство по Android-разработке
Официальное руководство для разработчиков под Android от Google. Оно охватывает основные концепции с большим количеством примеров кода.
- Основы XML
Не знакомы с XML? Самое время изучить, потому что он используется для дизайна макетов в Android. Это не займет много времени.
- Руководство для начинающих по HTTP и REST
Если вы собираетесь использовать интернет-сервисы через API для вашего Android-приложения, тогда стоит познакомиться с HTTP и REST.
Для опытных разработчиков
Если вы занимаетесь разработкой под Android не первый год, то вот несколько хороших ресурсов, которые помогут улучшить ваши навыки программирования на Android.
- Разработка приложений для Android
Хороший курс от Google, который идеально подходит для повышения квалификации.
- Распространённые шаблоны проектирования для Android
Если вы ищите элегантные способы решения критических проблем в разработке программного обеспечения, то обратите внимание на подборку самых распространенных шаблонов проектирования. Они смогут вам в этом помочь.
- Как освоить Android: что разработчики могут извлечь из 21 приложения
Существует большое количество open source Android-приложений. Не беспокойтесь, если вы не знаете, какие из них могут помочь улучшить навыки разработки. Эта статья расскажет вам об этом.
- MVC против MVP против MVVM на Android
Чтобы усовершенствовать процессы разработки, тестирования, отладки и обслуживания вашего Android-приложения, ознакомьтесь с лучшими подходами к архитектуре.
- Современный Android: Activity и Fragment
Эта статья расскажет вам о современных способах создания приложений.
- Учебник RxAndroid
Погрузитесь в мир реактивного программирования под Android с помощью этого простого учебника.
- Погружение в конструкторы Android View
Получите подробное представление о конструкторах Android View, о том, как они работают и как их эффективно использовать при разработке приложений.
- Изучение Android Core: Looper, Handler и HandlerThread
Если вы хотите понять, как устроен асинхронный мир фреймворков Android, и использовать его для создания высококачественных приложений — прочтите эту статью.
- Views и ViewGroups
Подробный учебник, рассказывающий о том, как работают Views и ViewGroups в Android и как вы можете совершенствовать компоненты пользовательского интерфейса.
- Режимы запуска Android Activity
Не все разработчики правильно понимают, как работают различные режимы запуска в Android и как использовать их для создания идеальной навигации в своём приложении. Это статья расставит всё по своим местам.
- Как опубликовать собственную библиотеку
Вы уже давно используете библиотеки в своих приложениях под Android и хотите внести свой вклад в сообщество? Вот полное и подробное руководство по публикации собственной библиотеки.
- Релиз приложения в Google Play Store
Узнайте, как сделать успешный запуск своего приложения в Play Market.
- Архитектура Android
Этот GitHub-репозиторий станет жемчужиной для всех тех, кто хочет узнать о различных инструментах и шаблонах для разработки приложений для Android.
- Android Instant Apps
Если вы не знаете, что выбрать: нативные или веб-приложения — эта статья для вас.
- Лучшие инструменты для разработчиков Android-приложений
Если вы разрабатываете приложения для Android уже довольно давно и хотите улучшить свою производительность и рабочий процесс разработки, то эти инструменты помогут вам.
- Профессиональное использование Android Studio
Вы используете Android Studio каждый день для разработки своих приложений, но, возможно, и не догадываетесь, что эта IDE может быть еще мощнее.
Лучшие практики Android-разработки
Следование лучшим практикам поможет повысить качество приложения и облегчить командную разработку.
- Рекомендации по разработке под Android
Легкая и полезная статья, объясняющая некоторые аспекты лучших практик разработки под Android.
- Знакомство с strings.xml
В этой статье мы расскажем о лучших методах использования файла ресурсов strings.xml
.
- Гайдлайны Android
Один из лучших и наиболее полных ресурсов о лучших практиках и гайдлайнах по различным аспектам разработки Android, охватывающий почти все, что вам нужно знать.
- Android for Work
Эта статья поможет узнать, как наилучшим образом использовать Android for Work в ваших проектах.
- Android-разработка: некоторые из лучших практик
Чрезвычайно полезный список лучших практик Android-разработки.
- Шпаргалка по Java для Android
Книга «Effective Java» считается одной из лучших для написания высококачественного поддерживаемого Java-кода. Эта статья посвящена тому, как вы можете наилучшим образом использовать описанные в ней методы и принципы в разработке под Android.
- Топ-7 советов для RxJava под Android
Если вы выбрали реактивный способ создания приложений под Android, то эти советы помогут вам избежать распространенные ошибки и использовать RxJava максимально эффективно.
- Прячем данные в Android-приложениях
Углубленная статья о плюсах и минусах некоторых распространенных приемов хранения секретов (паролей, ключей API и другой информации) в приложениях Android.
Проектирование красивых приложений
Приложение считается неполным без хорошего пользовательского интерфейса. Чистый и красивый интерфейс — вот что делает ваше приложение привлекательным и выделяет его среди остальных.
- Material Design: глубокий взгляд
Хорошо написанная статья, дающая глубокое понимание Material Design для Android.
- Анимируйте все. Переходы в Android
Узнайте, как создать прекрасные и выразительные анимации в своем Android-приложении, чтобы порадовать своих пользователей и сделать его выделяющимся среди остальных приложений.
- Построение интерфейсов с помощью ConstraintLayout
Свежий ConstraintLayout полностью меняет приложение, когда дело доходит до разработки макетов для ваших приложений для Android. Эта статья поможет понять основы ConstraintLayout.
- Восемь советов для вашего приложения с Material Design
Создавайте качественные приложения, не допуская распространенных ошибок, в то же время применяя Material Design.
- Material Design is Design Science
Полезная статья, которая рассказывает, как наилучшим образом использовать Material Design при разработке своего приложения.
Бонус
Интересные ресурсы, которые нельзя пропустить.
- Следите за разработчиками Android в Twitter
Если вы хотите быть в курсе последних событий разработки в мире Android, следите за передовыми разработчиками Android в Twitter.
- Начните работу с Android Things Today!
Хотите погрузиться в мир IoT с помощью инструментов Android и его инфраструктуры? Вот хороший ресурс, чтобы начать это путешествие.
- Знакомство с Android Wear
Если вы заинтересованы в разработке приложений для носимых устройств на Android, то вот исчерпывающий урок, который поможет вам начать разработку.
- Ресурсы и атрибуты Android
Интересная статья о деталях повседневной работы с ресурсами и атрибутами в Android, которые могут быть вам неизвестны.
- Введение в Android TV
Хотите разрабатывать приложения для телевизоров с большим экраном? Вот отличная статья, которая послужит хорошим введением в эту среду разработки
Полезные сайты
Хотите быть в курсе последних новостей в мире Android? Вот некоторые из лучших ресурсов для вас.
- Android Weekly
Вы никогда не пропустите новости о развитии, статьи, видеоролики и другие события в мире Android.
- Подкасты
Если вы любите слушать подкасты, то этот сайт для вас. Здесь можно обсуждать инструменты, шаблоны и лучшие практики. Вы наверняка не захотите пропустить двухнедельные эпизоды.
- CodePath Android
Один из лучших и самых современных ресурсов с большим количеством пользователей для Android-разработчиков, где можно найти руководства и учебные пособия обо всех аспектах разработки. А главным плюсом является то, что он полностью открыт для вас, чтобы каждый мог внести свой вклад в развитие сообщества.
- Скринкасты
Получайте высококачественные еженедельные скринкасты для Android с широким спектром тем для разработки.
Ресурс, где вы найдете всю информацию, необходимую для проектирования пользовательского интерфейса и UX вашего приложения.
- Официальный блог разработчиков Android
Это официальный блог, через который Google напрямую взаимодействует с разработчиками Android. Все последние новости и анонсы, связанные с разработкой, появляются здесь раньше, чем где-либо еще.
Мы надеемся, что эти ресурсы помогут вам узнать больше о разработке Android и создать более качественные приложения.
Перевод статьи «50+ Ultimate Resources to Master Android Development»
Справочник разработчика для Android Studio
built the Справочник разработчика для Android Studio app as an Ad Supported app. This SERVICE is provided by at no cost and is intended for use as is.
This page is used to inform visitors regarding my policies with the collection, use, and disclosure of Personal Information if anyone decided to use my Service.
If you choose to use my Service, then you agree to the collection and use of information in relation to this policy. The Personal Information that I collect is used for providing and improving the Service. I will not use or share your information with anyone except as described in this Privacy Policy.
The terms used in this Privacy Policy have the same meanings as in our Terms and Conditions, which is accessible at Справочник разработчика для Android Studio unless otherwise defined in this Privacy Policy.
Information Collection and Use
For a better experience, while using our Service, I may require you to provide us with certain personally identifiable information, including but not limited to WEN. The information that I request will be retained on your device and is not collected by me in any way.
The app does use third party services that may collect information used to identify you.
Link to privacy policy of third party service providers used by the app
- Google Play Services
- AdMob
Log Data
I want to inform you that whenever you use my Service, in a case of an error in the app I collect data and information (through third party products) on your phone called Log Data. This Log Data may include information such as your device Internet Protocol (“IP”) address, device name, operating system version, the configuration of the app when utilizing my Service, the time and date of your use of the Service, and other statistics.
Cookies
Cookies are files with a small amount of data that are commonly used as anonymous unique identifiers. These are sent to your browser from the websites that you visit and are stored on your device’s internal memory.
This Service does not use these “cookies” explicitly. However, the app may use third party code and libraries that use “cookies” to collect information and improve their services. You have the option to either accept or refuse these cookies and know when a cookie is being sent to your device. If you choose to refuse our cookies, you may not be able to use some portions of this Service.
Service Providers
I may employ third-party companies and individuals due to the following reasons:
- To facilitate our Service;
- To provide the Service on our behalf;
- To perform Service-related services; or
- To assist us in analyzing how our Service is used.
I want to inform users of this Service that these third parties have access to your Personal Information. The reason is to perform the tasks assigned to them on our behalf. However, they are obligated not to disclose or use the information for any other purpose.
Security
I value your trust in providing us your Personal Information, thus we are striving to use commercially acceptable means of protecting it. But remember that no method of transmission over the internet, or method of electronic storage is 100% secure and reliable, and I cannot guarantee its absolute security.
Links to Other Sites
This Service may contain links to other sites. If you click on a third-party link, you will be directed to that site. Note that these external sites are not operated by me. Therefore, I strongly advise you to review the Privacy Policy of these websites. I have no control over and assume no responsibility for the content, privacy policies, or practices of any third-party sites or services.
Children’s Privacy
These Services do not address anyone under the age of 13. I do not knowingly collect personally identifiable information from children under 13. In the case I discover that a child under 13 has provided me with personal information, I immediately delete this from our servers. If you are a parent or guardian and you are aware that your child has provided us with personal information, please contact me so that I will be able to do necessary actions.
Changes to This Privacy Policy
I may update our Privacy Policy from time to time. Thus, you are advised to review this page periodically for any changes. I will notify you of any changes by posting the new Privacy Policy on this page. These changes are effective immediately after they are posted on this page.
Contact Us
If you have any questions or suggestions about my Privacy Policy, do not hesitate to contact me.
слой пользовательского интерфейса | Разработчики Android
Роль пользовательского интерфейса заключается в отображении данных приложения на экране, а также в служить основной точкой взаимодействия с пользователем. Всякий раз, когда данные меняются, либо из-за взаимодействия с пользователем (например, нажатия кнопки), либо из-за внешнего ввода (например, сетевой ответ), пользовательский интерфейс должен обновиться, чтобы отразить эти изменения. По сути, пользовательский интерфейс является визуальным представлением состояния приложения в виде извлекается из слоя данных.
Однако данные приложения, которые вы получаете с уровня данных, обычно находятся в другой формат, чем информация, которую необходимо отобразить. Например, вы может потребоваться только часть данных для пользовательского интерфейса, или вам может потребоваться объединить два различные источники данных для представления информации, имеющей отношение к пользователю. Независимо от применяемой вами логики, вам необходимо передать в пользовательский интерфейс всю информацию. он должен полностью отрисовываться. Слой пользовательского интерфейса — это конвейер, который преобразует данные приложения изменяются в форме, которую может представить пользовательский интерфейс, а затем отображается Это.
Рисунок 1. Роль слоя пользовательского интерфейса в архитектуре приложения. Примечание: Рекомендации и лучшие практики, представленные на этой странице, могут быть применены к широкому спектру приложений, чтобы позволить им масштабироваться, улучшать качество и надежность и упростить их тестирование. Тем не менее, вы должны относиться к ним как к руководящие принципы и адаптируйте их к вашим требованиям по мере необходимости.Базовый пример
Рассмотрим приложение, которое извлекает новостные статьи для чтения пользователем. Приложение имеет экран статей, на котором представлены статьи, доступные для чтения, а также зарегистрированных пользователей, чтобы добавлять в закладки статьи, которые действительно выделяются. Учитывая, что может быть много статей в любой момент времени, читатель должен иметь возможность просматривать статьи по категориям. Таким образом, приложение позволяет пользователям делать следующее:
- Просматривать статьи, доступные для чтения.
- Просмотр статей по категориям.
- Войдите в систему и добавьте в закладки определенные статьи.
- Доступ к некоторым премиальным функциям, если они соответствуют требованиям.
В следующих разделах этот пример используется в качестве практического примера для ознакомления с принципы однонаправленного потока данных, а также иллюстрирующие проблемы которые эти принципы помогают решить в контексте архитектуры приложения для пользовательского интерфейса. слой.
Архитектура слоя пользовательского интерфейса
Термин пользовательский интерфейс относится к элементам пользовательского интерфейса, таким как действия и фрагменты, которые отображать данные независимо от того, какие API они используют для этого (представления или Реактивный ранец. Поскольку роль данных слой должен хранить, управлять и предоставлять доступ к данные приложения, слой пользовательского интерфейса должен выполнить следующие шаги:
- Использование данных приложения и преобразование их в данные, которые пользовательский интерфейс может легко отображать.
- Использование данных, отображаемых в пользовательском интерфейсе, и преобразование их в элементы пользовательского интерфейса для представления пользователю.
- Использовать события пользовательского ввода из этих собранных элементов пользовательского интерфейса и отражать их эффекты в данных пользовательского интерфейса по мере необходимости.
- Повторяйте шаги с 1 по 3 столько, сколько необходимо.
В оставшейся части этого руководства показано, как реализовать уровень пользовательского интерфейса, который выполняет эти шаги. В частности, это руководство охватывает следующие задачи и понятия:
- Как определить состояние пользовательского интерфейса.
- Однонаправленный поток данных (UDF) как средство создания пользовательского интерфейса и управления им государство.
- Как предоставить состояние пользовательского интерфейса с наблюдаемыми типами данных в соответствии с принципами UDF.
- Как реализовать пользовательский интерфейс, использующий наблюдаемое состояние пользовательского интерфейса.
Самым фундаментальным из них является определение состояния пользовательского интерфейса.
См. пример из практики, описанный выше. Короче говоря, пользовательский интерфейс показывает список статей вместе с некоторыми метаданными для каждой статьи. Эта информация то, что приложение представляет пользователю, является состоянием пользовательского интерфейса.
Другими словами: если пользовательский интерфейс — это то, что видит пользователь, то состояние пользовательского интерфейса — это то, что видит приложение. говорит, что они должны видеть. Как две стороны одной медали, пользовательский интерфейс — это визуальное представление состояния пользовательского интерфейса. Любые изменения в состоянии пользовательского интерфейса немедленно отражается в пользовательском интерфейсе.
Рисунок 3. Пользовательский интерфейс — результат привязки элементов пользовательского интерфейса на экране к Состояние пользовательского интерфейса. Рассмотрим пример; чтобы выполнить требования приложения Новости,
информация, необходимая для полной визуализации пользовательского интерфейса, может быть инкапсулирована в Класс данных NewsUiState
определяется следующим образом:
класс данных NewsUiState( val isSignedIn: Boolean = false, val isPremium: Boolean = false, val newsItems: List= listOf(), val userMessages: List = listOf() ) класс данных NewsItemUiState( val title: Строка, тело val: Строка, val добавлено в закладки: Boolean = false, . .. )
Неизменность
Определение состояния пользовательского интерфейса в приведенном выше примере является неизменным. Ключевое преимущество это то, что неизменяемые объекты обеспечивают гарантии относительно состояния приложение в момент времени. Это освобождает пользовательский интерфейс, чтобы сосредоточиться на одном роль: читать состояние и соответствующим образом обновлять элементы пользовательского интерфейса. В результате вы никогда не следует изменять состояние пользовательского интерфейса в пользовательском интерфейсе напрямую, если только сам пользовательский интерфейс не является единственный источник его данных. Нарушение этого принципа приводит к многочисленным источникам истину для одной и той же части информации, что приводит к несоответствиям данных и тонкие баги.
Например, если флаг с закладкой
в объекте NewsItemUiState
из пользовательского интерфейса
состояние в тематическом исследовании были обновлены в классе Activity
, этот флаг будет
конкурируя с уровнем данных как источник закладки статуса
статья. Неизменяемые классы данных очень полезны для предотвращения такого рода
антипаттерн.
Соглашения об именах в этом руководстве
В этом руководстве классы состояния пользовательского интерфейса названы в зависимости от функциональности экран или часть экрана, который они описывают. Соглашение следующее:
функциональность + UiState .
Например, состояние экрана, отображающего новости, можно назвать NewsUiState
, а состояние новости в списке новостей может быть NewsItemUiState
.
Управление состоянием с однонаправленным потоком данных
В предыдущем разделе было установлено, что состояние пользовательского интерфейса является неизменяемым снимком детали, необходимые для отображения пользовательского интерфейса. Однако динамический характер данных в apps означает, что это состояние может меняться со временем. Это может быть связано с пользователем взаимодействие или другие события, которые изменяют базовые данные, которые используются для заполнить приложение.
Эти взаимодействия могут получить пользу от посредника для их обработки, определяя логика, применяемая к каждому событию и выполняющая необходимые преобразования к резервным источникам данных, чтобы создать состояние пользовательского интерфейса. Эти взаимодействия и их логика может быть размещена в самом пользовательском интерфейсе, но это может быстро стать громоздким, поскольку пользовательский интерфейс становится больше, чем предполагает его название: он становится владельцем данных, производитель, трансформер и многое другое. Кроме того, это может повлиять на тестируемость. потому что полученный код представляет собой тесно связанную смесь без различимых границы. В конечном счете, пользовательский интерфейс выиграет от снижения нагрузки. Если только Состояние пользовательского интерфейса очень простое, единственной обязанностью пользовательского интерфейса должно быть потребление и отображать состояние пользовательского интерфейса.
В этом разделе обсуждается однонаправленный поток данных (UDF), шаблон архитектуры это помогает обеспечить это здоровое разделение ответственности.
Владельцы состояния
Классы, отвечающие за создание состояния пользовательского интерфейса и содержащие необходимая логика для этой задачи называется держателями состояния . Приходят государственные держатели различных размеров в зависимости от области действия соответствующих элементов пользовательского интерфейса, которые они управляют, начиная от одного виджета, такого как нижнее приложение полоса на весь экран или пункт назначения навигации.
В последнем случае типичной реализацией является экземпляр
ViewModel, хотя в зависимости от
требованиям приложения может быть достаточно простого класса. Новостное приложение от
в тематическом исследовании, например, используется класс NewsViewModel
в качестве
держатель состояния для создания состояния пользовательского интерфейса для экрана, отображаемого в этом разделе.
ViewModel
:
рекомендуемая реализация для управления состоянием пользовательского интерфейса на уровне экрана с помощью
доступ к слою данных. Кроме того, он выдерживает изменения конфигурации
автоматически. Классы ViewModel
определяют логику, которая будет применяться к событиям в
приложение и в результате создать обновленное состояние. Существует множество способов моделирования взаимозависимости между пользовательским интерфейсом и его состоянием.
режиссер. Однако, поскольку взаимодействие между пользовательским интерфейсом и его ViewModel
class можно в значительной степени понимать как событие input и его последующее состояние output ,
взаимосвязь можно представить, как показано на следующей диаграмме:
Паттерн, в котором состояние течет вниз, а события вверх, называется однонаправленный поток данных (UDF). Последствия этого шаблона для приложения Архитектура выглядит следующим образом:
- ViewModel содержит и предоставляет состояние, которое будет использоваться пользовательским интерфейсом. Пользовательский интерфейс состояние — это данные приложения, преобразованные ViewModel.
- Пользовательский интерфейс уведомляет ViewModel о пользовательских событиях.
- ViewModel обрабатывает действия пользователя и обновляет состояние.
- Обновленное состояние передается обратно в пользовательский интерфейс для визуализации.
- Вышеописанное повторяется для любого события, вызывающего изменение состояния.
Для целей навигации или экранов ViewModel работает с репозиториями или используйте классы прецедентов для получения данных и преобразования их в состояние пользовательского интерфейса. включая последствия событий, которые могут вызвать мутации состояния. тематическое исследование, упомянутое ранее, содержит список статей, каждая наличие названия, описания, источника, имени автора, даты публикации и это было добавлено в закладки. Пользовательский интерфейс для каждого элемента статьи выглядит следующим образом:
Рис. 5. Пользовательский интерфейс элемента статьи в приложении тематического исследования.Пользователь, запрашивающий закладку статьи, является примером события, которое может вызывают мутации состояния. Как производитель состояния, это ViewModel’s ответственность за определение всей логики, необходимой для заполнения всех полей в состоянии пользовательского интерфейса и обрабатывать события, необходимые для полной визуализации пользовательского интерфейса.
Рисунок 6. Диаграмма, иллюстрирующая цикл событий и данных в UDF.В следующих разделах более подробно рассматриваются события, вызывающие изменения состояния. и как их можно обрабатывать с помощью UDF.
Типы логики
Добавление статьи в закладки является примером бизнес-логики , поскольку она дает значение в ваше приложение. Чтобы узнать больше об этом, см. данные страница слоя. Однако существуют разные виды логика, которую важно определить:
- Бизнес-логика — это реализация требований к продукту для приложения данные. Как уже упоминалось, одним из примеров является закладка статьи в приложение для изучения кейса. Бизнес-логика обычно размещается в предметной области или данных. слоев, но никогда в слое пользовательского интерфейса.
- Логика поведения пользовательского интерфейса или Логика пользовательского интерфейса — это как отображать изменения состояния на
экран. Примеры включают получение правильного текста для отображения на экране.
используя ресурсы Android
Логика пользовательского интерфейса, особенно когда она включает такие типы пользовательского интерфейса, как Контекст
должен находиться в пользовательском интерфейсе, а не в
ViewModel. Если пользовательский интерфейс усложняется и вы хотите делегировать пользовательский интерфейс
логику в другой класс, чтобы способствовать тестируемости и разделению задач, ты
можно создать простой класс в качестве держателя состояния . Простые классы, созданные в пользовательском интерфейсе
может принимать зависимости Android SDK, поскольку они следуют жизненному циклу пользовательского интерфейса;
Объекты ViewModel имеют более длительный срок службы.
Для получения дополнительной информации о государственных держателях и о том, как они вписываются в контекст помощь в создании пользовательского интерфейса, см. состояние Jetpack Compose руководство.
Зачем использовать UDF?
UDF моделирует цикл государственного производства, как показано на рисунке 4. Он также разделяет место, где происходят изменения состояния, место, где они трансформируются, и место, где они, наконец, потребляются. Это разделение позволяет пользовательскому интерфейсу именно то, что подразумевает его название: отображать информацию, наблюдая за изменениями состояния, и передать намерение пользователя, передав эти изменения в ViewModel.
Другими словами, UDF допускает следующее:
- Согласованность данных. Существует единственный источник правды для пользовательского интерфейса.
- Тестируемость. Источник состояния изолирован и поэтому доступен для проверки независимо от пользовательского интерфейса.
- Ремонтопригодность. Мутация состояния следует четко определенному шаблону, где мутации являются результатом как пользовательских событий, так и источников данных, которые они извлекают из.
После того, как вы определите состояние вашего пользовательского интерфейса и определите, как вы будете управлять производством
этого состояния следующим шагом является представление созданного состояния пользовательскому интерфейсу. Потому что
вы используете UDF для управления созданием состояния, вы можете рассмотреть
произведенное состояние должно быть потоком — другими словами, несколько версий состояния
будет производиться со временем. В результате вы должны отображать состояние пользовательского интерфейса в
наблюдаемый держатель данных, такой как LiveData
или StateFlow
. Причина этого такова
что пользовательский интерфейс может реагировать на любые изменения, внесенные в состояние, без необходимости
вручную извлекать данные непосредственно из ViewModel. Эти типы также имеют
преимущество всегда иметь последнюю версию состояния пользовательского интерфейса в кэше, что
полезно для быстрого восстановления состояния после изменения конфигурации.
просмотров
class NewsViewModel(...) : ViewModel() { val uiState: StateFlow= … }
Составление
класс NewsViewModel(. ..) : ViewModel() { val uiState: NewsUiState = … }
Для ознакомления с LiveData
в качестве держателя наблюдаемых данных см.
кодовая лаборатория. Для аналогичного
введение в потоки Kotlin см. в разделе потоки Kotlin на Android.
mutableStateOf
или snapshotFlow
для отображения состояния пользовательского интерфейса. Любой тип держателя наблюдаемых данных
например StateFlow
или LiveData
, которые вы видите в этом руководстве, можно легко
потребляется в Compose с использованием соответствующего
расширения.В тех случаях, когда данные, предоставляемые пользовательскому интерфейсу, относительно просты, часто стоит оборачивая данные в тип состояния пользовательского интерфейса, потому что он передает взаимосвязь между эмиссия держателя состояния и связанного с ним экрана или элемента пользовательского интерфейса. Кроме того, по мере усложнения элемента пользовательского интерфейса его всегда легче добавлять в определение состояния пользовательского интерфейса для размещения дополнительной информации, необходимой для визуализировать элемент пользовательского интерфейса.
Обычный способ создания потока UiState
— путем предоставления резервного изменяемого объекта.
поток как неизменяемый поток из ViewModel — например, предоставление MutableStateFlow
как StateFlow
.
просмотров
class NewsViewModel(...) : ViewModel() { частное значение _uiState = MutableStateFlow(NewsUiState()) val uiState: StateFlow= _uiState.asStateFlow() ... }
Составление
класс NewsViewModel(...) : ViewModel() { var uiState от mutableStateOf(NewsUiState()) частный набор . .. }
Затем ViewModel может предоставлять методы, которые внутренне изменяют состояние,
публикация обновлений для пользовательского интерфейса. Возьмем, например, случай, когда
необходимо выполнить асинхронное действие; сопрограмму можно запустить с помощью viewModelScope
и
изменяемое состояние может быть обновлено после завершения.
просмотров
класс NewsViewModel( частный репозиторий: NewsRepository, ... ) : ViewModel () { частное значение _uiState = MutableStateFlow(NewsUiState()) val uiState: StateFlow= _uiState.asStateFlow() частный вар fetchJob: Работа? = ноль fun fetchArticles (категория: строка) { fetchJob?.cancel() fetchJob = viewModelScope.launch { пытаться { val newsItems = репозиторий.newsItemsForCategory(категория) _uiState.update { it.copy(newsItems = новости) } } поймать (ioe: IOException) { // Обработать ошибку и при необходимости уведомить пользовательский интерфейс. _uiState.update { val messages = getMessagesFromThrowable(ioe) it.copy(userMessages = сообщения) } } } } }
Составление
класса NewsViewModel( частный репозиторий: NewsRepository, ... ) : ViewModel () { var uiState от mutableStateOf(NewsUiState()) частный набор частный вар fetchJob: Работа? = ноль fun fetchArticles (категория: строка) { fetchJob?.cancel() fetchJob = viewModelScope.launch { пытаться { val newsItems = репозиторий.newsItemsForCategory(категория) uiState = uiState.copy(newsItems = newsItems) } поймать (ioe: IOException) { // Обработать ошибку и при необходимости уведомить пользовательский интерфейс. val messages = getMessagesFromThrowable(ioe) uiState = uiState.copy(userMessages = сообщения) } } } }
В приведенном выше примере класс NewsViewModel
пытается получить статьи для
определенной категории, а затем отражает результат попытки — успех или
сбой — в состоянии пользовательского интерфейса, когда пользовательский интерфейс может реагировать на него соответствующим образом. См.
Показать ошибки в разделе экрана, чтобы узнать больше об ошибке
умение обращаться.
Дополнительные рекомендации
В дополнение к предыдущему руководству при открытии пользовательского интерфейса учтите следующее. state:
Объект состояния пользовательского интерфейса должен обрабатывать состояния, которые связаны друг с другом. Это приводит к меньшему количеству несоответствий и упрощает код. понять. Если выставить список новостей и количество закладок в двух разных потоках, вы можете оказаться в ситуации, когда один обновился, а другого не было. Когда вы используете один поток, оба элемента постоянно обновлялся. Кроме того, для некоторой бизнес-логики может потребоваться комбинация источники. Например, вам может понадобиться показать кнопку закладки, только если пользователь вошел в и , что пользователь является подписчиком премиум-службы новостей. Вы можете определить класс состояния пользовательского интерфейса следующим образом:
класс данных NewsUiState( val isSignedIn: Boolean = false, val isPremium: Boolean = false, val newsItems: List
= listOf() ) val NewsUiState.canBookmarkNews: логическое значение get() = isSignedIn && isPremium В этом объявлении видимость кнопки закладки является производной свойство двух других свойств. По мере усложнения бизнес-логики единственное число
Класс UiState
, в котором сразу доступны все свойства становится все более важным.Состояния пользовательского интерфейса: один поток или несколько потоков? Ключевой руководящий принцип для выбора между отображением состояния пользовательского интерфейса в одном потоке или в нескольких streams — это предыдущий пункт: отношения между элементами излучаемый. Самым большим преимуществом однопотоковой экспозиции является удобство и согласованность данных: потребители состояния всегда имеют самую свежую информацию доступным в любой момент времени. Однако бывают случаи, когда отдельные потоки состояния из ViewModel могут подойти:
Несвязанные типы данных: Некоторые состояния, необходимые для отображения пользовательского интерфейса, могут быть полностью независимыми друг от друга. В подобных случаях расходы на объединение этих разрозненных состояний вместе может перевесить преимущества, особенно если одно из этих состояний обновляется чаще, чем другое.
UiState
diffing: Чем больше полей в объектеUiState
, тем более вероятно, что поток будет излучать в результате одного из его полей обновляется. Поскольку представления не имеют механизма сравнения для понимания независимо от того, являются ли последовательные выбросы разными или одинаковыми, каждый выброс вызывает обновление представления. Это означает, что смягчение с использованиемПоток
API или методы, такие какотдельныйUntilChanged()
наLiveData
может понадобиться.
Чтобы использовать поток объектов UiState
в пользовательском интерфейсе, вы используете терминал
оператор для наблюдаемого типа данных, который вы используете. Например, для LiveData
вы используете метод наблюдать()
, а для потоков Kotlin вы используете метод метод collect()
или его варианты.
При использовании держателей наблюдаемых данных в пользовательском интерфейсе обязательно
жизненный цикл пользовательского интерфейса. Это важно, потому что интерфейс
не следует наблюдать за состоянием пользовательского интерфейса, когда представление не отображается для
пользователь. Чтобы узнать больше об этой теме, см. этот блог
почта.
При использовании LiveData
, LifecycleOwner
неявно заботится о жизненном цикле
обеспокоенность. При использовании потоков лучше обрабатывать это с помощью соответствующих
область действия сопрограммы и API repeatOnLifecycle
:
просмотров
class NewsActivity : AppCompatActivity() { private val viewModel: NewsViewModel от viewModels() переопределить удовольствие onCreate(savedInstanceState: Bundle?) { ... lifecycleScope.launch { repeatOnLifecycle(Lifecycle.State.STARTED) { viewModel.uiState.collect { // Обновить элементы пользовательского интерфейса } } } } }
Составление
@Составное весело Последние новостиЭкран( ViewModel: NewsViewModel = ViewModel() ) { // Показать элементы пользовательского интерфейса на основе viewModel.uiState }Примечание: Конкретные объекты
StateFlow
, используемые в этом примере, не останавливаются. выполнение работы, когда у них нет активных сборщиков, но когда вы работаете
с потоками вы можете не знать, как они реализованы. Использование с учетом жизненного цикла
коллекция потоков позволяет вносить подобные изменения в потоки ViewModel.
позже без повторного посещения кода нижестоящего коллектора.Показать выполняемые операции
Простой способ представить состояния загрузки в классе UiState
— использовать
логическое поле:
класс данных NewsUiState( val isFetchingArticles: Boolean = false, ... )
Значение этого флага представляет наличие или отсутствие индикатора выполнения в Пользовательский интерфейс.
просмотров
класс NewsActivity : AppCompatActivity() { private val viewModel: NewsViewModel от viewModels() переопределить удовольствие onCreate(savedInstanceState: Bundle?) { . .. lifecycleScope.launch { repeatOnLifecycle(Lifecycle.State.STARTED) { // Привязываем видимость progressBar к состоянию // isFetchingArticles. viewModel.uiState .map { it.isFetchingArticles } .distinctUntilChanged() .collect { progressBar.isVisible = это } } } } }
Составление
@Составное весело Последние новостиЭкран( модификатор: Модификатор = Модификатор, ViewModel: NewsViewModel = ViewModel() ) { Поле (модификатор.fillMaxSize()) { если (viewModel.uiState.isFetchingArticles) { CircularProgressIndicator(Modifier.align(Alignment.Center)) } // Добавляем другие элементы пользовательского интерфейса. Например, список. } }
Отображение ошибок на экране
Отображение ошибок в пользовательском интерфейсе аналогично отображению выполняемых операций, поскольку они оба легко представлены логическими значениями, которые обозначают их присутствие или отсутствие. Однако ошибки могут также включать связанное сообщение для ретрансляции. пользователю или действие, связанное с ним, которое повторяет неудачную попытку операция. Таким образом, пока выполняемая операция либо загружается, либо нет при загрузке состояния ошибок, возможно, потребуется смоделировать с помощью классов данных, в которых размещены метаданные, соответствующие контексту ошибки.
Например, рассмотрим пример из предыдущего раздела, в котором индикатор выполнения при получении статей. Если эта операция приведет к ошибке, вы может захотеть отобразить пользователю одно или несколько сообщений с подробным описанием того, что произошло. неправильный.
класс данных Сообщение (действительный идентификатор: длинное, значащее сообщение: строка) класс данных NewsUiState( val userMessages: List= listOf(), ... )
Сообщения об ошибках могут быть представлены пользователю в виде пользовательского интерфейса. элементы, такие как закусочные. Поскольку это связано с тем, как создаются и потребляются события пользовательского интерфейса, см. страницу событий, чтобы узнать больше.
Многопоточность и параллелизм
Любая работа, выполняемая в ViewModel, должна быть основной безопасной — безопасной для вызова из основной поток. Это связано с тем, что уровни данных и предметной области отвечают за перенос работы в другую ветку.
Если ViewModel выполняет длительные операции, то она также отвечает за перемещение этой логики в фоновый поток. Корутины Kotlin — отличный способ управлять параллельными операциями, а компоненты архитектуры Jetpack обеспечивают встроенная поддержка для них. Чтобы узнать больше об использовании сопрограмм в приложениях для Android, см. см. сопрограммы Kotlin на Android.
Навигация
Изменения в навигации приложений часто вызываются событиями. Например,
после того, как класс SignInViewModel
выполнит вход, UiState
может иметь Поле isSignedIn
установлено на true
. Такие триггеры следует потреблять только
как те, которые описаны в разделе «Использование состояния пользовательского интерфейса».
выше, за исключением того, что реализация потребления должна зависеть от
Компонент навигации.
Пейджинг
Библиотека пейджинга
потребляется в пользовательском интерфейсе с типом под названием Данные пейджинга
. Потому что PagingData
представляет и содержит элементы, которые могут изменяться с течением времени, другими словами,
не неизменный тип — он не должен быть представлен в неизменном состоянии пользовательского интерфейса.
Вместо этого вы должны выставлять его из ViewModel независимо в своем собственном
ручей. См. кодовую лабораторию Android Paging для
конкретный пример этого.
Анимации
Чтобы обеспечить плавные и плавные переходы навигации верхнего уровня, вы можете
хотите подождать, пока второй экран загрузит данные, прежде чем запускать анимацию. Платформа представления Android предоставляет хуки для задержки переходов между фрагментами
направления с отложитьEnterTransition()
а также startPostponedEnterTransition()
API. Эти API позволяют гарантировать, что элементы пользовательского интерфейса на втором
экран (обычно это изображение, загруженное из сети) готовы к отображению
до того, как пользовательский интерфейс анимирует переход к этому экрану. Для более подробной информации и
особенности реализации см. в Android Motion
образец.
Samples
Следующие примеры Google демонстрируют использование слоя пользовательского интерфейса. Изучите их, чтобы увидеть это руководство на практике:
Полное руководство по разработке Android: более 50 ресурсов для начинающих и экспертов
Я до сих пор помню тот день, когда несколько лет назад я начал разработку Android и вошел в этот огромный загадочный мир, почти не зная, с чего начать и что делать следующий.
Поиск в Google, натыкаясь на разные статьи и проверяя ответы StackOverflow, были для меня единственными способами получить знания об Android. В то время мне было трудно найти качественные учебные пособия для обучения, но со временем я начал выяснять места, где я мог найти наиболее полезные ресурсы для сбора знаний и улучшения своих навыков.
Чтобы помочь другим разработчикам Android, таким как я, я собрал исчерпывающий список ресурсов, которые должны быть полезны почти всем разработчикам Android, будь то новички или опытные профессионалы.
Для начинающих
Они бесценны для всех Java-программистов, начинающих свой путь разработки Android.
Разработка под Android для начинающих
Простой и удобный для начинающих курс, разработанный Google для быстрого изучения основ и фундаментальных концепций разработки под Android.
Разработка для Android с помощью Android Studio
Простое, легкое и полное руководство для всех начинающих разработчиков Android, которые хотят разработать свое первое приложение для Android, используя де-факто IDE с открытым исходным кодом, Android Studio.
Android Development CodeLabs
Это один из самых недооцененных ресурсов, о котором почти все разработчики Android должны знать с самого начала своего пути разработки.
Глоссарий Google Android
Если вы только вступаете в огромный мир разработки для Android, то, скорее всего, вы будете перегружены множеством новых понятий и терминов. Не волнуйся; Google разработал интерактивный, простой в использовании глоссарий с примерами кода, чтобы сделать вашу жизнь намного проще.
Официальные руководства по обучению Android
Официальное руководство по обучению для разработчиков Android от Google чрезвычайно полезно для любого начинающего разработчика. Обучение охватывает основы с большим количеством примеров кода.
Чему 2 года разработки Android научили меня на собственном горьком опыте
Очень содержательная и содержательная статья для начинающих разработчиков Android. Всегда учитесь на чужом опыте и ошибках и никогда не повторяйте их сами.
Основы XML
Не знакомы с XML? Пришло время изучить его, так как вам придется активно использовать его для разработки макетов в Android. Это очень легко и не должно занять много времени, чтобы понять.
Руководство для начинающих по HTTP и REST
Если вы собираетесь взаимодействовать с веб-службами и выполнять вызовы API из своего приложения для Android, вам очень важно хорошо понимать HTTP и REST.
Для опытных разработчиков
Если вы занимаетесь разработкой для Android в течение года или двух, вот несколько расширенных ресурсов, которые помогут вам расширить свои знания в области разработки для Android.
Разработка приложений для Android
Хорошо разработанный курс от Google, который идеально подходит для Android-разработчиков среднего уровня.
Общие шаблоны проектирования для Android
Если вы пытаетесь найти элегантные способы решения критических проблем разработки программного обеспечения в Android, эти общие шаблоны проектирования могут вам очень помочь.
Как освоить Android: чему разработчики могут научиться из 21 приложения
Лучший способ стать лучше в качестве разработчика – читать отличный код. Android имеет очень богатое сообщество приложений с открытым исходным кодом, но как узнать, какие из них преподнесут вам правильные уроки? Не волнуйся; эта статья вас охватила.
Сравнение MVC, MVP и MVVM на Android
Узнайте, как выбрать правильную архитектуру для сложного приложения для Android, которая обеспечит лучшую разработку, тестирование, отладку и обслуживание.
Современный Android: отказ от действий и фрагментов
Все мы знаем, насколько сложным и разочаровывающим иногда может быть жизненный цикл действий и фрагментов Android, но есть и другие, более современные способы создания приложений. Эта статья может показать вам эти современные методы разработки Android.
RxAndroid Tutorial
Окунитесь в мир реактивного программирования для Android с помощью этого простого ускоренного курса.
Подробное знакомство с конструкторами представлений Android
Подробно изучите конструкторы представлений Android, как они работают и как получить максимальную отдачу от их использования в своих собственных представлениях.
Понимание ядра Android: Looper, Handler и HandlerThread
Если вы хотите понять, как устроено асинхронное ядро платформы Android и как использовать эти знания для создания плавных, быстрых и высококачественных приложений, это именно то, что вам нужно. вам нужно посмотреть.
Измерение, компоновка, рисование, повторение: пользовательские представления и группы просмотра
Подробное руководство о том, как представления и группы просмотра работают в Android и как создавать собственные пользовательские компоненты пользовательского интерфейса.
Понимание режимов запуска Android Activity
Не многие разработчики должным образом понимают, как работают различные режимы запуска в Android. В этом руководстве вы узнаете, как использовать эти режимы для создания превосходной навигации в вашем приложении.
Как распространять собственную библиотеку Android
Если вы какое-то время использовали библиотеки с открытым исходным кодом в своих приложениях для Android и теперь хотите внести свой вклад в сообщество, вот полное подробное руководство по публикации собственной библиотеки.
Контрольный список перед выпуском основного приложения Google Play Store
Узнайте, как обеспечить плавный и успешный запуск приложения Android в Play Store.
Схемы архитектуры Android
Этот репозиторий GitHub содержит схемы для изучения различных архитектурных инструментов и шаблонов для профессиональной разработки приложений Android.
Как развернуть Android-приложения с мгновенным запуском: веб-приложения превзойдут нативные приложения
Android-приложения с мгновенным запуском — это новый способ повысить вовлеченность и обеспечить нативную функциональность через Интернет, а не приложение на главном экране. В этой статье объясняются преимущества и то, как просто сделать мгновенную версию существующего приложения.
Лучшие инструменты повышения производительности для разработчиков Android
В этой статье представлены некоторые варианты набора инструментов разработчика, которые могут значительно повысить вашу продуктивность.
Используйте Android Studio как профессионал
Даже если вы почти каждый день используете Android Studio для разработки своих приложений, вы можете не осознавать некоторые действительно полезные функции, скрытые внутри.
Рекомендации для Android
Следование рекомендациям поможет вам разрабатывать более чистые и качественные приложения. Это становится еще более важным, если вы разрабатываете с командой. Вам нужны передовые методы для поддержания согласованного стиля разработки, который держит всех на одной волне.
Рекомендации по разработке для Android
Наполненная ресурсами статья, объясняющая некоторые аспекты передовой практики разработки для Android.
Android strings.xml — о чем следует помнить
В этой статье рассказывается о передовых методах использования файлов ресурсов strings. xml.
Рекомендации для Android
Один из лучших и наиболее полных ресурсов, объясняющих передовой опыт и рекомендации по различным аспектам разработки под Android.
Рекомендации для Android для работы на предприятии
Хотите использовать Android на своем предприятии? Прочтите эту статью о передовых методах работы с Android for Work.
Разработка под Android — некоторые передовые методы
Краткий и полезный список дополнительных передовых методов для Android.
Effective Java для Android (шпаргалка)
Effective Java (автор Джошуа Блок) считается одной из лучших книг для обучения написанию высококачественного, поддерживаемого Java-кода. Этот пост посвящен тому, как вы можете наилучшим образом использовать эти методы и принципы, особенно в разработке для Android.
7 лучших советов по RxJava для Android
Если вы выбрали реактивный способ создания приложений для Android, эти советы помогут вам избежать некоторых распространенных ошибок и максимально эффективно использовать эту стратегию.
Сокрытие секретов в приложениях для Android
Подробная статья о некоторых распространенных методах хранения и защиты секретов (паролей, ключей API и другой конфиденциальной информации) в приложениях для Android.
Разработка красивых приложений
Чистый и красивый пользовательский интерфейс — это то, что делает ваше приложение привлекательным и удобным в использовании. Вот несколько ресурсов, которые помогут убедиться, что ваше приложение имеет как стиль, так и содержание.
Material Design: подробный обзор
Очень хорошо написанная статья, в которой подробно рассматриваются методы Google Material Design для Android.
Оживить все вещи. Переходы в Android
Узнайте, как создать красивую и выразительную анимацию в своем приложении для Android, которая выделит его среди остальных.
Создание интерфейсов с помощью ConstraintLayout
Свежий ConstraintLayout полностью меняет правила игры, когда дело доходит до разработки макетов для приложений Android. Эта статья поможет вам понять основы ConstraintLayout, чтобы вы могли быстро приступить к его использованию.
Восемь запретов для приложения Material Design
Создавайте более качественные приложения, не допуская этих распространенных ошибок при использовании Material Design в своем приложении для Android.
Дизайн материалов – это наука о дизайне
Очень содержательная статья, которая дает вам более научную точку зрения на дизайн материалов и то, как вы можете в полной мере использовать его при разработке своего приложения.
Бонусные ресурсы
Некоторые разные ресурсы, которые нельзя пропустить.
40 ведущих разработчиков Android, на которых стоит подписаться в Твиттере
Если вы хотите быть в курсе последних событий в сообществе Android, подписывайтесь на этих опытных разработчиков Android в Твиттере.
Начните работу с Android Things уже сегодня!
Хотите погрузиться в мир Интернета вещей с помощью инструментов Android? Вот хороший ресурс для вас, чтобы начать свое путешествие.
Учебное пособие по Android Wear — подробное введение
Если вы заинтересованы в разработке приложений для носимых устройств Android, это полное учебное пособие поможет вам начать работу.
Памятка по ресурсам и атрибутам Android
Очень интересная статья о мельчайших подробностях ресурсов и атрибутов Android, о которых вы, вероятно, не знали.
Знакомство с Android TV
Хотите разрабатывать приложения для телевизоров или сделать так, чтобы существующие приложения поддерживали эту новую платформу? Вот хорошее краткое введение.
Полезные сайты
Хотите быть в курсе последних новостей о разработке, руководств и событий в мире Android? Вот некоторые из лучших источников, которые можно проверить.
Android Weekly
Будьте в курсе последних новостей разработки, статей, видеороликов и других событий в мире Android. Android Weekly предлагает бесплатные информационные бюллетени каждую неделю, чтобы вы могли без усилий оставаться в курсе.
Fragmented Podcast
Если вы любите слушать подкасты, то вы не захотите пропустить раз в две недели Fragmented Podcast, в котором рассказывается о различных инструментах, шаблонах и передовых методах Android с помощью известных приглашенных разработчиков.
CodePath Android Cliffnotes
Один из лучших и самых современных краудсорсинговых ресурсов для разработчиков Android. Здесь вы найдете руководства и обучающие материалы практически обо всем, что связано с Android. И самое приятное то, что исходный код полностью открыт, так что вы тоже можете внести свой вклад.
Caster IO
Получайте высококачественные короткие видеоролики о разработке Android по широкому кругу тем, которые выходят каждую неделю.
Styling Android
Здесь вы найдете важную информацию для разработки UI и UX вашего приложения.
Блог Commons
Марк Мерфи, известный автором книги The Busy Coder’s Guide to Android Development, , ведет отличный блог о разработке для Android.
Vogella
Этот сайт, созданный Ларсом Фогелем, содержит множество подробных руководств по темам разработки для Java и Android, которые могут оказаться бесценными как для начинающих, так и для Android-разработчиков среднего уровня.
Сообщество разработчиков Android на Reddit
Очень активное сообщество разработчиков Android со всего мира, которые обсуждают и обмениваются информацией по различным темам, связанным с разработкой Android.
Официальный блог разработчиков Android
Это официальный блог , который Google использует для прямого общения с сообществом разработчиков Android. Все последние новости и объявления, связанные с разработкой, первыми появляются здесь.
Я надеюсь, что эти ресурсы помогут вам узнать больше о разработке приложений для Android и создавать более качественные приложения. Если вы нашли это полезным, поделитесь им со своими друзьями и коллегами. Если есть какие-либо ресурсы по разработке для Android, которые не были включены в эту статью и которые вы считаете особенно полезными, поделитесь ими в комментариях ниже, и мы рассмотрим возможность их добавления в наше развивающееся руководство.