Есть ли способ стилизовать TextView в верхний регистр всех его букв?


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

атрибуты android:inputType="textCapCharacters" и android:capitalize="characters" ничего не делать и выглядеть они для ввода текста пользователем, а не TextView.

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

7 208

7 ответов:

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

обновление

теперь вы можете использовать textAllCaps форсировать все заглушки.

а как же android: textAllCaps?

С помощью AppCompattextAllCaps В Android-приложениях, поддерживающих старые API (менее 14)

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

для новых Android API > 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"/>

источник:разработчика.android

обновление:

как это происходит CompatTextView был заменен на AppCompatTextView в последние библиотека appcompat-v7 ~ Eugen Pechanec

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

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

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

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

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

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

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

The 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) {}
    };
}

PixlUI проект позволяет использовать textAllCaps в любом textview или подклассе textview в том числе: Кнопка, EditText AutoCompleteEditText Флажок радиокнопка и еще несколько человек.

вам нужно будет создать свои текстовые представления с помощью версии 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 framework который использует gradle и позволяет указывать textAllCaps, а также шрифт из стилей, а не требовать их встроенных, как это делает исходный проект.

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

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

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