MyTetra Share
Делитесь знаниями!
Макеты и виджеты
14.04.2017
10:41
Раздел: Android - books - AndroidProgramming2e - 8 Макеты и виджеты

 dp (или dip) — сокращение от «density-independent pixel» (пикселы, не зависящие от

плотности); произносится «дип». Обычно эти единицы используются для полей,

отступов и всего остального, для чего обычно задаются размеры

в пикселах. На экранах с более высокой плотностью единицы dp разворачиваются

в большее количество экранных пикселов. Одна единица dp всегда равна

1/160 дюйма на экране устройства. Размер будет одинаковым независимо от

плотности пикселов.


 sp — сокращение от «scale-independent pixel» (пикселы, не зависящие от масштаба).

Эти единицы, не зависящие от плотности пикселов устройства, также

учитывают выбранный пользователем размер шрифта. Единицы sp почти всегда

используются для назначения размера текста.


 pt, mm, in — масштабируемые единицы (как и dp), позволяющие задавать размеры

интерфейсных элементов в пунктах (1/72 дюйма), миллиметрах или

дюймах. Тем не менее мы не рекомендуем их использовать: не все устройства

правильно настроены для правильного масштабирования этих устройств.

На практике и в этой книге почти исключительно используются только единицы

dp и sp. Android преобразует эти значения в пикселы во время выполнения.


Параметры макета


Вероятно, вы уже заметили, что некоторые имена атрибутов начинаются

с layout_ (android:layout_marginLeft), а у других атрибутов этого префикса нет

(android:text).

Атрибуты, имена которых не начинаются с layout_, являются рекомендациями

для виджетов. При заполнении виджет вызывает метод для настройки своей

конфигурации на основании этих атрибутов и их значений.

Если имя атрибута начинается с layout_, то этот атрибут является директивой для

родителя этого виджета. Такие атрибуты, называемые параметрами макета,

сообщают родительскому макету, как следует расположить дочерний элемент внутри родителя.

Даже если объект макета (например, LinearLayout) является корневым элементом,

он все равно остается виджетом, имеющим родителя, и у него есть параметры

макета. Определяя элемент LinearLayout в файле fragment_crime.xml, мы задали

атрибуты android:layout_width и android:layout_height. Эти атрибуты будут

использоваться родительским макетом LinearLayout при заполнении.

В данном случае параметры макета LinearLayout будут использоваться элементом FrameLayout

в представлении содержимого CrimeActivity


Поля и отступы

В файле fragment_crime.xml виджетам назначаются атрибуты margin и padding.

Начинающие разработчики иногда путают эти атрибуты, определяющие

соответственно поля и отступы. Теперь, когда вы понимаете, что такое параметр макета, будет

проще объяснить, чем они различаются. Атрибуты margin являются параметрами

макета; они определяют расстояние между виджетами. Так как виджет располагает

информацией только о самом себе, за соблюдение полей отвечает родитель виджета.

Напротив, отступ не является параметром макета. Атрибут android:padding сообщает

виджету, с каким превышением размера содержимого он должен прорисовывать

себя.


Как работает android:layout_weight

Атрибут веса android:layout_weight сообщает виджету LinearLayout, как он

должен распределить потомков по размеру контейнера. Обоим виджетам заданы

одинаковые значения ширины, но это не гарантирует, что они будут иметь

одинаковую ширину на экране. Для определения ширин дочерних представлений

LinearLayout использует комбинацию параметров layout_width и layout_weight.

LinearLayout вычисляет ширину представления в два прохода. На первом

проходе LinearLayout проверяет значение layout_width (или layout_height для вертикальной

ориентации). Значение layout_width как для Button, так и для CheckBox

теперь равно wrap_content, так что каждому представлению выделяется место,

достаточное только для его прорисовки


В качестве весового коэффициента может использоваться любое вещественное

число. Программисты используют разные системы обозначений весов. В файле

fragment_crime.xml используется система «рецепт коктейля». Также часто

применяются наборы весов, сумма которых составляет 1.0 или 100; в этом случае вес

кнопки в приведенном примере составит 0.66 или 66 соответственно.


Если виджет присутствует в одном макете и отсутствует в другом,

то для проверки его наличия в текущей ориентации перед вызовом

методов следует использовать проверку null:

Button landscapeOnlyButton = (Button)v.findViewById(R.

id.landscapeOnlyButton);

if (landscapeOnlyButton != null) {

// Операции

}

Так же в этом разделе:
 
MyTetra Share v.0.52
Яндекс индекс цитирования