view android studio что это
Android. Собеседование #4. UI в приложении
1. Что такое View?
View это базовый класс для создания элементов пользовательского интерфейса в Android приложении. Представляет из себя прямоугольную область и отвечает за обработку событий (например клика по экрану) и их отображение. UI элементы являются наследниками класса View, например Button, TextView и т.д. Обязательными параметрами у элементов являются ширина android:layout_width и высота android:layout_height.
2. Что такое ViewGroup?
ViewGroup это класс, который наследуется от View. Представляет собой контейнер, предназначенный для хранения в себе других элементов View, например несколько Button и ImageView. Является базовым классом для контейнеров UI элементов, таких как LinearLayout, ConstraintLayout, RecyclerView и т.д.
В примере выше подкласс ViewGroup – контейнер LinearLayout, который содержит в себе несколько наследников класса View – TextView и Button.
У любого объекта может быть связанный с ним целочисленный идентификатор, который служит для обозначения уникальности объекта View в иерархии.
3. Что такое XML?
Extensible Markup Language (XML) – это язык разметки, предназначенный для структурирования, хранения и передачи информации. Язык имеет свой базовый синтаксис, благодаря которому можно размечать текст при помощи обрамляющих тегов, превращая каждое слово или предложение в идентифицируемую, сортируемую информацию. Язык XML не имеет предопределенных тегов.
4. Виды разметки в Android?
В Android SDK имеется несколько типов контейнеров, позволяющие располагать элементы пользовательского интерфейса различными способами. Разметку можно создавать как программно, так и при помощи редактора XML файлов в Android Studio.
Один макет может содержать один или несколько вложенных макетов, но рекомендуется использовать как можно более простую иерархию макетов. Чем меньше в макете вложенных элементов, тем быстрее выполняется его отрисовка, горизонтальная иерархия представлений эффективнее вертикальной.
Основные виды разметки:
– LinearLayout
Разметка, в которой элементы располагаются цепочкой поочередно. При указании параметра android:orientation=”vertical” View элементы располагаются друг под другом вертикально. При указании параметра android:orientation=”horizontal” View элементы располагаются друг за другом горизонтально.
– FrameLayout
Разметка, в которой элементы прикрепляются к верхнему левому углу экрана и их местоположение нельзя изменить. При добавлении нескольких элементов в FrameLayout они будут рисоваться поверх предыдущих, если их размеры совпадают, либо частично перекрывать друг друга.
– ReiativeLayout
Разметка, в которой элементы располагаются относительно родительского компонента или относительно соседних View элементов (по идентификатору элемента).
– ConstraintLayout
Разметка, схожая по принципу с RelativeLayout. У каждого View элемента есть линии, на основании которых View располагается внутри ConstraintLayout. Эти линии (constraints) могут быть привязаны к сторонам самого ConstraintLayout или к сторонам других View внутри ConstraintLayout
– TableLayout
Разметка, в которой элементы располагаются в табличной форме со строками и столбцами. Внутри TableLayout необходимо создавать элементы TableRow, которые будут являться строками и выстраиваться вертикально. Внутри TableRow можно размещать другие элементы, которые будут выстраиваться горизонтально. TableLayout не отображает разделительных линий для их строк, столбцов и ячеек, их необходимо реализовывать самостоятельно. Может иметь строки с разным количеством ячеек.
5. Как создать собственный View элемент?
Есть несколько способов для создания кастомного View:
– Расширить стандартный Android элемент
Например, нам не хватает стандартных возможностей такого View элемента, как Button. Для расширения возможностей мы создаём свой класс и наследуемся от класса android.widget.Button. После чего мы можем переопределять своё поведение для View элемента.
– Наследовать класс от класса View
Данный способ предоставляет нам возможность нарисовать свой собственный UI элемент, наполнить его логикой обработки событий нажатия и т.д.
Рассмотрим методы жизненного цикла View в Android
– Constructor
Создание View начинается с конструктора, с различными входными параметрами, такими как Context, AttributeSet, defStyleAttr и defStyleRes.
– onAttachToWindow()
После вызова данного метода, наша View прикрепляется к нашему Activity и знает о других элементах, которые также находятся на этом экране.
– onMeasure()
Метод определяет ширину и высоту вашего View, подтягивая данные из layout файла. При переопределении данного метода, необходимо указать ширину и высоту Вашего View самостоятельно, используя метод setMeasuredDimension().
– onLayout()
Определяет размер и положение элементов каждого дочернего элемента View, если они имеются.
– onDraw()
Метод отвечает за рисование различных элементов внутри нашего View. Входным параметром метода является объект Canvas, при помощи которого мы и создаем элементы, такие как круг, текст, изображение и т.д.
Для обновления визуальной части нашего View, используется метод invalidate(). Например, мы нарисовали квадрат, и хотим изменить его цвет. Для этого мы вызываем метод invalidate() после чего у нашего View вызывается метод onDraw() и происходит перерисовка нашего квадрата с новым цветом.
В случае, если у нашего View были изменены размеры, необходимо вызвать метод requestLayout(), после которого последует вызов методов, согласно жизненному циклу нашего View, т.е. onMeasure() → onLayout() → onDraw().
Рисование собственных представлений (View) в Android
Получите полный контроль над представлением и оптимизируйте его производительность
В преддверии старта курса «Android Developer. Professional» приглашаем всех желающих принять участие в открытом вебинаре на тему «Пишем gradle plugin».
А пока делимся переводом полезного материала.
Введение
Разработчики постоянно проектируют различные виды пользовательских интерфейсов с помощью XML, но в дополнение к этому можно довольно легко освоить создание собственных представлений, которые открывают новые преимущества и позволяют избежать повторного использования шаблонного кода.
В Android доступен широкий набор готовых виджетов и макетов для создания пользовательского интерфейса, однако они не могут удовлетворить все требования наших приложений. И здесь на помощь приходит возможность создания собственных представлений. Создав собственный подкласс представления, можно получить максимально полный контроль за внешним видом и функционалом экранного элемента.
Прежде чем приниматься за работу с собственными представлениями, полезно изучить жизненный цикл представления.
Зачем создавать собственные представления?
Чтобы реализовать собственное представление, в большинстве случаев понадобится больше времени, чем если использовать обычные представления. Создавать собственные представления стоит лишь в том случае, если нет другого, более простого способа реализовать нужную вам возможность или если у вас есть какие-либо из указанных ниже проблем, которые можно устранить за счет создания собственного представления.
Производительность: в вашем макете много представлений и вы хотите оптимизировать их, нарисовав одно, более легкое собственное представление.
Имеется сложная иерархия представлений, которую трудно использовать и поддерживать.
Необходимо создать специализированное представление, требующее рисования вручную.
Общий подход
Чтобы приступить к созданию компонентов для реализации собственных представлений, необходимо выполнить следующие основные шаги.
Создать класс, расширяющий базовый класс или подкласс представления.
Реализовать конструкторы, использующие атрибуты из XML-файла.
Переопределить некоторые методы родительского класса (onDraw(), onMeasure() и т. д.) в соответствии с нашими требованиями.
После выполнения этих шагов созданный расширяющий класс можно использовать вместо представления, на основе которого он был создан.
Пример
В одном из моих проектов мне нужно было создать круглый виджет TextView для отображения количества уведомлений. Чтобы достичь этой цели, нужно создать подкласс TextView.
Шаг 2. Расширим класс виджета TextView. Здесь под TextView в IDE выдается ошибка, в которой сообщается, что у этого типа есть конструктор и он должен быть инициализирован.
Шаг 3. Добавим конструкторы в класс.
Это можно сделать двумя способами.
Первый способ добавления конструкторов в класс показан ниже.
Другой способ заключается в добавлении аннотации @JvmOverloads к вызову конструктора, как показано ниже.
Часто нас сбивает с толку то, что у представления есть несколько разных типов конструкторов.
View(Context context)
Простой конструктор для динамического создания представления из программного кода. Здесь параметр context — это контекст, в котором работает представление и через который можно получить доступ к текущей теме, ресурсам и т. д.
View(Context context, @Nullable AttributeSet attrs)
Шаг 4. Самый важный шаг в отрисовке собственного представления — это переопределение метода onDraw() и реализация необходимой логики отрисовки внутри этого метода.
Метод OnDraw (canvas: Canvas?) имеет параметр Canvas (холст), с помощью которого компонент представления может отрисовывать себя. Для рисования на холсте необходимо создать объект Paint.
Как правило, процесс рисования определяется двумя аспектами:
что рисовать (определяется объектом Canvas);
как рисовать (определяется объектом Paint).
Например, Canvas предоставляет метод для рисования линии, а Paint предоставляет методы для определения цвета этой линии. В нашем случае объект Canvas в классе CircularTextView предоставляет метод для рисования окружности, а объект Paint заполняет ее цветом. Проще говоря, Canvas определяет, какие фигуры можно нарисовать на экране, а Paint определяет свойства нарисованных фигур — цвет, стиль, шрифт и т. д.
Давайте займемся кодом. Мы создаем объект Paint и присваиваем ему некоторые свойства, а затем рисуем фигуру на холсте (объект Canvas), используя наш объект Paint. Метод onDraw() будет выглядеть так:
Шаг 5. Мы закончили с рисованием. Теперь давайте внесем этот класс представления в XML.
Добавьте этот XML-макет в вашу активность (Activity) и запустите приложение. Вот что будет на экране.
Выглядит неплохо, правда? Теперь сделаем так, чтобы значение динамическому свойству цвета в circlePaint назначалось из активности, а также добавим контур к кружку. Для этого в классе CircularTextView необходимо создать несколько методов-сеттеров, чтобы можно было вызывать эти методы и устанавливать свойства динамически.
Для начала давайте реализуем настройку цвета отрисовки. Для этого создадим сеттер, как показано ниже.
Теперь мы можем устанавливать цвет из нашей активности динамически, вызывая этот метод.
Теперь в активности можно динамически настраивать эти атрибуты нужным образом.
Далее давайте запустим приложение, устанавливая различные цвета для нашего виджета.
Итак, теперь стало ясно, как динамически устанавливать свойства из активности, но возникает вопрос о том, как устанавливать атрибуты из XML. Продолжим наше исследование.
Для начала создадим файл с именем attrs.xml в папке values. Этот файл будет содержать все атрибуты для различных представлений, которые мы создаем сами. В приведенном ниже примере у нашего представления под названием CircularTextView имеется атрибут ct_circle_fill_color , который принимает значение цвета. Аналогичным образом мы можем добавить и другие атрибуты.
Затем нам нужно будет прочитать эти свойства в классе, который мы создали для реализации собственного представления. В блоке инициализации мы считываем набор атрибутов, как показано ниже.
Теперь просто переходим к XML-макету и устанавливаем значение свойства, соответствующее нужному цвету, после чего запускаем приложение. На выходе мы увидим нужный результат.
В моем случае результат был таким:
Примечание. При рисовании не задавайте жестко размер вашего представления, так как им могут воспользоваться другие разработчики с применением других размеров. Рисуйте представление в соответствии с его текущим размером.
Обновление представления
Итак, мы задали собственное представление. Если мы хотим обновлять представление при изменении какого-нибудь свойства или по какой-то другой причине, этого можно добиться двумя основными способами.
invalidate()
invalidate() — это метод, который инициирует принудительную перерисовку определенного представления. Проще говоря, метод invalidate() следует вызывать в случае, когда требуется изменение внешнего вида представления.
requestLayout()
Если в какой-то момент происходит изменение состояния представления, то метод requestLayout() сообщает системе представлений, что необходимо сделать перерасчет фаз «измерение» (Measure) и «макет» (Layout) для данного представления (измерение → макет → рисование). Проще говоря, метод requestLayout() следует вызывать в случае, когда требуется изменение границ представления.
Теперь, я надеюсь, вы знаете в общих чертах, как создавать собственные представления. Чтобы они демонстрировали отличную производительность, необходимо освоить все описанные здесь методы.
Пользовательский интерфейс. View, основные атрибуты
Пользовательский интерфейс
Любое приложение отображает пользователю графический интерфейс. На картинке ниже вы можете увидеть примеры текстовых элементов ( TextView ), кнопок ( Button ), картинок ( ImageView ).
Вы можете работать с макетами двумя способами:
XML синтаксис
XML – язык разметки, определяющий теги (элементы) и их атрибуты. Язык очень похож на HTML. Давайте разберём на примере.
После открытия тега, его обязательно надо закрывать. Это можно сделать используя конструкцию (в примере – ).
У элемента могут быть вложенные элементы:
Пример макета
При запуске приложения макет будет выглядеть так:
Связь XML и Java кода
Метод onCreate() вызывается Android системой во время загрузки приложения (эту тему рассмотрим подробнее в следующих уроках).
XML Атрибуты
Каждый объект View и ViewGroup поддерживает множество атрибутов XML.
Атрибут android:text
Атрибут android:text отвечает за текст, который будет отображаться на экране:
Обязательные атрибуты android:layout_width, android:layout_height
У любого View компонента необходимо объявить атрибуты android:layout_width (русс. ширина макета), android:layout_height (русс. высота макета), иначе приложение не скомпилируется.
Существует три варианта указания ширины и высоты:
В данном случае при размере wrap_content TextView занимает столько же места, сколько и текст в нём. Вы можете изменить текст, чтобы убедиться, что размер текста и элемента TextView будут совпадать.
Вы могли заметить, что в примере мы использовали атрибуты android:background (русс. цвет фона), android:marginTop (русс. отступ сверху), android:textColor (русс. цвет текста), android:textSize (русс. размер текста) для наглядности. Сейчас мы рассмотрим эти атрибуты детальнее.
Атрибут android:textSize
Атрибут android:textSize отвечает за размер текста, как вы догадались. Разберём на примере:
Размер текста нужно указывать в единицах sp (Scale-independent Pixels). Отличие от dp состоит в том, что этот размер изменяется в зависимости от настроек размера шрифта в телефоне. В Android системе у пользователя есть возможность в настройках изменить шрифт в своём телефоне на крупный, средний или маленький. Чтобы текст в приложении автоматически изменился вместе с этой настройкой рекомендуется использовать единицы sp для текста.
Атрибут android:background
Цвет задаётся в формате ARGB. Это аббревиатура расшифровывается, как Alpha Red Green Blue. Дело в том, что любой цвет можно получить из сочетания в разной степени 3 цветов: красного, зелёного и синего. Также цвета могут быть прозрачными, именно это обозначает слово Alpha.
Чтобы задать цвет мы указываем символ # и 3 байта в шестнадцатеричной системе, которые отвечают за каждый цвет. Первый байт отвечает за красный цвет, второй – за зелёный, третий – за синий.
Атрибут android:textColor
Атрибут android:textColor похож на атрибут android:background только он задаёт цвет текста:
Атрибут android:textStyle
Атрибут android:textStyle отвечает за стиль текста. Его возможные значения:
Атрибут android:id
Атрибут android:id у View позволяет работать с ней из Java кода и ссылаться на эту View внутри макета. Покажем на примере работы с View элементом из Java кода:
В результате увидим, что отобразился тот текст, который мы указали из Java кода:
Атрибуты android:padding, android:layout_margin
Рассмотрим атрибуты, которые задают отступы элементов:
В xml коде они указываются так:
Можно сделать тоже самое, указывая отступы со всех сторон явно:
Атрибуты android:gravity, android:layout_gravity
Атрибуты android:gravity и android:layout_gravity отвечают за выравнивание. Ключевое отличие состоит в том, что android:gravity отвечает за выравнивание содержимого внутри элемента, а layout_gravity отвечает за выравнивание элемента относительно родительского контейнера. Разберём на примере:
Также у этого атрибута могут быть другие значения, которые указывают, как именно выровнять элемент. Перечислим основные из них: top, bottom, start, end, center, center_horizontal, center_vertical
Верите или нет, профессиональные разработчики не запоминают всё – поиск информации является ключевой частью работы. Поэтому не пытайтесь запомнить все View объекты и атрибуты сразу. Google сделал специальный словарь, в котором вы можете найти тот компонент, атрибут или класс, который вам необходим.
Заключение
Сегодня вы познакомились с пользовательским интерфейсом в Android системе. Теперь вы знаете язык XML и основные компоненты пользовательского интерфейса, а также их атрибуты. Информации было много, поэтому это нормально, если вы её не запомнили. При необходимости в следующих уроках вы сможете возвращаться к этому уроку, как к справочнику. Скорее выполняйте практические задания к этому уроку, чтобы набить руку и создать первый макет реального приложения!
Palette
На панели Palette находятся компоненты пользовательского интерфейса: View, Layouts, ViewGroup.
Виджет — это объект View, который служит интерфейсом для взаимодействия с пользователем. Если сказать предыдущую умную фразу простым языком, понятным даже коту, то виджеты — это обычные элементы управления: кнопочки, текстовые поля, флажки, переключатели, списки.
Кстати, в последних версиях Android Studio в режиме Design появилась панель Component Tree, хотя раньше в Eclipse аналогичная вкладка называлась Outline. Видимо, разработчики из Гугла читали эту статью и внесли поправки.
Стандартные элементы имеют привычные свойства: ширина, высота, цвет и т.п.
Другие настройки могут сбить с толку других программистов, поэтому не изощряйтесь в остроумии.
У компонентов также есть атрибут android:tag, который можно использовать для хранения каких-то промежуточных данных. Также можно устанавливать теги программно. Напишем надуманный пример:
Наложение двух компонентов
Вы можете использовать не только положительные, но и отрицательные значения для атрибута layout_marginBottom или родственных ему. При этом можно наблюдать эффект, когда следующий компонент будет «наезжать» на ваш компонент.
Идентификаторы
Те компоненты, к которым вы будете обращаться в коде, нужно обязательно присваивать идентификаторы. Кроме того, они помогут сохранить состояние при поворотах: текст в текстовых полях, статус переключателей и т.д.
Tooltip (Подсказка)
В Android 8.0 (API 26) у View появилась возможность присвоить компоненту подсказку, которая появляется при долгом нажатии или при прохождении курсора мыши (бывает и такое).
Подсказку можно установить через XML-атрибут.
Можно установить подсказку программно, а также получить текст.
v.3.4-3.1
В версии 3.2 добавили ChipGroup, Chip, BottomAppBar. В версии 4.1 появился новый раздел Helpers. В версии 4.2 список компонентов снова изменился.
View-элементы
Первое понятие, необходимое для работы с Android — это представления (или View-элементы).
Базовые элементы Views курс Android Basics
Знакомство и подробное рассмотрение типов элементов Views в Android. Элемент View — первое понятие, которое необходимо для начала работы
Дата загрузки: 2017-06-16T12:04:00
«Верблюжий стиль» (Camel case) — это соглашение, распространенное не только в программировании. Он встречается при использовании FedEx, прослушивании iPod, создании PowerPoint, и даже в McDonalds!
В этом уроке было много новых слов:
Макет | Layout |
Пользовательский интерфейс | User Interface |
Текстовое поле | TextView |
Картинка | ImageView |
Кнопка | Button |
Верблюжий стиль | Camel case |
Не бойтесь, их не нужно запоминать. Их можно отыскать в любой момент, перейдя по этой ссылке. Хотите верьте, хотите нет, но профессиональные разработчики не зубрят все подряд, для них поиск информации — один из ключевых навыков. Эти понятия всегда можно подсмотреть в Словаре терминов.
Свои ответы и вопросы можете оставлять в комментариях.