Как сделать по центру название приложения в title?
Всем привет! Объясню суть вопроса. Когда открываю свое приложение на телефоне, вверху есть его название. Так мне нужно сделать так, чтобы это название было по центру, а не по левому краю. Сам новичок, гугл не помог(
- Вопрос задан более трёх лет назад
- 453 просмотра
1 комментарий
Простой 1 комментарий

Elmo Sputterspark @Sputterspark
Урок 4. Базовые Layout: Row, Column, Box
В этом уроке используем базовые Layout для расположения элементов на экране.
В одном из прошлых уроков мы уже пытались показать два текста на нашем Composable экране. Если мы делаем это без Layout, то тексты просто накладываются друг на друга
@Composable fun HomeScreen()

Как и в случае с классическим XML экраном, в Compose нам тоже необходимо использовать Layout, чтобы располагать элементы на экране.
Рассмотрим базовые Layout
Column
Column — это аналог вертикального LinearLayout. Он выстроит элементы в вертикальный ряд.
import androidx.compose.foundation.layout.Column @Composable fun HomeScreen() < Column < Text(text = "Title", fontSize = 32.sp) Text(text = "Description", fontSize = 20.sp) >>

Теперь тексты располагаются один над другим
Выравнивание
У Column есть атрибуты для выравнивания: вертикального и горизонтального.
Давайте настроим их так, чтобы тексты были внизу экрана и центрированы по горизонтали
import androidx.compose.foundation.layout.Arrangement import androidx.compose.ui.Alignment @Composable fun HomeScreen() < Column( horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Bottom ) < Text(text = "Title", fontSize = 32.sp) Text(text = "Description", fontSize = 20.sp) >>

Немного не то, что мы ожидали.
Так получилось потому, что Column по умолчанию не занимает весь экран. Давайте добавим ему фоновый цвет, чтобы убедиться в этом:
import androidx.compose.ui.graphics.Color import androidx.compose.foundation.layout.Arrangement import androidx.compose.ui.Alignment @Composable fun HomeScreen() < Column( modifier = Modifier.background(color = Color.LightGray), horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Bottom ) < Text(text = "Title", fontSize = 32.sp) Text(text = "Description", fontSize = 20.sp) >>

Видно, что Column занимает места ровно столько, чтобы вместить два текста. Т.е. по умолчанию работает в режиме wrap_content. И внутри себя он применил то выравнивание, которое мы попросили.
Надо сделать его на весь экран. Для этого есть Modifier.fillMaxSize:
import androidx.compose.foundation.layout.fillMaxSize @Composable fun HomeScreen() < Column( modifier = Modifier.fillMaxSize(), horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Bottom ) < Text(text = "Title", fontSize = 32.sp) Text(text = "Description", fontSize = 20.sp) >>

Теперь получилось то, что мы планировали. Тексты располагаются внизу и выровнены по центру по горизонтали.
Если нам надо поменять выравнивание для одного из элементов в Column, то мы можем это сделать через Modifier этого элемента. Это будет иметь приоритет перед общим выравниванием в Column.
В качестве примера включим выравнивание по левому краю для элемента с текстом Description:
import androidx.compose.ui.Alignment.Companion.Start @Composable fun HomeScreen() < Column( modifier = Modifier.fillMaxSize(), horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Bottom ) < Text(text = "Title", fontSize = 32.sp) Text(text = "Description", fontSize = 20.sp, modifier = Modifier.align(Start) ) >>

Description уехал влево, Title остался по центру
Row
Row — это горизонтальный LinearLayout. Соответственно он полностью аналогичен Column, только выстраивает элементы не по вертикали, а по горизонтали
Поместим два текстовых элемента в Row:
import androidx.compose.foundation.layout.Row import androidx.compose.ui.Alignment.Companion.CenterVertically @Composable fun HomeScreen() < Row(verticalAlignment = CenterVertically) < Text(text = "Name", fontSize = 20.sp) Text(text = "Surname", fontSize = 20.sp) >>

Когда мы располагали тексты по вертикали, между ними визуально было свободное место, потому что у шрифтов есть свои отступы сверху и снизу. А при расположении элементов по горизонтали сразу становится видно, что элементы располагаются вплотную друг к другу. Ни Row, ни Column не вставляют никакие отступы между элементами.
Spacer
Добавим отступы между элементами используя элемент Spacer:
import androidx.compose.ui.Modifier import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.width import androidx.compose.ui.unit.dp @Composable fun HomeScreen() < Row(verticalAlignment = CenterVertically) < Text(text = "Name", fontSize = 20.sp) Spacer(modifier = Modifier.width(8.dp)) Text(text = "Surname", fontSize = 20.sp) >>
Добавили 8 dp пустого пространства между текстами

Если нам надо не просто добавить фиксированный отступ, а максимально раскидать элементы, то используем weight:
@Composable fun HomeScreen() < Row(verticalAlignment = CenterVertically) < Text(text = "Name", fontSize = 20.sp) Spacer(modifier = Modifier.weight(1f)) Text(text = "Surname", fontSize = 20.sp) >>

Spacer можно использовать не только в Row, но и в Column
Box
Box — это аналог FrameLayout. Т.е. Layout в котором мы можем накладывать элементы друг на друга.
Например, мы хотим сделать такой текст:

Кажется, что можно просто использовать Column:
@Composable fun HomeScreen() < Column < Text(text = "N", fontSize = 48.sp) Text(text = "ame") >>
Но результат немного не тот, что нужен

Отступы шрифтов не дают нам приблизить два текста вплотную. Чтобы явно увидеть это, можно добавить background к обоим текстам:
@Composable fun HomeScreen() < Column < Text(text = "N", fontSize = 48.sp, modifier = Modifier.background(color = Color.Green) ) Text(text = "ame", modifier = Modifier.background(color = Color.Yellow) ) >>

Чтобы получить желаемый результат, нам надо, чтобы элементы могли быть наложены друг на друга.
Для этого используем Box вместо Column:
import androidx.compose.foundation.layout.Box @Composable fun HomeScreen() < Box < Text(text = "N", fontSize = 48.sp, modifier = Modifier.background(color = Color.Green) ) Text(text = "ame", modifier = Modifier.background(color = Color.Yellow) ) >>

Осталось перетащить вниз и выровнять по центру элемент с текстом «ame». Используем Modifier.align:
import androidx.compose.ui.Alignment.Companion.BottomCenter @Composable fun HomeScreen() < Box < Text(text = "N", fontSize = 48.sp, modifier = Modifier.background(color = Color.Green) ) Text(text = "ame", modifier = Modifier.background(color = Color.Yellow).align(BottomCenter) ) >>

@Composable fun HomeScreen() < Box < Text(text = "N", fontSize = 48.sp) Text(text = "ame", modifier = Modifier.align(BottomCenter) ) >>

Комбинирование
Чтобы создавать сложный экран, мы комбинируем различные Layout друг с другом:
@Composable fun HomeScreen() < Row(verticalAlignment = CenterVertically) < Box < Text("N", fontSize = 48.sp) Text("ame", modifier = Modifier.align(BottomCenter)) >Spacer(modifier = Modifier.width(8.dp)) Column < Text("Title") Text("Description") >> >
В строку мы помещаем Box с двумя текстами и столбец с двумя текстами.

Padding
Чтобы в Layout формировать отступы от границ, используем привычный нам padding. Он добавляется с помощью Modifier.
import androidx.compose.foundation.layout.padding import androidx.compose.ui.unit.dp @Composable fun HomeScreen() < Column( modifier = Modifier.padding(start = 32.dp, top = 16.dp) ) < Text("Title") Text("Description") >>

Kotlin
Мы используем язык Kotlin, чтобы писать свои Composable функции. А это значит, что мы можем использовать стандартные средства языка, чтобы сформировать экран, который нам нужен. Т.е. мы используем оператор If, чтобы решить, надо ли отображать элемент. Или мы используем цикл, чтобы отобразить несколько одинаковых элементов.
Рассмотрим пример Composable функции:
@Composable fun HomeScreen(list: List) < if (list.isEmpty()) < Box(contentAlignment = Center, modifier = Modifier.fillMaxSize()) < Text(text = "Empty screen") >> else < Column < for (s in list) < Text(text = s) >> > >
На вход она получает список строк и проверяет пустой ли он. Если список пустой, то HomeScreen выведет текст Empty screen по центру экрана. Если список содержит какие-то данные, то в Column для каждого элемента списка будет вызвана функция Text. В итоге все данные появятся на экране в виде вертикального списка.
Настоящий список строится по другому, об этом будет отдельный урок.
Проверим, как работает наша функция HomeScreen. Передадим ей простой список строк:
class MainActivity : ComponentActivity() < override fun onCreate(savedInstanceState: Bundle?) < super.onCreate(savedInstanceState) setContent < HomeScreen(listOf("one", "two", "three")) >> >

А если передадим пустой список:
class MainActivity : ComponentActivity() < override fun onCreate(savedInstanceState: Bundle?) < super.onCreate(savedInstanceState) setContent < HomeScreen(emptyList()) >> >
то увидим пустой экран:

Таким образом вместо Visibility у нас теперь используется оператор If
Ресурсы
Я для простоты примеров продолжу использовать числа и строки напрямую в коде. Но в реальном приложении мы обычно используем string и dimen ресурсы. Для этого есть функции stringResource и dimensionResource:
import androidx.compose.ui.res.dimensionResource import androidx.compose.ui.res.stringResource @Composable fun HomeScreen() < Column( modifier = Modifier.padding(start = dimensionResource(id = R.dimen.large_padding)) ) < Text(text = stringResource(id = R.string.home_screen_title)) Text(text = stringResource(id = R.string.home_screen_description)) >>
Присоединяйтесь к нам в Telegram:
— в канале StartAndroid публикуются ссылки на новые статьи с сайта startandroid.ru и интересные материалы с хабра, medium.com и т.п.
— в чатах решаем возникающие вопросы и проблемы по различным темам: Android, Compose, Kotlin, RxJava, Dagger, Тестирование, Performance
— ну и если просто хочется поговорить с коллегами по разработке, то есть чат Флудильня
Комментарии
# Spacer vs Modifier.padding — Татьяна 06.04.2023 13:57
Добрый день! А с точки зрения производительности, что лучше использовать для отступов, spacer или Modifier.padding?
# RE: Spacer vs Modifier.padding — Dmitry Vinogradov 07.04.2023 16:30
Ну если padding уже есть, то наверно увеличить его будет для системы проще, чем добавлять Spacer. Но скорее всего эта разница на уровне погрешности.
Android studio как сделать текст по центру
Для простого вывода текста на экран предназначен элемент TextView . Он просто отображает текст без возможности его редактирования. Некоторые его основные атрибуты:
- android:text : устанавливает текст элемента
- android:textSize : устанавливает высоту текста, в качестве единиц измерения для указания высоты используются sp
- android:background : задает фоновый цвет элемента в виде цвета в шестнадцатиричной записи или в виде цветового ресурса
- android:textColor : задает цвет текста
- android:textAllCaps : при значении true делает все символы в тексте заглавными
- android:textDirection : устанавливает направление текста. По умолчанию используется направление слева направо, но с помощью значения rtl можно установить направление справо налево
- android:textAlignment : задает выравнивание текста. Может принимать следующие значения:
- center : выравнивание по центру
- textStart : по левому краю
- textEnd : по правому краю
- viewStart : при направлении текста слева направо выравнивание по левому краю, при направлении справа налево — по правому
- viewEnd : при направлении текста слева направо выравнивание по правому краю, при направлении справа налево — по левому
- monospace
- serif
- serif-monospace
- sans-serif
- sans-serif-condensed
- sans-serif-smallcaps
- sans-serif-light
- casual
- cursive
- cursive
Например, определим три текстовых поля:

Установка элемента в коде тоже не отличается сложностью. Например, создадим элемент и выведем его на экран:
package com.example.viewapp; import androidx.appcompat.app.AppCompatActivity; import androidx.constraintlayout.widget.ConstraintLayout; import android.graphics.Typeface; 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(0xffe8eaf6); // установка цвета текста textView.setTextColor(0xff5c6bc0); // делаем все буквы заглавными textView.setAllCaps(true); // устанавливаем вравнивание текста по центру textView.setTextAlignment(TextView.TEXT_ALIGNMENT_CENTER); // устанавливаем текста textView.setText("Hello Android!"); // установка шрифта textView.setTypeface(Typeface.create("casual", Typeface.NORMAL)); // устанавливаем высоту текста textView.setTextSize(26); ConstraintLayout.LayoutParams layoutParams = new ConstraintLayout.LayoutParams (ConstraintLayout.LayoutParams.WRAP_CONTENT, ConstraintLayout.LayoutParams.WRAP_CONTENT); layoutParams.leftToLeft = ConstraintLayout.LayoutParams.PARENT_ID; layoutParams.topToTop = ConstraintLayout.LayoutParams.PARENT_ID; textView.setLayoutParams(layoutParams); constraintLayout.addView(textView); setContentView(constraintLayout); >>
Иногда необходимо вывести на экран какую-нибудь ссылку, либо телефон, по нажатию на которые производилось бы определенное действие. Для этого в TextView определен атрибут android:autoLink :

android:autoLink может принимать несколько значений:
- none : отключает все ссылки
- web : включает все веб-ссылки
- email : включает ссылки на электронные адреса
- phone : включает ссылки на номера телефонов
- map : включает ссылки на карту
- all : включает все вышеперечисленные ссылки
То есть при настройке android:autoLink=»web» если в тексте есть упоминание адреса url, то этот адрес будет выделяться, а при нажатии на него будет осуществлен переход к веб-браузеру, который откроет страницу по этому адресу. С помощью прямой черты мы можем объединять условия, как в данном случае: android:autoLink=»web|email»
TextView
Компонент TextView предназначен для отображения текста без возможности редактирования его пользователем, что видно из его названия (Text — текст, view — просмотр).
Находится в разделе Texts.
TextView — один из самых используемых компонентов. С его помощью пользователю удобнее ориентироваться в программе. По сути, это как таблички: Руками не трогать, По газону не ходить, Вход с собаками воспрещен, Часы работы с 9.00 до 18.00 и т.д., и служит для представления пользователю описательного текста.
Для отображения текста в TextView в файле разметки используется атрибут android:text, например:
android:text="Погладь кота, . "Такой подход является нежелательным. Рекомендуется всегда использовать текстовые ресурсы. В будущем эта привычка позволит вам обеспечить многоязыковую поддержку:
android:text="@string/hello"Программная установка текста
Программно текст можно задать методом setText():
// Инициализируем компонент TextView textView = findViewById(R.id.textView); // задаём текст textView.setText("Hello Kitty!"); // или с использованием текстовых ресурсов textView.setText(R.string.hello);Атрибуты
android:textsize размер текста. При установке размера текста используется несколько единиц измерения: px (пиксели), dp, sp, in (дюймы), pt, mm. Для текстов рекомендуется использовать sp: android:textSize=»48sp», аналог — метод setTextSize() android:textstyle стиль текста. Используются константы: normal, bold, italic. Например, android:textStyle=»bold» выводит текст жирным android:textcolor цвет текста. Используются четыре формата в шестнадцатеричной кодировке: #RGB; #ARGB; #RRGGBB; #AARRGGBB, где R, G, B — соответствующий цвет, А — прозрачность (alpha-канал). Значение А, установленное в 0, означает прозрачность 100%.
Для всех вышеперечисленных атрибутов в классе TextView есть соответствующие методы для чтения или задания соответствующих свойств.
Программно установим размеры текста при помощи setTextSize() с различными единицами измерения.
// 20 DIP (Device Independent Pixels) textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20); // 0.5 inch textView.setTextSize(TypedValue.COMPLEX_UNIT_IN, 0.5f); // 10 millimeter textView.setTextSize(TypedValue.COMPLEX_UNIT_MM, 10); // 30 points textView.setTextSize(TypedValue.COMPLEX_UNIT_PT, 30); // 30 raw pixels textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, 30); // 30 scaled pixels textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 30);
По умолчанию у компонентов TextView отсутствует фоновый цвет. Чтобы задать цвет, укажите значение Drawable для атрибута android:background. В качестве значения Drawable может использоваться изображение или XML-представление фигуры, включающий ресурс Drawable (поместить в папку res/drawable).
Программная установка фона
В некоторых случаях программисты из-за невнимательности неправильно меняют фон элемента программным способом и удивляются, почему ничего не работает.
Предположим, у вас определён в ресурсах зелёный цвет:
#337700 Следующий код будет ошибочным:
textview.setBackgroundColor(R.color.tvBackground); // не работаетНужно так (два варианта):
textView.setBackgroundResource(R.color.tvBackground); // первый вариант textView.setBackgroundColor(getResources().getColor(R.color.tvBackground)); // второй вариантРеагируем на событие onClick
Если вы хотите, чтобы TextView обрабатывал нажатия (атрибут android:onClick), то не забывайте также использовать в связке атрибут android:clickable=»true». Иначе работать не будет!
Многострочный текст
Если вы хотите создать многострочный текст в TextView, то используйте символы \n для переноса строк.
Например, в ресурсах:
У лукоморья дуб зелёный;\n Златая цепь на дубе том:\n И днём и ночью кот учёный\n Всё ходит по цепи кругом;\n Идёт направо - песнь заводит,\n Налево - сказку говорит. Обратите внимание, что в тексте также применяется простое форматирование.
Также перенос на новую строку можно задать в коде:
textView.setText("Первая строка \nВторая строка \nТретья строка");Увеличиваем интервалы между строками
Вы можете управлять интервалом между соседними строчками текста через атрибут android:lineSpacingMultiplier, который является множителем. Установите дробное значение меньше единицы, чтобы сократить интервал или больше единицы, чтобы увеличить интервал между строками.
android:lineSpacingMultiplier="0.8"Бой с тенью
Чтобы оживить текст, можно дополнительно задействовать атрибуты для создания эффектов тени: shadowColor, shadowDx, shadowDy и shadowRadius. С их помощью вы можете установить цвет тени и ее смещение. Во время установки значений вы не увидите изменений, необходимо запустить пример в эмуляторе или на устройстве. В следующем примере я создал тень красного цвета со смещением в 2 пикселя по вертикали и горизонтали. Учтите, что для смещения используются единицы px (пиксели), единицы dp не поддерживаются.

Программный эквивалент — метод public void setShadowLayer (float radius, float dx, float dy, int color):
TextView textShadow = (TextView)findViewById(R.id.hello); textShadow.setShadowLayer( 5f, //float radius 10f, //float dx 10f, //float dy 0xFFFFFFFF //int color );Создание ссылок автоматом
У TextView есть ещё два интересных свойства Auto link (атрибут autoLink) и Links clickable (атрибут linksClickable), которые позволяют автоматически создавать ссылки из текста.
Выглядит это следующим образом. Предположим, мы присвоим элементу TextView текст Мой сайт: developer.alexanderklimov.ru и применим к нему указанные свойства.
При этом уже на этапе разработки вы увидите, что строка адреса сайта после слов Мой адрес: стала ссылкой. Если вы запустите приложение и нажмете на ссылку, то откроется браузер с указанным адресом. Вам даже не придется писать дополнительный код. Аналогично, если указать номер телефона (параметр phone), то запустится звонилка.
У ссылки есть интересная особенность — при длительном нажатии на ссылку появляется диалоговое окно, позволяющее скопировать ссылку в буфер обмена.
Атрибут autoLink позволяет комбинировать различные виды ссылок для автоматического распознавания: веб-адрес, email, номер телефона.

Цвет ссылки можно поменять через свойство Text color link (XML-атрибут textColorLink), а программно через метод setTextLinkColor().
Программно можно установить ссылки на текст через класс Linkify:
TextView tvDisplay = (TextView)findViewById(R.id.tvDisplay); String data = "" + "Пример использования Linkify для создания ссылок в тексте.\n" + "\n" + "URL: http://developer.alexanderklimov.ru/ \n" + "Email: [email protected] \n" + "Телефон: (495)-458-58-29 \n" + "Адрес: 10110 ул.Котовского, г.Мышкин \n" + "\n" + "Классно получилось?"; if(tvDisplay != null)

Кроме константы ALL, можно также использовать Linkify.EMAIL_ADDRESSES, Linkify.MAP_ADDRESSES, Linkify.PHONE_NUMBERS. К сожалению, русские адреса не распознаются. В моём случае индекс был распознан как телефонный номер, а город и улица не стали ссылкой.
В таких случаях придётся самостоятельно добавить ссылки в текстах. Например, определим ссылку в ресурсе:
Присвоим созданный ресурс тексту в TextView и запустим пример. Сам текст будет выглядеть как ссылка, но реагировать не будет. Чтобы исправить данную проблему, добавим код:
TextView textView = (TextView) findViewById(R.id.textView); textView.setMovementMethod(LinkMovementMethod.getInstance());Ссылки в тексте выглядят не совсем удобными. Есть отдельная библиотека, которая улучшает функциональность. Описание проблем и ссылка на библиотеку есть в статье A better way to handle links in TextView — Saket Narayan.
Совет: Используйте полупрозрачность с умом
Если вам нужно установить текст полупрозрачным, то не используйте атрибут android:alpha:
Дело в том, что такой подход затрачивает много ресурсов при перерисовке.
Атрибут textColor позволяет установить полупрозрачность без потери производительности:
Выделить текст для копирования
По умолчанию, текст в TextView нельзя выделить для копирования. Но в API 11 появилась такая возможность, которая может пригодиться. Делается либо при помощи XML-атрибута android:textIsSelectable, либо через метод setTextIsSelectable().
Добавьте в разметку два компонента TextView и одно текстовое поле EditText для вставки скопированного текста. У первой текстовой метки установим возможность выделения текста декларативно.
Для второго компонента возможность выделения создадим программно.
TextView secondTextView = (TextView) findViewById(R.id.textView2); secondTextView.setTextIsSelectable(true);Сделайте долгий тап на тексте в любом TextView. Увидите стандартные ползунки для выбора длины текста. Скопируйте текст, сделайте длинный тап в EditText и вставьте текст.
Стили
Выводим разделитель под текстом.