Есть ли способ стилизовать TextView в верхнем регистре всех его букв? - PullRequest
220 голосов
/ 14 декабря 2010

Я хотел бы иметь возможность назначить атрибут или стиль xml для TextView, который будет делать любой текст, который он имеет во ВСЕХ БУКВАХ. ПИСЬМА.и похоже, что они предназначены для пользовательского текста, а не TextView.

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

Ответы [ 7 ]

324 голосов
/ 14 декабря 2010

Я думал, что это был довольно разумный запрос, но похоже, что вы не можете сделать это в настоящее время. Что за полный отказ.lol

Обновление

Теперь вы можете использовать textAllCaps для принудительного применения всех заглавных букв.

132 голосов
/ 15 марта 2012

А как насчет android: textAllCaps ?

56 голосов
/ 18 марта 2014

Используя AppCompat textAllCaps в приложениях для Android, поддерживающих более старые API (менее 14)

Существует один виджет пользовательского интерфейса, который поставляется вместе с AppCompat, с именем CompatTextView - расширение Custom TextView, которое добавляетподдержка textAllCaps

Для более новых API Android> 14 вы можете использовать:

android:textAllCaps="true"

Простой пример:

<android.support.v7.internal.widget.CompatTextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:textAllCaps="true"/>

Источник: developer.android

Обновление:

Так случилось, что CompatTextView был заменен AppCompatTextView в последней библиотеке appcompat-v7 ~ Eugen Pechanec

29 голосов
/ 30 мая 2012

Действительно очень обидно, что вы не можете сделать это с помощью стилей (<item name="android:textAllCaps">true</item>) или для каждого XML-файла макета с атрибутом textAllCaps , и единственный способ сделать это на самом деле - использовать theString .toUpperCase () для каждой из строк при выполнении textViewXXX.setText (theString).

В моем случае я не хотел, чтобы везде в моем коде был объект theString.toUpperCase (), но имелось централизованное место для этого, потому что у меня были некоторые действия и списки макетов элементов с TextViews, где предполагается, что все время пишется с заглавной буквы (название), а другие - нет ... так что ... некоторые люди могут подумать, что это излишнее убийство, но я создал свой собственный класс CapitalizedTextView, расширяющий android.widget.TextView и переопределил метод setText, использующий заглавные буквы на лету.

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

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

Это класс:

package com.realactionsoft.android.widget;

import android.content.Context; 
import android.util.AttributeSet; 
import android.view.ViewTreeObserver; 
import android.widget.TextView;


public class CapitalizedTextView extends TextView implements ViewTreeObserver.OnPreDrawListener {

    public CapitalizedTextView(Context context) {
        super(context);
    }

    public CapitalizedTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public CapitalizedTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    public void setText(CharSequence text, BufferType type) {
        super.setText(text.toString().toUpperCase(), type);
    }

}

И всякий раз, когда вам нужно его использовать, просто объявите его со всем пакетом в макете XML:

<com.realactionsoft.android.widget.CapitalizedTextView 
        android:id="@+id/text_view_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

Некоторые утверждают, что правильный стиль оформления текста в TextView - это использование SpannableString , но я думаю, что это будет еще большим излишним, не говоря уже о большем количестве ресурсов - потому что вы будете создавать экземпляр другого класса, отличного от TextView.

8 голосов
/ 05 сентября 2013

Я предложил решение, аналогичное RacZo, в том, что я также создал подкласс TextView, который обрабатывает текст в верхнем регистре.

Разница в том, что вместо переопределения одного из методов setText() я использовал подход, аналогичный тому, что на самом деле TextView делает с API 14+ (что, на мой взгляд, более чистое решение).

Если вы посмотрите на источник , вы увидите реализацию setAllCaps():

public void setAllCaps(boolean allCaps) {
    if (allCaps) {
        setTransformationMethod(new AllCapsTransformationMethod(getContext()));
    } else {
        setTransformationMethod(null);
    }
}

Класс AllCapsTransformationMethod не является (в настоящее время) общедоступным, но, тем не менее, источник также доступен . Я немного упростил этот класс (убрал метод setLengthChangesAllowed()), поэтому полное решение таково:

public class UpperCaseTextView extends TextView {

    public UpperCaseTextView(Context context) {
        super(context);
        setTransformationMethod(upperCaseTransformation);
    }

    public UpperCaseTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        setTransformationMethod(upperCaseTransformation);
    }

    public UpperCaseTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        setTransformationMethod(upperCaseTransformation);
    }

    private final TransformationMethod upperCaseTransformation =
            new TransformationMethod() {

        private final Locale locale = getResources().getConfiguration().locale;

        @Override
        public CharSequence getTransformation(CharSequence source, View view) {
            return source != null ? source.toString().toUpperCase(locale) : null;
        }

        @Override
        public void onFocusChanged(View view, CharSequence sourceText,
                boolean focused, int direction, Rect previouslyFocusedRect) {}
    };
}
1 голос
/ 02 февраля 2017

Кажется, что есть разрешение на настройку мобильной клавиатуры, поэтому самый простой способ сделать это:

editText.setFilters(new InputFilter[]{new InputFilter.AllCaps()});

надеюсь, что это будет работать

0 голосов
/ 12 июня 2014

PixlUI проект позволяет вам использовать textAllCaps в любом текстовом представлении или подклассе текстового представления, включая: кнопку, флажок EditText AutoCompleteEditText RadioButton и некоторые другие.

Вам нужно будет создать ваши текстовые представления, используяВерсия pixlui, а не версии Android, что означает, что вы должны сделать это:

<com.neopixl.pixlui.components.textview.TextView

        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world"
        pixlui:textAllCaps="true" />

PixlUI также позволяет вам установить пользовательский шрифт / шрифт, который вы поместите в папку вашего ресурса.

Я работаю над вилкой Gradle каркаса PixlUI , которая использует gradle и позволяет указывать textAllCaps, а также гарнитуру из стилей, а не требовать их встраивания, как в оригинальном проекте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...