Чи є спосіб надати TextView великі регістри всіх його літер?


239

Я хотів би мати можливість призначити атрибут або стиль xml стилю, TextViewякий дозволить зробити текст, який він має, у ВСІХ КАПІТАЛЬНИХ ПІСЛЯХ.

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

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


1
ні inputType = "textCapCharacters", textAllCaps = "true" працює в smasung famili ^^. Я додав до мого TextWatcher EditText що Ковпачки все слова
murt

Відповіді:


359

Я хоч це був досить розумний запит, але схоже, що ви не можете це зробити в цей час. Що за тотальний збій. Лол

Оновлення

Тепер ви можете використовувати textAllCaps, щоб примусити всі обмеження.


14
атрибутів перегляду тексту, безумовно, не вистачає. було б добре призначити ttf і з папки атрибутів!
Натан Шверман

8
Один з відповідей на пов’язане питання пропонує 'android: textAllCaps = "true"' Це працювало для мене.
blaffie

@blaffie Дякую за оновлення. Я перевірю, чи працює Android: textAllCaps = "true".
Терранс

1
Це можна зробити за допомогою атрибута "textAllCaps", звідси і зворотний потік.
JaydeepW

1
Здається, що textAllCapsприклад збою програми, якщо ви вказали android:fontFamilyв themes.xml.
Алаа М.

142

Що про android: textAllCaps ?


8
@ larham1 Це атрибут xml, тому я не бачу, як ще можна його використовувати. Якщо не працює, повідомте про це в Google. Я припускаю, що він обмежений рівнем API 14, як setAllCaps (булева).
Мерфі

1
Я щойно це перевірив і він працює. У мене є зовнішній файл стилю
7heViking

1
@Murphy так, це проблема з версією. SDK 14 і вище для setAllCaps (); не ясно, коли XML був доданий, але я припускаю, SDK 14 також.
larham1

Це дивно, що textAllCaps працює в простому тестовому проекті, але коли представлення створюється всередині ArrayAdapter.getView (), це не так. Все працює: фон, textStyle тощо., Але textAllCaps це не так :(
Y2i

1
@JawadLeWywadi не можна використовувати цей атрибут xml перед API 14. Це потрібно зробити вручну в коді Java.
Мерфі

63

Використовуючи AppCompat textAllCaps в Android Apps, що підтримує більш старі API (менше 14)

Є один віджет інтерфейсу користувача, який постачається з AppCompat під назвою CompatTextView - це розширене користувальницьке 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 ~ Євген Печанець


Ви помітили внутрішнє в android.support.v7.internal? Внутрішнє, як у, можливо, більше не буде в наступній версії бібліотеки підтримки?
Емануель Моклін

1
Це круто! @EmanuelMoecklin Після того, як ви матимете це у своєму проекті, це не буде магічно запускати шлях.
Євген Печанець,

@eugen, звичайно, ви ніколи не оновлюєте бібліотеку підтримки до останньої версії, оскільки Google ніколи не додає нічого корисного, правда?
Емануель Моеклін

@EmanuelMoecklin Насправді я часто оновлююсь так швидко, він порушує свій код: DI повністю погоджуюся, що вам слід бути обережними щодо використання внутрішніх ресурсів, Але я просто поглянув на джерело appcompat-v7 і CompatTextViewвикористовується в ScrollingTabCointainerViewякому використовується ToolbarWidgetWrapper, що звучить досить новим і доки ім'я зберігає "v7" у своєму імені, це досить хороша гарантія для мене, що CompatTextViewвін залишиться там, де він є.
Євген Печанець

2
@EmanuelMoecklin Як це відбувається, CompatTextViewйого замінили AppCompatTextViewв останній бібліотеці appcompat-v7. Ви були цілком правильні.
Євген Печанець

30

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

У моєму випадку я не хотів мати theString.toUpperCase () скрізь у своєму коді, але мати централізоване місце для цього, тому що я мав деякі дії та перелічує макети елементів з TextViews, які там, де слід постійно писати великі літери (a заголовок) та інші, хто цього не зробив ... так ... деякі люди можуть подумати, що це надмірність, але я створив власний клас 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.


9

Я придумав рішення, подібне до 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) {}
    };
}

2

Схоже, є дозвіл на налаштування клавіатури для мобільних пристроїв, тому найпростіший спосіб зробити це:

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

сподіваюся, що це спрацює


1

Проект PixlUI дозволяє використовувати textAllCaps у будь-якому перегляді тексту або підкласі перегляду тексту, включаючи: Кнопку, прапорець правки AutoCompleteEditText AutoComplete RadioButton та кілька інших.

Вам потрібно буде створити свої текстові перегляди, використовуючи версію pixlui, а не ті, з джерела андроїда, тобто це потрібно зробити:

<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, а також шрифт для стилів, а не вимагати їх вбудованого тексту, як це робить оригінальний проект.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.