Как настроить интерфейс программы на андроид
В этом курсе вы познакомитесь с основами дизайна пользовательского интерфейса Android. Вы поймете пользовательский ввод, представления и макеты, а также адаптеры и фрагменты. Проверьте это здесь !
Содержание
1. Введение
В этой последней статье о пользовательском интерфейсе Android мы создадим приложение для Android, которое использует почти все концепции, о которых мы говорили в предыдущих статьях. Мы говорили о наиболее важных аспектах, которые необходимо учитывать при разработке приложения для Android. Мы увидели, как создать структуру пользовательского интерфейса с помощью менеджеров макетов и как мы можем размещать виджеты; мы описали некоторые лучшие практики, которые мы должны использовать при разработке приложения. Итак, приложение, которое мы создадим, будет основано на темах, которые мы уже обсуждали ранее, поэтому взгляните на них еще раз, чтобы освежить вашу память.
2. Структура приложения
Прежде чем углубляться в детали кода, первое, что мы должны учитывать при создании приложения, — это сделать несколько набросков, которые помогут нам понять навигацию приложения и взаимодействие с пользователем. Мы можем использовать несколько инструментов, некоторые из них бесплатны. Кроме того, эти эскизы помогают нам понять, как будет выглядеть наше приложение, и мы могли бы показать их нашим клиентам, чтобы они могли понять, соответствует ли приложение, которое мы хотим построить, их потребностям.
Возвращаясь к нашему приложению To do, мы можем представить, что у нас есть следующие требования:
- Там должен быть список предметов (для выполнения предметов).
- Пользователь может добавить элемент к существующим.
- Предметы должны иметь приоритетный цвет.
- Приложение должно работать на смартфоне и планшете.
Конечно, в реальном приложении требования будут намного сложнее, но это всего лишь ступенька. Мы можем представить простую навигацию, подобную этой:
Это очень простая навигация: при запуске приложение отображает текущий список элементов, а когда пользователь нажимает «Добавить элемент» на панели действий. приложение покажет экран добавления элемента. Для простоты и сосредоточенности на аспектах пользовательского интерфейса мы можем предположить, что приложение не будет сохранять элементы. Читателю может быть интересно расширить приложение, чтобы оно сохраняло элементы.
Теперь, когда мы примерно знаем, какой будет навигация и как будет выглядеть пользовательский интерфейс приложения, мы можем приступить к созданию нашего приложения с помощью нашей IDE. В этом случае мы будем использовать Eclipse + ADT. Мы создаем новый проект Android, который мы можем назвать Todo . Мы не будем рассказывать, как создать проект Android с использованием Eclipse, поэтому мы предполагаем, что вы уже знакомы с этой IDE. Посмотрите наш пример «Android Hello World», если вы не знакомы с процессом.
2.1. Список предметов с ListView и объектной моделью
Теперь у нас есть структура проекта, и мы можем сосредоточиться на разработке модели, стоящей за приложением. В этом случае модель очень проста, это просто класс, который содержит информацию о новом элементе todo:
Это будет основной класс, который мы будем обрабатывать в нашем приложении. Глядя на проект Android, который мы только что создали, мы можем заметить, что под каталогом макетов есть макет по умолчанию, называемый activity_main.xml . Это макет по умолчанию, созданный инструментом.
К настоящему времени мы можем предположить, что у нас есть только список элементов в этом макете: этот макет будет использоваться только для смартфона, и мы рассмотрим позже, когда приложение будет работать на планшете. Расположение элемента списка очень простое, оно просто создается стандартным виджетом ListView :
Если вы заметили, мы дали указание Android использовать только пространство, необходимое для хранения элементов в списке. Мы знаем, что для использования ListView мы должны реализовать адаптер. Мы могли бы использовать стандартный адаптер, предоставляемый Android, но в этом случае этих стандартных адаптеров недостаточно, мы хотим реализовать собственный адаптер, потому что мы хотели бы показать некоторую информацию для каждой строки в списке. Нам бы хотелось, чтобы строка в списке выглядела так:
Как вы можете заметить, каждая строка имеет изображение слева, которое представляет приоритет задачи и некоторую информацию. В настоящее время мы не рассматриваем применение какого-либо стиля к нашим строкам. Чтобы иметь такую строку в нашем ListView , мы должны создать макет строки, который мы будем использовать в нашем настраиваемом адаптере. Таким образом, мы можем создать новый файл с именем item_layout.xml в директории layout . Этот файл выглядит так:
В этом макете мы используем менеджер RelativeLayout чтобы легко размещать виджеты там, где нам нужно. Как вы можете видеть в этом менеджере компоновки, представления размещаются в соответствии с другими позициями просмотра. Например, мы хотим, чтобы имя нашей задачи было размещено сразу после изображения, поэтому мы используем атрибут:
Более того, мы можем размещать представления относительно родителя, например, мы хотим, чтобы информация о дате была размещена справа от строки и внизу:
Теперь, когда у нас есть макет, мы должны построить адаптер. Мы расширим ArrayAdapter и переопределим некоторые методы, чтобы мы могли обрабатывать данные нашей модели и новый макет. Мы называем этот адаптер ToDoItemAdaper , поэтому мы имеем:
Конструктор получает Context и itemList качестве параметров, последний параметр содержит список элементов todo. Вы можете заметить, что когда мы вызываем супер метод, мы R.layout.item_layout пользовательский макет с именем R.layout.item_layout . Теперь нам нужно переопределить один из наиболее важных методов, называемый getView , который используется для создания View и рендеринга макета строки:
В этом методе мы проверяем в начале, является ли представление, которое мы получаем как параметр, нулевым. В этом случае мы должны надуть наш макет. Если вы заметили, мы использовали шаблон ViewHolder , чтобы сделать прокрутку ListView более плавной. Мы создали небольшой внутренний класс ItemHolder который содержит ссылки на View внутри нашего пользовательского макета:
Одна вещь, которую вы должны заметить, это то, как мы обрабатывали цвет фона ImageView . Мы использовали setBackgroundResource для установки imageview изображения. Этот метод принимает int, представляющий идентификатор ресурса, который мы хотим использовать в качестве фона:
Глядя на наш класс модели, мы можем заметить, что метод getTag() возвращает экземпляр класса TagEnum . Это перечисление, определенное следующим образом:
В перечислении мы определяем различные цвета, которые мы хотим поддерживать, и в качестве первого параметра мы передаем идентификатор ресурса. Если вы помните, в предыдущей статье мы говорили о том, как определить цвет ресурса в формате XML. Мы уже знаем, что нам нужно создать XML-файл в res/values который мы можем назвать colors.xml :
Даже если результат будет таким же, не рекомендуется использовать жестко закодированные значения в исходном коде. Например, если мы хотим изменить красный цвет на другой, нам нужно будет найти шестнадцатеричный цвет в исходном коде и изменить его, но если бы мы использовали ресурсы для определения цветов, мы бы обратились непосредственно к файлу, содержащему определения цвета и изменить цвет, который нам нравится.
Обратите внимание, что в перечислении мы использовали плохую практику: мы написали непосредственно имя цвета. Мы использовали его специально, чтобы показать вам то, что вы не должны делать. В этом случае, если мы хотим поддерживать многоязычное приложение, нам нужно изменить способ инициализации перечисления, используя имя, записанное в файле строковых ресурсов.
2.2. Поддержка нескольких устройств и особенности компоновки
Помните, что одним из наших требований является создание приложения, которое поддерживает как смартфоны, так и планшеты. Думая о размерах экрана планшета, мы понимаем, что экран слишком большой, чтобы вместить только список элементов, поэтому мы могли бы рассмотреть возможность разделения экрана на две области: одну, в которой содержится список, и другую, которую мы можем использовать для отображения деталей элемента или даже показать пользовательский интерфейс, чтобы добавить новый элемент. Это верно, если мы используем планшеты, но если у нас смартфон, размеры экрана недостаточно велики, чтобы разделить их на две части.
Когда приложение запускается на смартфоне, нам приходится обрабатывать два действия: одно для элемента списка, а другое — для ввода данных пользователем, в то время как на планшете у нас может быть только одно действие.
Мы можем предположить, что размер экрана составляет не менее 600 dp, поэтому мы хотим разделить экран на другие области и определить новый макет в res/layout-sw600dp :
Интересуюсь темой разработки под Android. Пишу небольшое приложение. Столкнулся с тем, что не до конца понимаю как правильно делать настройки для приложения. Немного погуглил, нашел статью, которая помогла разобраться. Решил перевести статью для русскоязычного сообщества, включив некоторые комментарии к оригиналу.
Настройки являются важной частью приложений на Android (и не только на Android — здесь и далее примечание переводчика). Это очень важно — позволять пользователям изменять настройки приложения, в зависимости от их предпочтений.
Существует два пути работы с настройками в Android — можно создать файл preferences.xml в директории res/xml, либо работать с настройками из кода. В данной статье я покажу как работать с настройками, используя preferences.xml файл.
- android:key — имя настройки, по поторому в дальнейшем можно получить ее значение
- android:title — заголовок элемента настройки
- android:summary — краткое описание элемента настройки
- android:defaultValue — значение по умолчанию
- CheckBoxPreference — простой чекбокс, который возвращает значения true или false.
- ListPreference — группа переключателей (radioGroup), из которых может быть выбран только один элемент. Атрибут android:entries указывает на массив со значениями в res/values/arrays.xml, а android:entryValues на массив с подписями.
- EditTextPreference — показывает диалоговое окно с полем ввода. Возвращает строку в качестве значения.
- RingtonePreference — группа переключателей с выбором рингтона.
- Preference — настройка, работающая как кнопка.
- PreferenceScreen — экран с настройками. Когда один PreferenceScreen вложен в другой, то открывается новый экран с настройками.
- PreferenceCategory — категория настроек.
Экран с настройками | EditTextPreference |
ListPreference | RingtonePreference |
PreferenceScreen |
Скриншоты выше были сгенерированы при помощи следующего preferences.xml:
Атрибуты android:entries и android:entryValues у ListPreference ссылаются на @array/listArray и @array/listValues соответственно. Значения берутся из res/values/arrays.xml, который в нашем случае выглядит следующим образом:
Для того, чтобы показать пользователю экран с настройками, небходимо создать активити, унаследованное от PreferenceActivity. Пример активити:
А вызвать активити с настройками можно, нажав на кнопку на нашем главном активити:
Для того, чтобы использовать выставленными в настройках значениями, добавим метод getPrefs() в главное активити, который нужно вызывать на событии onStart(). Нужно использовать именно onStart(), а не onCreate(), для того, чтобы быть уверенным в том, что используются актуальные настройки, а не те, что были во время создания гланого активити. Наш метод getPrefs() может выглядеть примерно вот так:
И на последок, не забудте добавить созданное активити с настройками в androidmanifest.xml и добавить новую строку с именем «set_preferences», для обозначения заголовка экрана с настройками, например «Preferences».
В какой-то момент любое крупное приложение разрастается так, что сложно везде поддерживать однотипный дизайн и динамично реагировать на любые изменения и тенденции в дизайне и UX-требованиях.
Поэтому решили внедрить в наше приложение дизайн-систему и добавить поддержку нескольких тем оформления.
Изучив различные способы, выработали свой подход к решению такой задачи. Хотелось сделать так, чтобы дизайн-систему и поддержку стилей можно было повторно использовать в других своих проектах. В соответствии с этой идеей разрабатывались компоненты и темы.
Дизайн-система и её компоненты предназначены для унификации дизайна и стилевого единства во всем приложении.
Компонентами дизайн-системы в нашем случае будем называть custom view с возможностью адаптации к нескольким стилям приложения. Компоненты могут применяться в любом месте приложения (кнопки, элементы списка, заголовки и т.д.).
Заказчиками компонентов дизайн-системы являются дизайнеры. С ними на первом этапе согласовываем надобность элемента (оценка переиспользуемости) и его функциональность.
После согласования должно быть понятно, какие опции нужно вынести в атрибуты custom view (цвет текста, текст, иконочку, цвет тинта иконочки и т.д.), а какие скрыть от изменений извне (это позволяет уберечь элемент от неправильного использования разработчиками).
Далее дизайнеры отрисовывают компонент в своих средах и отдают на разработку.
При реализации компонента нужно добавить поддержку тем (светлая или темная тема и т.д.) О том, как компонент поддерживает несколько тем, я расскажу ниже.
Лучшие методики
- Создать модуль с компонентами дизайн-системы. Из положительных моментов: отдельный модуль может быть использован в других приложениях, а модульность позволяет быстрее ориентироваться.
- Создать тестовое приложение с компонентами дизайн-системы. Это ускоряет разработку и отладку.
Мне известно два способа поддержки стилей в Android:
- Программный (программная перекраска).
- Стандартные механизмы стилей в Android.
Мы перекрашиваем всю иерархию view в runtime. Рекурсивно проходимся по ней и по определенным правилам перехода из одной темы в другую перекрашиваем компоненты. Те из них, которые не должны перекрашиваться, маркируются с помощью android:tag или android:contentDescription . Эти компоненты не учитываются при разборе иерархии экрана.
Перекрашивать можно как перед отображением экрана (например, в onStart() у Activity ), так и при работе с ним.
Недостатки
- Требует дополнительных ресурсов, снижает производительность. Стилизация применяется после инициализации всех компонентов.
- Нужно быть внимательным к правилам перехода из одной темы в другую. Требуется учесть огромное множество правил перекраски, можно что-то забыть. Получается длинная простыня из switch — case (Java) или when (Kotlin). И в довесок требуется учесть элементы, которые не нужно красить при помощи вышеупомянутых тегов.
- Нельзя частично перекрасить в соответствии с темами. В любом правиле есть исключения, и не всегда всё в приложении делается по дизайн-системе. Непонятно, как действовать если требуется частичная перекраска некоторых элементов.
Достоинства
Не требует пересоздания Activity (это важно! Нет морганий при смене темы).
Я внедрил этот подход в одном известном всем продукте (см. скриншоты). Работает довольно быстро при простой однотипной вёрстке(в данном случае она была простая).
Стиль — локальная стилизация экрана или view, затрагивающая только отдельный экран или view. Часто такую стилизацию называют «ThemeOverlay», или «легковесная» тема, которая позволяет переопределить атрибуты основной темы).
Тема — глобальная стилизация экранов приложения, затрагивающая подмену стилей, цветов и т.д. у всего, что мы видим на экранах приложения.
Темой можно считать множество стилизаций, которые можно переключать.
Примеры
В теме могут содержаться как стили конкретных view элементов, так и конкретные цвета.
Здесь объявлен стиль для конкретной view:
Стили поддерживают явное и неявное наследование:
- Явное: Header1 унаследован от BaseTextWidget .
- Неявное: Header1.Light унаследован от Header1 .
Если к текстовому элементу мы применим стиль Header1.Light / Dark , то подтянутся стили Header1.Light / Dark и Header1 (достоинство неявного наследования)
Множественного наследования темы не поддерживают. Вероятно, из-за конфликтов одноименных атрибутов.
Стили каждого компонента дизайн-системы мы решили размещать в файлах attrs_component_name.xml (см. attrs_header1 , attrs_button и т.д.)
Стандартный конструктор view
Стандартный конструктор view предоставляет обширные средства для настройки элемента. Внешний вид элементов можно изменить через .xml-атрибуты или через определение стиля по умолчанию в стандартном конcтрукторе view.
Рассмотрим стандартный конструктор view на примере H1Component (задаёт крупный текст в шапке экранов):
Здесь attrs — атрибуты из определения .xml (в том числе кастомные атрибуты view). Они парсятся и применяются стандартным образом (см. ниже на примере FabComponent ).
defStyleAttr — стиль view по умолчанию.
context — контекст view, при помощи которого она создана.
ВАЖНО: чтобы view успешно переключала тему, необходимо чтобы она была создана при помощи контекста, унаследованного от android.view.ContextThemeWrapper (то есть контекст activity подходит, а applicationContext — не подходит (применится тема, которая подтянется из стиля, указанного в Manifest экрана).
ВАЖНО: при такой реализации главный приоритет у атрибутов, объявленных в .xml. У стилей, описанных в теме, приоритет ниже.
Интеграция стиля в компоненты дизайн системы и его связь с темой
Для поддержки темы компонентами дизайн-системы мы определяем в компонентах defStyleAttr и переключаем его в соответствии с темой, в которой он определен.
Реализация темы в приложении
Создаем две темы:
Компоненты дизайн системы системы будут тянуть этот стиль в таком ключе:
Тут определены стили каждой темы для этого элемента:
Применяем тему через стандартный механизм Android.
При создании Activity указываем нужную тему. Тогда MyBestText подтянет нужный стиль и окрасит свой текст в белый или черный в зависимости от темы (см. выше описание темы MyBestText ).
Цвета из темы мы будем разрешать прямо из .xml и подтягивать из темы.
ВАЖНО: начиная с Android 5.0 допускается отовсюду динамически разрешать android:background=»?attr/primary_background» (селекторы, shape, vector drawables и т.д.) В Android 4.4 есть ограничение на селекторы, при попытке динамически разрешить итоговый цвет из селекторов система упадёт.
При всех достоинствах такой реализации компоненты дизайн-системы не могут в preview Android Studio полноценно работать со стилизованными темами (к элементам не будут применяться стили).
Пока тема официально не использована нашими экранами, а только подключается программно (то есть стили наших activity не подгружают явным образом тему из Manifest ), мы не можем комфортно работать с элементами, поддерживающими темы в preview (их даже не будет в списке).
Тестирование компонентов дизайн-системы
Для тестирования и анализа степени покрытия приложения дизайнеры предложили разработать отладочную панель с настройками стилей компонентов, цветов и т.д.
Темы в Android являются неизменяемыми, но их всегда можно перезаписать полностью или частично через Activity.setTheme ( @StyleRes final int resid ). Так можно в нужный момент получить любую комбинацию стилей и собрать свою собственную тему. Но все стили должны быть объявлены в .xml заранее.
Программно изменять атрибут темы без отсылок к объявленным стилям, к сожалению, нельзя. По крайней мере, я не нашёл способа.
Если знаете, как подсунуть свой цвет в атрибут темы (не объявленный в ресурсах как style ), то напишите мне. Тогда мы сможем прямо из коробки манипулировать цветами с бэка на уровне стилизации всего приложения!
Делаем рабочее preview компонентов дизайн-системы в Android Studio
Темы экранов приложения должны наследоваться от темы дизайн-системы.
Preview компонентов в .xml
При некорректно установленной теме экрана компоненты дизайн-системы тоже не будут отображаться корректно (не применятся стили и цвета):
При установке темы, унаследованной от темы дизайн-системы, мы получим вот что:
Видно, как разрешились все атрибуты темы и правильно подтянулись стили компонента.
Проверка поведения компонентов в другой теме в Preview без пересборки приложения
Чтобы проверить отображение в другой теме достаточно переключить тему в Preview light/dark.
Если конкретные реализации темы завязаны на ресурсы values/values-night, то можно переключать из preview в dark mode. И всё будет работать из коробки без выставления setTheme в Activity .
Переключение тем в приложении
Переключение тем в приложении может быть завязано на системное переключение dark-mode. В таком случае темы должны быть определены в директориях values и values-night.
Если планируется три и более тем, то потребуется вручную разрешать, какую из тем поставить через activity.setTheme() .
Результаты стилизации смотрим ниже:
А как же третья тема под AB-тестом?
Как ранее говорилось, в таком случае придется вручную выставлять setTheme для применения нужной темы.
Итоги
-
У нас есть надежный механизм динамической смены тем и подстройки стилей (как в отладочной панели).
При разработке мобильных приложений зачастую возникает необходимость хранить настройки приложения (выбранную пользователем цветовую тему, пароль доступа к приложению, параметры синхронизации с сервером и т.д.). Поскольку такие задачи возникают довольно часто, в Google позаботились о разработчиках и создали механизм для быстрой и легкой реализации данного функционала. Этот механизм позволяет легко создавать, сохранять, отображать и производить разные манипуляции с настройками приложения. Мало того он позволяет автоматически создавать пользовательский интерфейс. При описании типа параметра настроек — автоматически генерируется часть пользовательского интерфейса в зависимости от типа параметра (boolean — чекбокс, String — поле ввода, . ) без написания кода. Звучит неплохо для быстрой разработки, не так ли?
Первым шагом в реализации механизма настроек приложения является наследования активности экрана вашего приложения от класса PreferenceActivity. Этот класс наследован от класса ListActivity
и позволяет создавать пользовательский интерфейс по описанию в XML файле ресурсов. Мало того, этот класс позволяет автоматически сохранять настройки в SharedPreferences незаметно для вас. SharedPreferences — интерфейс позволяющий обращаться и манипулировать данными настройки приложения вручную с помощью вызова метода getSharedPreferences из вашего Activity (подробнее Android Essentials: Application Preferences). Для того что бы увязать вместе наш класс унаследованный от PreferenceActivity и XML файл описывающий параметры конфигурации используется метод addPreferencesFromResource:
- .
- @Override
- public void onCreate ( Bundle savedInstanceState )
- super . onCreate ( savedInstanceState ) ;
- addPreferencesFromResource ( R. xml . preferences ) ;
- >
- .
-
: чекбокс, представляет параметры типа boolean. : позволяет выбирать рингтон из доступных на устройстве. URI выбранного файла рингтона будет представлен в виде строки. : строка ввода текста, представляет параметры типа String. : показывает список возможных значений параметра в виде диалога, представляет параметры типа String.
Теперь опишем, что же мы хотим видеть в нашем XML описании. У нас будет две категории. В первой разместим CheckBoxPreference который будет активировать/дезактивировать синхронизацию данных нашего гипотетического приложения и ListPreference в которым будем задавать частоту синхронизации данных. Как вы уже наверняка заметили, между этими двумя параметрами есть зависимость, если первый не выбран, то второй нужно дезактивировать. Это достигается с помощью использования атрибута android:dependency. Во второй категории мы разместим EditTextPreference с помощью которого будем задавать текст приветствия. Представим все это в виде XML:
- android:title = "First Category"
- android:key = "first_category" >
- android:key = "perform_updates"
- android:summary = "Enable or disable data updates"
- android:title = "Enable updates"
- android:defaultValue = "true"
- />
- android:key = "updates_interval"
- android:title = "Updates interval"
- android:summary = "Define how often updates will be performed"
- android:defaultValue = "1000"
- android:entries = "@array/updateInterval"
- android:entryValues = "@array/updateIntervalValues"
- android:dependency = "perform_updates"
- />
- android:title = "Second Category"
- android:key = "second_category" >
- android:key = "welcome_message"
- android:title = "Welcome Message"
- android:summary = "Define the Welcome message to be shown"
- android:dialogTitle = "Welcome Message"
- android:dialogMessage = "Provide a message"
- android:defaultValue = "Default welcome message" />
Заметьте, что для ListPreference мы указали атрибут android:entries который указывает на место хранения возможных значений списка. Эти значения хранятся в XML файле res/values/arrays.xml. Значения “updateInterval” and “updateIntervalValue” хранятся в этом файле. На самом деле это просто пары ключ-значение, ключи хранятся в первом массиве, а значения — во втором:
Добавлю еще один полезный момент, который может пригодиться. Очень часто необходимо ограничить доступ к приложению с помощью пароля или PIN кода который задается в конфигурации приложения. Очевидно что для этих целей используется EditTextPreference. Но было бы неплохо в случае пароля или PIN-кода скрывать введенные символы, а для кода еще и ограничить ввод только цифрами. Для этого можно использовать атрибуты android:password и android:inputType соответственно:
Как говорилось выше, основную часть работы берет на себя сам andriod-фреймворк. Для того чтобы показать как читать уже заданные параметры мы создадим еще одну активность экрана, которая будет запускаться из нашей главной активности. Но вначале посмотрим на код главной:
- package com.javacodegeeks.android.preferences ;
- import android.content.Intent ;
- import android.os.Bundle ;
- import android.preference.PreferenceActivity ;
- import android.view.Menu ;
- import android.view.MenuItem ;
- public class QuickPrefsActivity extends PreferenceActivity
- @Override
- public void onCreate ( Bundle savedInstanceState )
- super . onCreate ( savedInstanceState ) ;
- addPreferencesFromResource ( R. xml . preferences ) ;
- >
- @Override
- public boolean onCreateOptionsMenu ( Menu menu )
- menu. add ( Menu . NONE , 0 , 0 , "Show current settings" ) ;
- return super . onCreateOptionsMenu ( menu ) ;
- >
- @Override
- public boolean onOptionsItemSelected ( MenuItem item )
- switch ( item. getItemId ( ) )
- case 0 :
- startActivity ( new Intent ( this , ShowSettingsActivity. class ) ) ;
- return true ;
- >
- return false ;
- >
- >
Мы создали опционное меню с одним элементом MenuItem с помощью метода onCreateOptionsMenu. Когда пользователь кликает на элемент меню, мы обрабатываем это событие в методе onOptionsItemSelected и запускаем новую активность используя метод startActivity. (подробнее Using options menus and customized dialogs for user interaction, Launching new activities with intents).
Теперь создадим вторую активность ShowSettingsActivity для отображения параметров конфигурации приложения. Но вначале мы должны описать новую активность в manifest файле AndroidManifest.xml:
- package com.javacodegeeks.android.preferences ;
- import android.app.Activity ;
- import android.content.SharedPreferences ;
- import android.os.Bundle ;
- import android.preference.PreferenceManager ;
- import android.widget.TextView ;
- public class ShowSettingsActivity extends Activity
- @Override
- protected void onCreate ( Bundle savedInstanceState )
- super . onCreate ( savedInstanceState ) ;
- setContentView ( R. layout . show_settings_layout ) ;
- SharedPreferences sharedPrefs = PreferenceManager. getDefaultSharedPreferences ( this ) ;
- StringBuilder builder = new StringBuilder ( ) ;
- builder. append ( "n" + sharedPrefs. getBoolean ( "perform_updates" , false ) ) ;
- builder. append ( "n" + sharedPrefs. getString ( "updates_interval" , "-1" ) ) ;
- builder. append ( "n" + sharedPrefs. getString ( "welcome_message" , "NULL" ) ) ;
- TextView settingsTextView = ( TextView ) findViewById ( R. id . settings_text_view ) ;
- settingsTextView. setText ( builder. toString ( ) ) ;
- >
- >
Здесь мы извлекаем параметры конфигурации приложения в виде класса SharedPreferences с помощью статического метода getDefaultSharedPreferences класса PreferenceManager. Далее, в зависимости от типа данных параметра, мы используем соответствующий метод извлечения данных (например getBoolean или getString). Второй аргумент в методе извлечения данных — значение по умолчанию, на тот случай если параметр с таким именем еще не был задан. В качестве имен параметров мы используем ключи заданные в XML файле preferences.xml. Значения параметров конкатенируются и выводятся в TextView.
Вот описание простого пользовательского интерфейса для второй активности:
Давайте запустим приложение, мы увидим список наших параметров:
Кликаем на “Updates Interval” и видим список возможных значений:
Кликаем на “Welcome Message” и видим редактирование текста приветствия:
Посмотрим на заданные параметры. Кликнете на кнопке меню и выберете единственный элемент “Show current settings”. Запуститься вторая активность в которой мы увидим значения наших параметров конфигурации:
Android — это операционная система с широким спектром всевозможных настроек, которые вы можете менять по своему усмотрению. Причём люди обычно бросаются из одной крайности в другую. Одни предпочитают изменить вообще всё в своём устройстве, перепрошивая его на новую прошивку. А другие им в противовес в лучшем случае ограничиваются только сменой рисунка рабочего стола, да мелодии входящих вызовов. Однако есть и промежуточные варианты, о которых мы сегодня поговорим.
Не забудьте включить все настройки, перечисленные ниже
Как включить меню разработчика на Андроид
Первым делом я бы включил меню разработчика. Там скрывается множество параметров, изменение которых может улучшить работу вашего смартфона. Чего только стоит увеличение скорости запуска приложений, о котором вы рассказывали по этой ссылке. А ведь это даже не вершина, а чайка, сидящая на вершине айсберга.
Включается меню разработчика не самым логичным способом:
- Перейдите в «Настройки» и выберите «О телефоне»;
- Пролистайте вниз до строчки «Номер сборки»;
Меню разработчика включается не самым логичным способом
- Быстро-быстро нажимайте на неё 10 раз подряд;
- После этого появится вкладка для разработчиков.
Геолокация в приложении — как настроить
Службы геолокации — это одно из средств слежки, которым могут пользоваться разработчики приложений. Поэтому лучше всего не давать им такой возможности лишний раз. В Android 12 пользователям позволили предоставлять приложениям только приблизительное местоположение, а в более ранних версиях доступен механизм однократного предоставления текущей геоточки.
Дать нужное разрешение проще всего после установки нового приложения. Когда оно запросит доступ к вашей геолокации, просто укажите, что разрешаете его исключительно в моменты использования. Но отозвать можно и уже данную привилегию:
- Перейдите в «Настройки» и выберите «Приложения»;
- Тут найдите и откройте вкладку «Диспетчер прав»;
Не давайте приложениям неограниченный доступ к геолокации
- Найдите нужное вам приложение и откройте его;
- В открывшемся окне измените данное разрешение.
Не скачивается APK. Что делать
Вопреки уверениям Google, в установке APK-версий приложений нет ничего опасного. Главное — с осторожностью подбирать софт, который вы скачиваете. Но скачать его просто так не получится. По умолчанию Android блокирует загрузку софта из ненадёжных — как он его называет — источников.
Значит, нужно снять это ограничение принудительно:
- Перейдите в «Настройки» и выберите «Безопасность»;
- Откройте «Загрузка приложений из ненадёжных источников»;
По умолчанию загрузка APK заблокирована
Обмен с окружением — как включить
Пользователи Android издавна завидовали владельцам iPhone из-за функции AirDrop. Благодаря ей устройства Apple могли передавать между собой данные на сверхвысокой скорости, задействуя сразу и Wi-Fi, и Bluetooth. С некоторых пор такая функция появилась и на Android под названием «Обмен с окружением».
Правда, чтобы она заработала, её, как и почти всё на Android, нужно включать вручную:
- Перейдите в «Настройки» и выберите «Google»;
- Найдите вкладку «Обмен с окружением» и откройте;
Обмен с окружением — это аналог AirDrop для Android
Как включить резервное копирование на Android
Резервное копирование — важнейшая функция Android, которой многие почему-то пренебрегают. А, между тем, благодаря ей вы сможете восстановить все свои данные, если с вашим смартфоном что-то пойдёт не так. Например, вы превратите его в кирпич во время процедуры получения рут-прав или в результате неудачной перепрошивки.
- Перейдите в «Настройки» и откройте раздел Google;
- В открывшемся окне выберите «Система и обновления»;
Без резервного копирования вы не восстановите данные, если что-то пойдёт не так
- Откройте «Резервное копирование» и включите функцию;
- Укажите аккаунт Google для сохранения копий в облако.
Как включить 60 герц на Андроид
Частота обновления экрана — это уже не новый термин для большинства пользователей. Он означает, с какой скоростью картинки на экране сменяют друг друга. Стандартом для всех новых устройств является 120 Гц, но и на 60 Гц аппараты чувствуют себя неплохо. Тем более, что увеличенная частота обновления потребляет больше ресурсов.
120 Гц — это эталон 2021 года, но включать этот режим не стоит
Поэтому нужно по умолчанию включить для смартфона режим 60 Гц:
- Перейдите в «Настройки» и выберите «Дисплей»;
- В открывшемся окне выберите «Частота обновления»;
- Выберите параметр «60 Гц» и установите галку напротив него;
- С этого момента все приложения и система будут работать на 60 Гц.
Некоторые смартфоны предлагают активировать адаптивный режим, чтобы частота менялась сама в зависимости от выполняемых задач. Но практика показывает, что рассмотреть разницу между увеличенной и стандартной частотой так, чтобы действительно её почувствовать, довольно сложно. Так что в этом просто нет никакого смысла.
Свободное общение и обсуждение материалов
Сейчас уже всем стало понятно, что будущее камеры в смартфонах стоит не за внедрением супер крутых линз и кучи разных сенсоров, а за алгоритмами постобработки. Во-первых, так дешевле, ибо не надо тратить много денег на оптику, а во-вторых, производительности даже бюджетных телефонов вполне хватит, чтобы по итогу выдать годную картинку. Google эту фишку уже давно просекла и создала отдельное приложение Google Camera. Кадры снятые через эту программу по своему качеству на порядок опережают снимки, сделанные с помощью стандартного софта от производителя. Однако даже Google Камера имеет свои недостатки. Сегодня хотелось бы поговорить об одной фишке камеры, которая просто обязана перекочевать во все современные устройства.
В последнее время мне кажется, что пользователи сильно обленились. Большинство из нас перестали копаться в настройках, подгонять аппарат конкретно под свои задачи и тому подобное. Оно и не удивительно, ведь обычно все великолепно работает уже в магазине. Но посмотрите на ситуацию с другой стороны: вам достаточно лишь включить пару тумблеров и телефон обретет вторую жизнь. Причем я даже не говорю об установке root-прав на Android. Все намного проще: достаточно лишь узнать о том, как поделиться Wi-Fi с гостями или раздать интернет на компьютер.
Читайте также: