Android studio как textview сделать разного размера
Перейти к содержимому

Android studio как textview сделать разного размера

  • автор:

Разный размер текста в одном TextView с условием (Ответ найден)

введите сюда описание изображения

Как сделать условие поиска символов в строке String и изменить их размер? Например: Есть строка: «Деньги приходят и уходят, и уходят, и уходят. » Как сделать условие чтобы все слова «уходят», стали в 2 раза больше? Нашел один ответ, но никак не получается его использовать. Компилятор ругается на оператор Utils.. Помогите пожалуйста! Заранее благодарю!

Отслеживать
хХ Артур Хх
задан 11 апр 2018 в 16:29
хХ Артур Хх хХ Артур Хх
111 1 1 серебряный знак 9 9 бронзовых знаков

Всмысле ругается на Utils? Utils это просто класс автора, по всей видимости, из которого вызываются эти методы.

11 апр 2018 в 16:47

Щас попробовал исправить и вот что вышло: если символы заданные в условии есть, то тогда только первый символ в строке изменяется а остальные нет, а если символа заданного в условии нету, то вылетает ошибка.. Мне надо чтобы везде где есть совпадение символов менялось..

11 апр 2018 в 17:01

Да, потому что startIndexOfPath хранит в себе стартовый индекс первого попавшего слова. Вам надо получить циклом все индексы и уже для все слов выставлять span. Что касается вылета из-за незаданного символа, то вначале метода напишите типа if(path.lenght() == 0) return;

11 апр 2018 в 17:29
Помогите написать этот цикл пожалуйста, а то я не совсем понимаю как правильно это сделать..
11 апр 2018 в 17:32
Я использую html верстку, и подставляю ее в TextView при помощи Html.fromHtml
11 апр 2018 в 18:27

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Вообщем просидел 2 часа и нашел 2 решения данного вопроса:

1: Если требуется изменить размер 1 символа или слова

String text="Деньги приходят и уходят, и уходят, и уходят. "; Spannable span1 = new SpannableString(text); Spannable span2 = new SpannableString(text); String path="уходят"; int startIndexOfPath = span2.toString().indexOf(path); while (startIndexOfPath!=-1) < span1.setSpan(new AbsoluteSizeSpan((int) textView.getTextSize()*2), startIndexOfPath, startIndexOfPath + path.length(), 0); StringBuilder sTextBuilder = new StringBuilder(span2); sTextBuilder.replace(startIndexOfPath,startIndexOfPath+path.leght(),"0"); span2=new SpannableString(sTextBuilder); startIndexOfPath = span2.toString().indexOf(path); >textView.setText(span1); 

Создаем переменную text типа String и присваиваем ей наш текст:

Создаем 2 переменные Spanable и присваиваем им переменную text дальше объясню почему именно 2

Создаем переменную path типа String и вносим в неё символ или строку которую хотим изменить

Создаем переменную startIndexOfPath типа int и присваиваем ей индекс указанного символа в переменной path из переменной span2

Создаем цикл который будет срабатывать если в тексте есть указанный нами символ в переменной path

Изменяем размер указанного нами символа в тексте (span1). Я получаю размер шрифта из TextView и умножаю его на 2

В функции AbsoluteSizeSpan можно указывать только точный размер типа int (в пикселях)

Создаем переменную StringBuilder и присваиваем ей переменную span2

Заменяем в переменной span2 найденный(е) символ(ы) на любые другие на такое же кол-во как мы указали в переменной path. Это нужно для того чтобы если в тексте повторяются указанные нами символы, программа заменяла их всех а не только 1.

Присваиваем переменной span2 измененный текст

Снова присваиваем переменной startIndexOfPath индекс указанного символа в переменной path из уже измененной переменной span2

Присваиваем TextView переменную span1

2 переменных Spannable нужны для того чтобы в первой переменной изменять размер символов которые нам нужны, а во второй мы производим поиск этих символов.

2: Если требуется изменить размер целой строки

String text="любой текст"; Spannable span1 = new SpannableString(text); Spannable span2 = new SpannableString(text); String path1="символ указывающий начало строки"; String path2="символ указывающий конец строки" int startIndexOfPath = span2.toString().indexOf(path1); int endIndexOfPath = span2.toString().indexOf(path2); while (startIndexOfPath!=-1) < span1.setSpan(new AbsoluteSizeSpan((int) textView.getTextSize()*2), startIndexOfPath, endIndexOfPath, 0); StringBuilder sTextBuilder = new StringBuilder(span2); sTextBuilder.replace(startIndexOfPath,endIndexOfPath,"0"); span2=new SpannableString(sTextBuilder); startIndexOfPath = span2.toString().indexOf(path1); endIndexOfPath = span2.toString().indexOf(path2); >textView.setText(span1); 

Здесь всё тоже самое только вместо одного символа мы изменяем целую строку, думаю что исходя из первого примера тут все понятно

Ячейки в таблице разного размера

Здравствуйте, уважаемые форумчане.
Решил я попробовать себя разработке под андроид, пишу на java в android studio. Пока пытаюсь приручить различные элементы управления)
И у меня возникла проблема с таблицами пытаюсь делать их с помощью TableLayout и GridLayout, результат одинакоко не устраивающий меня.
Итак как же я ее рисовал. В папке layout создал table_min.xml со следующим содержимым (а в джава коде уже его добавляю в LinearLayout)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
 version="1.0" encoding="utf-8"?>  xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="10px">  android:layout_width="match_parent" android:layout_height="wrap_content">  android:id="@+id/TextView1" android:layout_width="150dp" android:layout_height="match_parent" android:background="@drawable/cell_shape" android:paddingLeft="5px" android:text="TextView1_hgqwduygwefygeofucghonugferoicguhreomhgxorghocgrmogth" />  android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="2">  android:layout_width="match_parent" android:layout_height="wrap_content">  android:id="@+id/TextView2" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:background="@drawable/cell_shape" android:paddingLeft="5px" android:text="TextView2" /> >  android:layout_width="match_parent" android:layout_height="match_parent">  android:id="@+id/TextView3" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:background="@drawable/cell_shape" android:paddingLeft="5px" android:text="TextView3" /> > > > >

Если делать GridLayout то такой

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
 xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:columnCount="2" android:orientation="horizontal" android:layout_margin="10px">  android:id="@+id/TextView1" android:layout_width="150dp" android:layout_height="wrap_content" android:layout_rowSpan="2" android:layout_gravity="fill_vertical" android:background="@drawable/cell_shape" android:paddingLeft="5px" android:text="TextView1_kjfdbrefghfgekygferkugervevbejfbnlgfbnlgrjbnrlgkjbngrnrobnrljkbnfkjldbf" />  android:id="@+id/TextView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:background="@drawable/cell_shape" android:paddingLeft="5px" android:text="TextView2" />  android:id="@+id/TextView3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:background="@drawable/cell_shape" android:paddingLeft="5px" android:text="TextView3" /> >

Результаты на скриншотах, первый — Table, второй — Grid.
Если текста в первой ячейке мало, то она растягивается на высоту двух остальных, тут всё норм, но если много текста в первой ячейке, то ее высота увеличивается, а остальные за ней не подтягиваются в обоих вариантах, так вот вопрос, как это исправить?
А еще если в гриде для текствьювов поставить ширину match_parent, то их правый край улетит куда-то за край экрана. Можно ли еще и это пофиксить чтобы нормально на ширину экрана растянуть таблицу?

RelativeLayout

ReiativeLayout (относительная разметка) находится в разделе Layouts и позволяет дочерним компонентам определять свою позицию относительно родительского компонента или относительно соседних дочерних элементов (по идентификатору элемента). В RelativeLayout дочерние элементы расположены так, что если первый элемент расположен по центру экрана, другие элементы, выровненные относительно первого элемента, будут выровнены относительно центра экрана. При таком расположении, при объявлении разметки в XML-файле, элемент, на который будут ссылаться для позиционирования другие объекты представления, должен быть объявлен раньше, чем другие элементы, которые обращаются к нему по его идентификатору.

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

  • android:layout_alignParentBottom — выравнивание относительно нижнего края родителя
  • android:layout_alignParentLeft — выравнивание относительно левого края родителя
  • android:layout_alignParentRight — выравнивание относительно правого края родителя
  • android:layout_alignParentTop — выравнивание относительно верхнего края родителя
  • android:layout_centerInParent — выравнивание по центру родителя по вертикали и горизонтали
  • android:layout_centerHorizontal — выравнивание по центру родителя по горизонтали
  • android:layout_centerVertical — выравнивание по центру родителя по вертикали

Некоторые атрибуты можно использовать вместе, чтобы добиться нужного эффекта, например, разместить компонент в верхнем правом углу.

Атрибуты ReiativeLayout

Компонент можно размещать не только относительно родителя, но и относительно других компонентов. Для этого все компоненты должны иметь свой идентификатор, по которому их можно будет отличать друг от друга. В этом случае вы можете задействовать другие атрибуты.

  • android:layout_above — размещается над указанным компонентом
  • android:layout_below — размещается под указанным компонентом
  • android:layout_alignLeft — выравнивается по левому краю указанного компонента
  • android:layout_alignRight — выравнивается по правому краю указанного компонента
  • android:layout_alignTop — выравнивается по верхнему краю указанного компонента
  • android:layout_alignBottom — выравнивается по нижнему краю указанного компонента
  • android:layout_toLeftOf — правый край компонента размещается слева от указанного компонента
  • android:layout_toRightOf — левый край компонент размещается справа от указанного компонента

Атрибуты ReiativeLayout

Чтобы компоненты «не прилипали» друг к другу, используются атрибуты, добавляющие пространство между ними.

  • android:layout_marginTop
  • android:layout_marginBottom
  • android:layout_marginLeft
  • android:layout_marginRight

Рассмотрим простой пример. Допустим, мы хотим поместить на экран элементы EditText и Button. Кнопка должна находиться справа от текстового поля. Текстовое поле при этом должно быть выравнено слева относительно родительского элемента (компоновки) и слева относительно кнопки. В свою очередь кнопка должна быть выравнена справа относительно шаблона компоновки.

Во многих случаях грамотная относительная компоновка хорошо смотрится в альбомной и портретной ориентации.

ReiativeLayout

Программное создание относительной разметки

Если вам понадобится динамически создавать относительную разметку в коде, то делается это следующим образом:

 public void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); // setContentView(R.layout.activity_main); EditText editText = new EditText(this); RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); params.addRule(RelativeLayout.ALIGN_PARENT_LEFT); // use same id as defined when adding the button params.addRule(RelativeLayout.LEFT_OF, 1001); editText.setLayoutParams(params); editText.setHint("Введите имя кота. "); Button button = new Button(this); RelativeLayout.LayoutParams params2 = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); params2.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); button.setLayoutParams(params2); button.setText("Нажми нежно!"); // give the button an id that we know button.setId(1001); RelativeLayout layout = new RelativeLayout(this); layout.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); layout.addView(editText); layout.addView(button); setContentView(layout); >

Создавать компоновку для относительной разметки чуть сложнее, чем для линейной компоновки. Рассмотрим ещё один пример. Предположим, нам нужен такой экран

ReiativeLayout

Шаг 1: В XML-файле задаем относительную компоновку.

Шаг 2: Определяем дочерние элементы. В нашем случае мы имеем семь текстовых меток разного цвета. Каждому элементу присваиваем необходимые свойства: текст, цвет, размер символов и так далее.

Шаг 3: Определяем правила относительной разметки.
Красная метка должна находиться в правом верхнем углу родительского элемента.
Оранжевая метка должна располагаться по центру по горизонтали относительно родительского элемент.
Желтая метка выравнивается по правой части родительского элемента.
Зелёная метка выравнивается по центру (по вертикали) и выводится слева от синей метки.
Синяя метка выравнивается по центру (по вертикали и горизонтали) относительно родительского элемента, т.е. точно по центру.
Метка цвета индиго выравнивается по центру (по вертикали) и выводится справа от синей метки.
Фиолетовая метка выводится в нижней части родительского элемента и занимает всю её ширину.

При разработке макета с относительной разметкой следите, чтобы элементы не налезали друг на друга (можете получить сообщение об ошибке). Старайтесь не усложнять макет и не забывайте присваивать уникальный идентификатор каждому элементу. Проверяйте макет в разных режимах ориентации.

Создаём неподвижную полоску

С помощью RelativeLayout можно создать неподвижную полоску внизу экрана, которая не будет прокручиваться вместе со списком. Для этого используется атрибут android:layout_alignParentBottom и родственные ему атрибуты для верхней части. Вот простой пример со списком.

И простой код для создания прокручиваемого списка, чтобы увидеть эффект неподвижной полоски с кнопкой.

 package ru.alexanderklimov.relativelayout; import android.app.Activity; import android.os.Bundle; import android.widget.ArrayAdapter; import android.widget.ListView; public class RelativeLayoutActivity extends Activity < @Override public void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ListView listView = (ListView) findViewById(R.id.listView1); // определяем массив типа String final String[] catnames = new String[] < "Рыжик", "Барсик", "Мурзик", "Мурка", "Васька", "Томасина", "Кристина", "Пушок", "Дымка", "Кузя", "Китти", "Масяня", "Симба" >; // используем адаптер данных ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, catnames); listView.setAdapter(adapter); > > 

Запускаем проект и любуемся своей работой:

Android studio как textview сделать разного размера

Параметры разметки позволяют задать отступы как от внешних границ элемента до границ контейнера, так и внутри самого элемента между его границами и содержимым.

Padding

Для установки внутренних отступов применяется атрибут android:padding . Он устанавливает отступы контента от всех четырех сторон контейнера. Можно устанавливать отступы только от одной стороны контейнера, применяя следующие атрибуты: android:paddingLeft, android:paddingRight, android:paddingTop и android:paddingBottom .

У контейнера ConstraintLayout установлен только один общий внутренний отступ в 50 единиц. Вложенный элемент TextView позиционируется в левом верхнем углу контейнера (благодаря атрибутам app:layout_constraintLeft_toLeftOf=»parent» и app:layout_constraintTop_toTopOf=»parent» ). . Поэтому TextView будет отодвигаться от начальной точки (левый верхний угол контейнера ConstraintLayout) вниз и влево на 50 единиц. Кроме того, такие же отступы будут действовать справа и снизу, если элемент будет примыкать к нижней или правой границе контейнера.

Padding в Android Studio

Установка одного отступа

android:padding="50dp"

Будет аналогична установке четырех отступов

android:paddingTop="50dp" android:paddingLeft="50dp" android:paddingBottom="50dp" android:paddingRight="50dp"

Подобным образом можно установить отступы в других элементах. Например, установим внутри TextView сверху и снизу от внутреннего содержимого (то есть текста) отступы в 60 единиц и отступы слева и справа в 40 единиц:

Установка внутренних отступов в Android Studio

Стоит отметить, что вместо атрибутов android:paddingLeft и android:paddingRight можно применять атрибуты android:paddingStart и android:paddingEnd , которые разработаны специально адаптации приложения для работы как для языков с левосторонней ориентацией, так и правосторонней ориентацией (арабский, фарси).

Margin

Для установки внешних отступов используется атрибут layout_margin . Данный атрибут имеет модификации, которые позволяют задать отступ только от одной стороны: android:layout_marginBottom, android:layout_marginTop, android:layout_marginLeft и android:layout_marginRight (отступы соответственно от нижней, верхней, левой и правой границ):

Здесь у TextView задаются отступы от двух сторон ConstraintLayout (слева 60 единиц и сверху 50 единиц):

Внешний отступ Margin в Android

Программная установка отступов

Для программной установки внутренних отступов у элементы вызывается метод setPadding(left, top, right, bottom) , в который передаются четыре значения для каждой из сторон. Также можно по отдельности задать отступы с помощью методов getPaddingLeft(), getPaddingTop(), getPaddingRight() и getPaddingBottom() .

Для установки внешних отступов необходимо реализовать объект LayoutParams для того контейнера, который применяется. И затем вызвать у этого объекта LayoutParams метод setMargins(left, top, right, bottom) :

