- Что означает android: layout_weight?
- Вычисление для назначения любого оставшегося пространства между дочерним
- Пример 1
- Пример 2
- теория
- Расположение
- дополнительный
- Как установить атрибут layout_weight динамически из кода?
- TextView
- Программная установка текста
- Атрибуты
- Программная установка фона
- Реагируем на событие onClick
- Многострочный текст
- Увеличиваем интервалы между строками
- Бой с тенью
- Создание ссылок автоматом
- Совет: Используйте полупрозрачность с умом
- Выделить текст для копирования
Что означает android: layout_weight?
Я не понимаю, как использовать этот атрибут. Может ли кто-нибудь рассказать мне больше об этом?
С layout_weight вы можете указать соотношение размеров между несколькими видами. Например, у вас есть MapView и table которая должна отображать некоторую дополнительную информацию на карте. Карта должна использовать 3/4 экрана, а таблица должна использовать 1/4 экрана. Затем вы установите для layout_weight map значение 3 и layout_weight таблицы layout_weight 1.
Для его работы вам также необходимо установить высоту или ширину (в зависимости от вашей ориентации) до 0px.
layout_weight , layout_weight определяет, сколько лишнего места в макете будет выделено для представления.
LinearLayout поддерживает присвоение веса отдельным детям. Этот атрибут присваивает значение «важность» для представления и позволяет ему расширяться для заполнения любого оставшегося пространства в родительском представлении. Просмотров ‘по умолчанию равен нулю.
Вычисление для назначения любого оставшегося пространства между дочерним
В общем, формула:
Пространство, назначенное ребенку = (индивидуальный вес ребенка) / (сумма веса каждого ребенка в линейной компоновке)
Пример 1
Если есть три текстовых поля, а два из них объявляют вес 1, а третий не имеет веса (0), то оставшееся пространство присваивается следующим образом:
1-й текстовый блок = 1 / (1 + 1 + 0)
2-й текстовый блок = 1 / (1 + 1 + 0)
3-й текстовый блок = 0 / (1 + 1 + 0)
Пример 2
Допустим, у нас есть текстовая метка и два элемента редактирования текста в горизонтальной строке. Метка не имеет layout_weight , поэтому он занимает минимальное пространство, необходимое для рендеринга. Если layout_weight каждого из двух элементов редактирования текста установлен в 1, оставшаяся ширина в родительском макете будет разделена поровну между ними (потому что мы утверждаем, что они одинаково важны).
2-й текстовый блок = 1 / (0 + 1 + 1)
3-й текстовый блок = 1 / (0 + 1 + 1)
Если вместо этого в первом текстовом поле есть layout_weight из 1, а во втором текстовом поле есть layout_weight из 2, то одна треть оставшегося пространства будет передана первой, а две трети – второй (потому что мы утверждаем, что Более важным является второй).
2-й текстовый блок = 1 / (0 + 1 + 2)
3-й текстовый блок = 2 / (0 + 1 + 2)
Добавив к приведенным выше ответам, самое главное, чтобы заставить это работать, – установить ширину (или высоту) макета в 0px
Иначе вы увидите мусор
layout_weight сообщает Android о том, как распространять ваши View в LinearLayout . Затем Android вычисляет общую пропорцию, необходимую для всех View s, которые имеют заданный вес, и помещает каждый View зависимости от того, какая часть экрана, который она указала в нем. В следующем примере Android видит, что у TextView есть layout_weight из 0 (это значение по умолчанию), а у EditText s есть layout_weight по 2 каждый, в то время как Button имеет вес 1 . Таким образом, Android выделяет достаточно места для отображения tvUsername и tvPassword а затем делит оставшуюся часть ширины экрана на 5 равных частей, две из которых выделены для etUsername , две для etPassword и последняя часть для bLogin :
Это выглядит как:
а также
Если есть несколько видов, охватывающих LinearLayout , то layout_weight дает им каждый пропорциональный размер. Вид с большим значением layout_weight «весит» больше, поэтому он получает больше места.
Вот изображение, чтобы сделать вещи более ясными.
теория
Термин макет веса относится к концепции взвешенного среднего значения в математике. Это как в классе колледжа, где домашнее задание стоит 30%, посещаемость стоит 10%, средний срок стоит 20%, а финал стоит 40%. Ваши баллы для тех частей, когда они взвешены вместе, дают вам общую оценку.
Это одинаково для макета макета. Views в горизонтальном LinearLayout могут принимать определенный процент от общей ширины. (Или процент от высоты для вертикального LinearLayout .)
Расположение
LinearLayout который вы используете, будет выглядеть примерно так:
Обратите внимание, что вы должны использовать layout_width=»match_parent» для LinearLayout . Если вы используете wrap_content , это не сработает. Также обратите внимание, что layout_weight не работает для просмотров в RelativeLayouts (см. Здесь и здесь для SO-ответов, касающихся этой проблемы).
Каждый вид в горизонтальном LinearLayout выглядит примерно так:
Обратите внимание, что вам нужно использовать layout_width=»0dp» вместе с layout_weight=»1″ . Забыть это вызывает много новых проблем пользователей. (См. Эту статью для разных результатов, которые вы можете получить, не устанавливая ширину в 0.) Если ваши представления находятся в вертикальном LinearLayout вы, LinearLayout будете использовать layout_height=»0dp» .
В примере Button выше я устанавливаю вес в 1, но вы можете использовать любое число. Это имеет значение только общее. Вы можете видеть в трех строках кнопок первого изображения, которое я разместил, цифры все разные, но, поскольку пропорции одинаковы, взвешенная ширина не изменяется в каждой строке. Некоторым людям нравится использовать десятичные числа, которые имеют сумму 1, так что в сложной схеме ясно, какой вес каждой части.
Последнее замечание. Если у вас много вложенных макетов, которые используют layout_weight , это может быть плохо для производительности.
дополнительный
Вот макет xml для верхнего изображения:
Подумайте так, будет проще
Если у вас есть 3 кнопки, и их вес составляет 1,3,1 соответственно, он будет работать как таблица в формате HTML
Предоставьте 5 частей для этой линии: 1 часть для кнопки 1, 3 для кнопки 2 и 1 для кнопки 1
Одним из лучших объяснений для меня был этот (из учебника Android, посмотрите на шаг 7) :
Layout_weight используется в LinearLayouts для назначения «важности» Views в макете. Все представления имеют макет по умолчанию default_weight, что означает, что они занимают только столько места на экране, сколько необходимо отобразить. При назначении значения выше нуля будет разделяться остальная часть доступного пространства в родительском представлении в соответствии со значением каждого макета view_weight View и его отношением к общему макету, указанному в текущем макете для этого и других элементов View.
Чтобы привести пример: допустим, у нас есть текстовая метка и два элемента редактирования текста в горизонтальной строке. Метка не имеет указателя макета, поэтому он занимает минимальное пространство, необходимое для рендеринга. Если layout_weight каждого из двух элементов редактирования текста установлен в 1, оставшаяся ширина в родительском макете будет разделена поровну между ними (потому что мы утверждаем, что они одинаково важны). Если первый имеет layout_weight из 1, а второй имеет layout_weight из 2, то одна треть оставшегося пространства будет передана первой, а вторая третья – второй (потому что мы утверждаем, что вторая важнее).
Layout_weight определяет, сколько пространства элемент управления должен получить соответственно другим элементам управления.
Объединяя оба ответа от
Flo & rptwsthi и roetzi,
Не забудьте изменить layout_width=0dp/px , иначе поведение layout_weight будет действовать обратным образом, при этом наибольшее число заняло наименьшее пространство, а самое низкое число заняло самое большое пространство.
Кроме того, некоторая комбинация весов приведет к тому, что некоторая компоновка не может быть показана (так как она заняла пространство).
Как следует из названия, вес макета определяет, какое количество или процент пространства занимает определенное поле или виджет, занимающий пространство экрана.
Если мы укажем вес в горизонтальной ориентации, тогда мы должны указать layout_width = 0px .
Аналогично, если мы укажем вес в вертикальной ориентации, тогда мы должны указать layout_height = 0px .
Источник
Как установить атрибут layout_weight динамически из кода?
Как я могу установить значение атрибута layout_weight для кнопки в android динамически из java-кода?
Вы можете передать его как часть конструктора LinearLayout.LayoutParams :
Последний параметр – вес.
EDIT: Ах, ответ Эриха проще!
Если вы уже определили свой вид в файле макета (xml), хотите только программно изменить вес, таким образом, лучше
New LayoutParams перезаписывает другие параметры, определенные в вашем файле xml, такие как поля, или вам нужно указать все их в LayoutParams.
Если конструктор с шириной, высотой и весом не работает, попробуйте использовать конструктор с шириной и высотой. А затем вручную установите вес.
И если вы хотите, чтобы ширина была задана в соответствии с весом, установите ширину как 0 в конструкторе. То же самое относится и к высоте. Ниже код работает для меня.
Если кто-то ищет ответ, используйте это:
Если вы инициализируете свой макет из xml-файла, это будет гораздо удобнее, чем предоставление новых параметров макета для линейной компоновки.
Любой из LinearLayout.LayoutParams и TableLayout.LayoutParams работал для меня, для кнопок правильный – TableRow.LayoutParams . То есть:
Об использовании MATCH_PARENT или WRAP_CONTENT будет одинаковым.
Если вы уже определили свой вид в макете (xml) и хотите просто изменить вес программно , то затем создание новых LayoutParams перезаписывает другие параметры, определенные в вашем XML-файле.
Поэтому сначала вы должны использовать «getLayoutParams», а затем setLayoutParams
Источник
TextView
Компонент TextView предназначен для отображения текста без возможности редактирования его пользователем, что видно из его названия (Text — текст, view — просмотр).
Находится в разделе Texts.
TextView — один из самых используемых компонентов. С его помощью пользователю удобнее ориентироваться в программе. По сути, это как таблички: Руками не трогать, По газону не ходить, Вход с собаками воспрещен, Часы работы с 9.00 до 18.00 и т.д., и служит для представления пользователю описательного текста.
Для отображения текста в TextView в файле разметки используется атрибут android:text, например:
Такой подход является нежелательным. Рекомендуется всегда использовать текстовые ресурсы. В будущем эта привычка позволит вам обеспечить многоязыковую поддержку:
Программная установка текста
Программно текст можно задать методом setText():
Атрибуты
Для всех вышеперечисленных атрибутов в классе TextView есть соответствующие методы для чтения или задания соответствующих свойств.
Программно установим размеры текста при помощи setTextSize() с различными единицами измерения.
По умолчанию у компонентов TextView отсутствует фоновый цвет. Чтобы задать цвет, укажите значение Drawable для атрибута android:background. В качестве значения Drawable может использоваться изображение или XML-представление фигуры, включающий ресурс Drawable (поместить в папку res/drawable).
Программная установка фона
В некоторых случаях программисты из-за невнимательности неправильно меняют фон элемента программным способом и удивляются, почему ничего не работает.
Предположим, у вас определён в ресурсах зелёный цвет:
Следующий код будет ошибочным:
Нужно так (два варианта):
Реагируем на событие onClick
Если вы хотите, чтобы TextView обрабатывал нажатия (атрибут android:onClick), то не забывайте также использовать в связке атрибут android:clickable=»true». Иначе работать не будет!
Многострочный текст
Если вы хотите создать многострочный текст в TextView, то используйте символы \n для переноса строк.
Например, в ресурсах:
Обратите внимание, что в тексте также применяется простое форматирование.
Также перенос на новую строку можно задать в коде:
Увеличиваем интервалы между строками
Вы можете управлять интервалом между соседними строчками текста через атрибут android:lineSpacingMultiplier, который является множителем. Установите дробное значение меньше единицы, чтобы сократить интервал или больше единицы, чтобы увеличить интервал между строками.
Бой с тенью
Чтобы оживить текст, можно дополнительно задействовать атрибуты для создания эффектов тени: shadowColor, shadowDx, shadowDy и shadowRadius. С их помощью вы можете установить цвет тени и ее смещение. Во время установки значений вы не увидите изменений, необходимо запустить пример в эмуляторе или на устройстве. В следующем примере я создал тень красного цвета со смещением в 2 пикселя по вертикали и горизонтали. Учтите, что для смещения используются единицы px (пиксели), единицы dp не поддерживаются.
Программный эквивалент — метод public void setShadowLayer (float radius, float dx, float dy, int color):
Создание ссылок автоматом
У TextView есть ещё два интересных свойства Auto link (атрибут autoLink) и Links clickable (атрибут linksClickable), которые позволяют автоматически создавать ссылки из текста.
Выглядит это следующим образом. Предположим, мы присвоим элементу TextView текст Мой сайт: developer.alexanderklimov.ru и применим к нему указанные свойства.
При этом уже на этапе разработки вы увидите, что строка адреса сайта после слов Мой адрес: стала ссылкой. Если вы запустите приложение и нажмете на ссылку, то откроется браузер с указанным адресом. Вам даже не придется писать дополнительный код. Аналогично, если указать номер телефона (параметр phone), то запустится звонилка.
У ссылки есть интересная особенность — при длительном нажатии на ссылку появляется диалоговое окно, позволяющее скопировать ссылку в буфер обмена.
Атрибут autoLink позволяет комбинировать различные виды ссылок для автоматического распознавания: веб-адрес, email, номер телефона.
Цвет ссылки можно поменять через свойство Text color link (XML-атрибут textColorLink), а программно через метод setTextLinkColor().
Программно можно установить ссылки на текст через класс Linkify:
Кроме константы ALL, можно также использовать Linkify.EMAIL_ADDRESSES, Linkify.MAP_ADDRESSES, Linkify.PHONE_NUMBERS. К сожалению, русские адреса не распознаются. В моём случае индекс был распознан как телефонный номер, а город и улица не стали ссылкой.
В таких случаях придётся самостоятельно добавить ссылки в текстах. Например, определим ссылку в ресурсе:
Присвоим созданный ресурс тексту в TextView и запустим пример. Сам текст будет выглядеть как ссылка, но реагировать не будет. Чтобы исправить данную проблему, добавим код:
Ссылки в тексте выглядят не совсем удобными. Есть отдельная библиотека, которая улучшает функциональность. Описание проблем и ссылка на библиотеку есть в статье A better way to handle links in TextView — Saket Narayan.
Совет: Используйте полупрозрачность с умом
Если вам нужно установить текст полупрозрачным, то не используйте атрибут android:alpha:
Дело в том, что такой подход затрачивает много ресурсов при перерисовке.
Атрибут textColor позволяет установить полупрозрачность без потери производительности:
Выделить текст для копирования
По умолчанию, текст в TextView нельзя выделить для копирования. Но в API 11 появилась такая возможность, которая может пригодиться. Делается либо при помощи XML-атрибута android:textIsSelectable, либо через метод setTextIsSelectable().
Добавьте в разметку два компонента TextView и одно текстовое поле EditText для вставки скопированного текста. У первой текстовой метки установим возможность выделения текста декларативно.
Для второго компонента возможность выделения создадим программно.
Сделайте долгий тап на тексте в любом TextView. Увидите стандартные ползунки для выбора длины текста. Скопируйте текст, сделайте длинный тап в EditText и вставьте текст.
Источник