- TextView
- Программная установка текста
- Атрибуты
- Программная установка фона
- Реагируем на событие onClick
- Многострочный текст
- Увеличиваем интервалы между строками
- Бой с тенью
- Создание ссылок автоматом
- Совет: Используйте полупрозрачность с умом
- Выделить текст для копирования
- Android: Как обновить textView во фрагменте
- 3 ответов
- Как обновить TextView во время цикла в Android?
- Android Studio — как обновить элементы пользовательского интерфейса фрагментов?
- 2 ответа
- Обновление строки TextView
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 и вставьте текст.
Источник
Android: Как обновить textView во фрагменте
Я пытаюсь использовать фрагменты для создания моего первого правильного приложения для Android. У меня есть основной xml. который состоит из двух вертикальных фрагментов, верхние фрагменты состоят всего из двух TextViews. Первый из них содержит статический текст, а второй содержит значение, которое я в конечном итоге буду получать динамически из SQL.
Если я поставлю это моя основная активность.затем java с радостью обновляет значение TextView в моем первом фрагменте:
у меня есть два фрагмента XMLs и java для поддержки каждого, поэтому я хочу поместить настройку этого поля в Java, который поддерживает фрагмент, а не java, который предназначен для MainActivity.
когда я помещаю его в Фрагмент, он выглядит так: —
но если я это сделаю, я получу ошибку в строке TextView:
«метод findViewById (int) не определен для типа FragmentMainTop»
Так почему же он не знает этого метода? Я ЦТЛ/смену/o так я знаю, что у меня все правильный импорт. Я не хочу в конечном итоге помещать весь свой код в MainActivity, потому что если я хочу использовать фрагмент в другом действии, мне придется повторить весь код.
3 ответов
вам нужно назначить надутый макет фрагмента переменной, чтобы вы могли получить доступ к его findViewById() метод. Затем вы возвращаете его, как только закончите обновление виджетов.
обычно, когда вы называете findViewById() внутри Activity , вы вызываете Activity.findViewById() . Попытка того же вызова в вашем Fragment класс потерпит неудачу, потому что нет такого Fragment.findViewById() метод. Итак, вы должны использовать View.findViewById() с надутым видом, чтобы получить ссылки на ваши виджеты.
Я не эксперт, но я бы сказал, что оператор return в методе возвращает что-то, и следующие строки после этого оператора недоступны :O
поэтому попробуйте изменить порядок! 🙂
Я использую этот код из моей деятельности для обновления textview, добавленного в XML-тег. Textview-это объекты уровня класса. Вот код:
Heres код фрагмента просто показывает переменную уровня класса.
Теперь действие, из которого я обновляю свой фрагмент:
Примечание: не уверен, что это хороший способ.
Источник
Как обновить TextView во время цикла в Android?
У меня есть это:
Я бы ожидал, что он обновит текстовое представление каждый раз через цикл, чтобы получить: 1, 2, 3, … 99
Вместо этого приложение ничего не делает за 10 секунд, а затем выдает: 99
Я предполагаю, что мне нужно, чтобы TextView обновлялся во время цикла. Я новичок в разработке Android. Может кто-нибудь, пожалуйста, скажите мне, если это лучший способ добиться этого?
Моя конечная цель состоит в том, чтобы иметь возможность обрабатывать образцы звука для создания гитарного тюнера. Я пытаюсь просто проверить визуально, что приложение отвечает на внешний звук, и я хочу обновить TextView, чтобы продемонстрировать это. Пожалуйста, сообщите, есть ли лучший способ сделать это.
Ваша проблема в том, что вы запускаете свой цикл в onCreate (). Это происходит в потоке пользовательского интерфейса до отображения вашей активности.
Взгляните на жизненный цикл Activity в Android. Он показывает onCreate – это всего лишь один из этапов создания Activity. То, что вы хотите сделать, это запустить цикл в фоновом потоке и опубликовать уведомление для обновления TextView в потоке пользовательского интерфейса с помощью runOnUiThread. Ответ Кристиана показывает, как это сделать.
Однако, поскольку ваша конечная цель – обновить TextView на основе некоторого пользовательского ввода (аудио в вашем случае), вам не придется перепрыгивать через все эти циклы, чтобы заставить его работать. Важно только то, что вы отправляете свои звонки для обновления пользовательского интерфейса в потоке пользовательского интерфейса, иначе вы получите исключения.
У меня была такая же проблема, и я разрешил ее с помощью обработчика:
С помощью mHandler.post(mUpdate) вы вызываете mUpdate который является Runnable, который запускается в другом потоке, который может обновлять пользовательский интерфейс. Внутри метода run() вместо создания цикла for, который будет иметь ту же проблему, что и ваш, вы устанавливаете текст, который хотите с вспомогательной переменной, увеличиваете его и вызываете mHandler.postDelayed(this,updateTime) . В этот момент представление обновляется, и у вас есть текст на экране, и после того, как вы указали (в миллисекундах), Runnable mUpdate снова будет вызван и устанавливает текст со следующим номером, и поэтому на.
Я надеюсь, что это помогает.
Вам лучше использовать таймер:
Обратите внимание, что я использую runOnUiThread так как вы не можете изменять представление из другого потока, который не является основным.
Вместо использования Handler можно напрямую передать Runnable для просмотра с помощью postDelayed:
Источник
Android Studio — как обновить элементы пользовательского интерфейса фрагментов?
Я занимаюсь программированием приложения, в котором необходимо отображать разные данные в разных фрагментах деятельности и обновлять их в режиме реального времени. Таким образом, данные считываются из базы данных SQLLite и отображаются в TextViews. Однако эти данные постоянно меняются, и поэтому TextView должны постоянно изменять свое содержимое.
Я попытался сделать это так (он помещен в каждый фрагмент mainActivity с разными процессами внутри run() ):
Проблема в том, что память эмулятора Android-устройства постоянно заполняется, и через некоторое время приложение вылетает.
Итак, как можно более эффективно обновлять элементы пользовательского интерфейса различных фрагментов?
Изменить: эти фрагменты являются фрагментами tab_fragment активности навигационного ящика. TextView этих фрагментов находится внутри ScrollView. Поэтому, если бы я просто отсоединил и снова прикрепил фрагмент, ScrollView не был бы в том положении, в котором он был до обновления.
2 ответа
Прежде всего, не рекомендуется копировать код в разные классы (вместо этого используйте один базовый класс и расширяйте его в дочерних фрагментах). Во-вторых, рекомендуется помещать логику приложения и операции потока в действие и вызывать от фрагмента к соответствующей функции через некоторый интерфейс. Вы можете найти дополнительную информацию об этом здесь. Также нет необходимости открывать новый поток каждый раз, когда вы делаете запрос к базе данных (для начальных шагов вы можете использовать AsyncTask ). Поэтому просмотрите логику вашего приложения в корне. Удачи!
Вы можете извлечь выгоду из компонентов Reactive , в которых вы храните свое значение, и любая заинтересованная часть вашей программы с этим значением может subscribe получать уведомление компонента всякий раз, когда значение изменяется.
некоторые из этих компонентов — LiveData и BehaviorSubject .
в вашем случае, когда вы имеете дело с SQLite , Room и LiveData — ваше окончательное решение, Room может генерировать объект LiveData , который запускается каждый раз, когда ваши данные меняются.
Источник
Обновление строки TextView
Обновление текста в TextView
Подскажите как лучше сделать. У меня постоянно изменяется значение переменной и ее нужно выводить.
Текст из TextView перенести в другой TextView по нажатию Button
Люди, помогите плиз. Недавно начал ковырять программирование под Android. Хотел сделать банальную.
Передать из строки ListView в 2 поля TextView?
Добрый всем! Добавлено через 8 минут есть ListView в нем добавлены/добавляются из полей.
В БД программно добавлять строки из нескольких TextView
Сделал Базу Данных, сохраняет и удаляет данные нормально, но нормально вывести на экран данные не.
Забейте все варианты в массив строк. При нажатии на кнопку показывайте следующий элемент массива
Сделать ширину TextView по ширине самой длинной строки
Здравствуйте, подскажите пожалуйста, как сделать, чтобы ширина TextView была по ширине самого.
TextView txt = new TextView(this); — ошибка
Возникла проблема с динамическим создание TextView в цыкле, хотя в другом месте создается таким же.
Обновление строки в sqlite
Так я пытался обнавлять значение в строке с Items items = new Items(); .
Не происходит обновление строки БД (из первой строки файла csv)
Осваиваю php, нашел такое задание: сделать скрипты для импорта и обновления базы данных из csv.
Источник