Textview set weight android

Что означает 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 будет действовать обратным образом, при этом наибольшее число заняло наименьшее пространство, а самое низкое число заняло самое большое пространство.

Кроме того, некоторая комбинация весов приведет к тому, что некоторая компоновка не может быть показана (так как она заняла пространство).

Читайте также:  Gps без wifi android

Как следует из названия, вес макета определяет, какое количество или процент пространства занимает определенное поле или виджет, занимающий пространство экрана.
Если мы укажем вес в горизонтальной ориентации, тогда мы должны указать 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 для переноса строк.

Читайте также:  Sonic для андроид без рекламы

Например, в ресурсах:

Обратите внимание, что в тексте также применяется простое форматирование.

Также перенос на новую строку можно задать в коде:

Увеличиваем интервалы между строками

Вы можете управлять интервалом между соседними строчками текста через атрибут 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 и вставьте текст.

Источник

Оцените статью