package com.example.viewapp; import androidx.appcompat.app.AppCompatActivity; import androidx.constraintlayout.widget.ConstraintLayout; import android.os.Bundle; import android.widget.TextView; public class MainActivity extends AppCompatActivity < @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); ConstraintLayout constraintLayout = new ConstraintLayout(this); TextView textView = new TextView(this); // установка цвета текстового поля textView.setBackgroundColor(0xFFE0E0E0); // установка текста текстового поля textView.setText("Hello Android"); // установка размера текста textView.setTextSize(30); ConstraintLayout.LayoutParams layoutParams = new ConstraintLayout.LayoutParams (ConstraintLayout.LayoutParams.WRAP_CONTENT , ConstraintLayout.LayoutParams.WRAP_CONTENT); // установка внешних отступов layoutParams.setMargins(60, 50, 60, 50); // позиционирование в левом верхнем угду контейнера // эквивалент app:layout_constraintLeft_toLeftOf="parent" layoutParams.leftToLeft = ConstraintLayout.LayoutParams.PARENT_ID; // эквивалент app:layout_constraintTop_toTopOf="parent" layoutParams.topToTop = ConstraintLayout.LayoutParams.PARENT_ID; // устанавливаем размеры textView.setLayoutParams(layoutParams); // установка внутренних отступов textView.setPadding(40,40,40,40); // добавляем TextView в ConstraintLayout constraintLayout.addView(textView); setContentView(constraintLayout); >>

Поскольку в данном случае элемент TextView добавляется в контейнер типа ConstraintLayout, то для его позиционирования применяется объект ConstraintLayout .LayoutParams (соответственно для LinearLayout это будет LinearLayout.LayoutParams), у которого вызывается метод setMargins() .

Programmaticaly set Margin in Android

Но если посмотреть на последний скриншот, то можно увидеть, что, несмотря на то, что отступы вроде бы заданы также, что и в предпоследнем примере в файле layout, однако в реальности на экране мы увидим отступы со совсем другими значениями. Дело в том, что методы setPadding() и setMargins() принимают значения в пикселях, тогда как в файле layout применялись единицы dp. И чтобы использовать dp также в коде, необходимо выполнить преобразования:

package com.example.viewapp; import androidx.appcompat.app.AppCompatActivity; import androidx.constraintlayout.widget.ConstraintLayout; import android.os.Bundle; import android.util.TypedValue; import android.widget.TextView; public class MainActivity extends AppCompatActivity < @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); ConstraintLayout constraintLayout = new ConstraintLayout(this); TextView textView = new TextView(this); textView.setBackgroundColor(0xFFE0E0E0); textView.setText("Hello Android!"); textView.setTextSize(30); // получаем отступ в пикселях для 50 dp int margin50inDp = (int) TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_DIP, 50, getResources().getDisplayMetrics()); // получаем отступ в пикселях для 60 dp int margin60inDp = (int) TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_DIP, 60, getResources().getDisplayMetrics()); // получаем отступ в пикселях для 40 dp int padding40inDp = (int) TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_DIP, 40, getResources().getDisplayMetrics()); ConstraintLayout.LayoutParams layoutParams = new ConstraintLayout.LayoutParams (ConstraintLayout.LayoutParams.WRAP_CONTENT , ConstraintLayout.LayoutParams.WRAP_CONTENT); // установка внешних отступов layoutParams.setMargins(margin60inDp, margin50inDp, margin60inDp, margin50inDp); // выравнивание по левому краю ConstraintLayout layoutParams.leftToLeft = ConstraintLayout.LayoutParams.PARENT_ID; // выравнивание по верхней границе ConstraintLayout layoutParams.topToTop = ConstraintLayout.LayoutParams.PARENT_ID; // устанавливаем размеры textView.setLayoutParams(layoutParams); // установка внутренних отступов textView.setPadding(padding40inDp, padding40inDp, padding40inDp, padding40inDp); // добавляем TextView в ConstraintLayout constraintLayout.addView(textView); setContentView(constraintLayout); >>

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *