Existe uma maneira de estilizar um TextView para maiúsculas todas as suas letras?

239

Eu gostaria de poder atribuir um atributo ou estilo xml a um TextViewque criará o texto que tiver em TODAS AS LETRAS MAIÚSCULAS.

Os atributos android:inputType="textCapCharacters"e android:capitalize="characters"não fazer nada e olhar como eles são para o texto inputed usuário, não um TextView.

Gostaria de fazer isso para separar o estilo do conteúdo. Eu sei que poderia fazer isso programaticamente, mas, novamente, quero manter o estilo fora do conteúdo e do código.

cottonBallPaws
fonte
1
nem inputType = "textCapCharacters", textAllCaps = "true" funciona na família destruída ^^. Adicionei o TextWatcher ao meu EditText que limita todas as palavras
murt 11/08

Respostas:

359

Eu pensei que era uma solicitação bastante razoável, mas parece que você não pode fazer isso no momento. Que falha total. ri muito

Atualizar

Agora você pode usar textAllCaps para forçar todos os limites.

Terrance
fonte
14
definitivamente faltam atributos de visualização de texto. seria bom atribuir um ttf da pasta de atributos também!
Nathan Schwermann
8
Uma das respostas da pergunta vinculada sugere 'android: textAllCaps = "true"' Isso funcionou para mim.
blaffie
@blaffie Obrigado pela atualização. Vou verificar se o android: textAllCaps = "true" funciona corretamente.
Terrance
1
Você pode fazer isso usando o atributo "textAllCaps", daí o voto negativo.
precisa saber é o seguinte
1
Parece textAllCapscausas aplicativo para falhar se você especificado android:fontFamilyno themes.xml.
Alaa M.
142

E o android: textAllCaps ?

Murphy
fonte
8
@ larham1 É um atributo xml, portanto não vejo de que outra forma ele pode ser usado. Se não estiver funcionando, denuncie ao Google. Suponho que seja limitado ao nível da API 14, como setAllCaps (booleano).
Murphy
1
Acabei de testar isso e está funcionando. Eu tenho um arquivo de estilo externa
7heViking
1
@ Murphy sim, este é um problema de controle de versão. SDK 14 e superior para setAllCaps (); não está claro quando o xml foi adicionado, mas eu assumo o SDK 14 também.
larham1
Isso é estranho, textAllCaps funciona em um projeto de teste simples, mas quando a exibição é criada dentro de ArrayAdapter.getView (), isso não acontece. Tudo funciona: plano de fundo, textStyle, etc., mas textAllCaps não :(
Y2i 9/13
1
@JawadLeWywadi, você não pode usar esse atributo xml antes da API 14. É necessário fazê-lo manualmente no código Java.
Murphy
63

Usando AppCompat textAllCaps em aplicativos Android compatíveis com APIs antigas (menos de 14)

Há um widget de interface do usuário que acompanha o AppCompat chamado CompatTextView é uma extensão Personalizada do TextView que adiciona suporte para textAllCaps

Para uma API Android mais recente> 14, você pode usar:

android:textAllCaps="true"

Um exemplo simples:

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

Fonte: developer.android

Atualizar:

Por acaso, o CompatTextView foi substituído pelo AppCompatTextView na biblioteca appcompat-v7 mais recente ~ Eugen Pechanec

LOG_TAG
fonte
Você notou o interno em android.support.v7.internal? Interno como pode não existir mais na próxima versão da biblioteca de suporte?
Emanuel Moecklin
1
Isso é incrível! @EmanuelMoecklin Depois de tê-lo em seu projeto, ele não funcionará magicamente.
Eugen Pechanec
@eugen, é claro que você nunca atualiza a biblioteca de suporte para a versão mais recente, pois o Google nunca adiciona nada de útil, certo?
Emanuel Moecklin
@EmanuelMoecklin Na verdade, eu sempre atualizo tão rapidamente que quebra meu código: Eu concordo totalmente que você deve ter cuidado com o uso de recursos internos, mas apenas dei uma olhada no appcompat-v7 source e CompatTextViewé usado no ScrollingTabCointainerViewqual é usado ToolbarWidgetWrapper, o que soa bem novo e contanto que o nome mantenha "v7" em seu nome, isso é uma garantia suficiente para mim CompatTextViewe permanecerá onde está.
Eugen Pechanec
2
@EmanuelMoecklin Por acaso, CompatTextViewfoi substituído pela AppCompatTextViewúltima biblioteca appcompat-v7. Você estava certo.
Eugen Pechanec
30

É realmente muito decepcionante que você não possa fazê-lo com styles ( <item name="android:textAllCaps">true</item>) ou em cada arquivo de layout XML com o atributo textAllCaps , e a única maneira de fazê-lo é realmente usando theString.toUpperCase () em cada uma das strings quando você o faz. um textViewXXX.setText (theString).

No meu caso, eu não queria ter theString.toUpperCase () em qualquer lugar do meu código, mas ter um local centralizado para isso, porque eu tinha algumas atividades e lista layouts de itens com TextViews que deveriam estar em maiúsculas o tempo todo (um title) e outros que não o fizeram ... então ... algumas pessoas podem pensar que é um exagero, mas eu criei minha própria classe CapitalizedTextView estendendo android.widget.TextView e substitui o método setText colocando o texto em maiúscula.

Pelo menos, se o design mudar ou precisar remover o texto em maiúsculas em versões futuras, só preciso mudar para o TextView normal nos arquivos de layout.

Agora, considere que eu fiz isso porque o Designer do aplicativo realmente queria esse texto (os títulos) no CAPS em todo o aplicativo, independentemente da capitalização de conteúdo original, e também tive outros TextViews normais em que a capitalização veio com o conteúdo real .

Esta é a classe:

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

}

E sempre que você precisar usá-lo, apenas declare-o com todo o pacote no layout XML:

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

Alguns argumentam que a maneira correta de estilizar o texto em um TextView é usar um SpannableString , mas acho que isso seria um exagero ainda maior, além de consumir mais recursos, porque você instanciará outra classe que o TextView.

Oscar Salguero
fonte
9

Eu vim com uma solução semelhante à do RacZo, no fato de que eu também criei uma subclasse TextViewque lida com tornar o texto em maiúsculas.

A diferença é que, em vez de substituir um dos setText()métodos, usei uma abordagem semelhante à que TextViewrealmente faz na API 14+ (que é, no meu ponto de vista, uma solução mais limpa).

Se você procurar a fonte , verá a implementação de setAllCaps():

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

A AllCapsTransformationMethodclasse não é (atualmente) pública, mas ainda assim, a fonte também está disponível . Simplifiquei um pouco essa classe (removi o setLengthChangesAllowed()método), então a solução completa é esta:

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) {}
    };
}
Natix
fonte
2

Parece que há permissão na configuração do teclado móvel, portanto, a maneira mais fácil de fazer isso é:

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

espero que isso funcione

Dhiren Hamal
fonte
1

O projeto PixlUI permite que você use textAllCaps em qualquer visualização de texto ou subclasse de visualização de texto, incluindo: Botão, EditText AutoCompleteEditText Caixa de seleção RadioButton e vários outros.

Você precisará criar suas visualizações de texto usando a versão pixlui, e não as da fonte android, o que significa que você deve fazer isso:

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

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

O PixlUI também permite definir um tipo / fonte personalizado que você coloca na sua pasta de ativos.

Estou trabalhando em uma bifurcação Gradle da estrutura PixlUI que usa gradle e permite especificar textAllCaps, bem como o tipo de letra dos estilos, em vez de exigi-los em linha, como o projeto original.

Matt Wolfe
fonte