¿Hay alguna manera de diseñar un TextView para poner en mayúscula todas sus letras?

239

Me gustaría poder asignar un atributo o estilo xml a un TextView texto que haga cualquier texto que tenga en TODAS LAS LETRAS MAYÚSCULAS.

Los atributos android:inputType="textCapCharacters"y android:capitalize="characters"no hacen nada y parecen ser para texto insertado por el usuario, no a TextView.

Me gustaría hacer esto para poder separar el estilo del contenido. Sé que podría hacer esto programáticamente, pero nuevamente quiero mantener el estilo fuera del contenido y el código.

cottonBallPaws
fuente
1
ni inputType = "textCapCharacters", textAllCaps = "true" funciona en smasung famili ^^. He agregado TextWatcher a mi EditText que capsula todas las palabras
murt

Respuestas:

359

Pensé que era una solicitud bastante razonable, pero parece que no puedes hacerlo en este momento.¡Qué fracaso total! jajaja

Actualizar

Ahora puede usar textAllCaps para forzar todas las mayúsculas.

Terrance
fuente
14
los atributos de vista de texto definitivamente faltan. ¡sería bueno asignar un ttf desde la carpeta de atributos también!
Nathan Schwermann
8
Una de las respuestas a la pregunta vinculada sugiere 'android: textAllCaps = "true"' Esto funcionó para mí.
blaffie
@blaffie Gracias por la actualización. Comprobaré si android: textAllCaps = "true" funciona correctamente.
Terrance
1
Puede hacerlo utilizando el atributo "textAllCaps", de ahí el voto negativo.
JaydeepW
1
Parece textAllCapscausas cierre de la aplicación si se ha especificado android:fontFamilyen themes.xml.
Alaa M.
142

¿Qué pasa con android: textAllCaps ?

Murphy
fuente
8
@ larham1 Es un atributo xml, así que no veo cómo se puede usar. Si no funciona, informe a Google. Supongo que está limitado al nivel de API 14 como setAllCaps (boolean).
Murphy
1
Acabo de probar esto y está funcionando. Tengo un archivo de estilo externo
7heViking el
1
@Murphy sí, este es un problema de versiones. SDK 14 y superior para setAllCaps (); no está claro cuándo se agregó el xml, pero también supongo el SDK 14.
larham1
Esto es extraño, textAllCaps funciona en un proyecto de prueba simple, pero cuando la vista se crea dentro de ArrayAdapter.getView (), no lo hace. Todo funciona: fondo, textStyle, etc., pero textAllCaps no :(
Y2i
1
@JawadLeWywadi no puede usar este atributo xml antes de la API 14. Debe hacerlo manualmente en el código Java.
Murphy
63

Al usar AppCompat textAllCaps en aplicaciones de Android que admiten API antiguas (menos de 14)

Hay un widget de interfaz de usuario que se incluye con AppCompat llamado CompatTextView es una extensión de TextView personalizada que agrega soporte para textAllCaps

Para la nueva API de Android> 14 puede usar:

android:textAllCaps="true"

Un simple ejemplo:

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

Fuente: developer.android

Actualizar:

Mientras sucede, CompatTextView fue reemplazado por AppCompatTextView en la última biblioteca de appcompat-v7 ~ Eugen Pechanec

LOG_TAG
fuente
¿Notó el interno en android.support.v7.internal? ¿Interna como podría no estar más en la próxima versión de la biblioteca de soporte?
Emanuel Moecklin
1
¡Esto es asombroso! @EmanuelMoecklin Una vez que lo tenga en su proyecto, no se ejecutará mágicamente.
Eugen Pechanec
@eugen, por supuesto, nunca actualiza la biblioteca de soporte a la última versión ya que Google nunca agrega nada útil, ¿verdad?
Emanuel Moecklin
@EmanuelMoecklin En realidad, a menudo actualizo tan rápido que rompe mi código: estoy totalmente de acuerdo en que debes tener cuidado con el uso de recursos internos, PERO acabo de echar un vistazo a la fuente appcompat-v7 y CompatTextViewse usa en la ScrollingTabCointainerViewque se usa ToolbarWidgetWrapper, que suena bastante nuevo y siempre que el nombre mantenga "v7" en su nombre, esta es una garantía suficientemente buena para mí que CompatTextViewse quedará donde está.
Eugen Pechanec
2
@EmanuelMoecklin Como sucedió, CompatTextViewfue reemplazado por la AppCompatTextViewúltima biblioteca appcompat-v7. Estabas en lo correcto.
Eugen Pechanec
30

Es realmente muy decepcionante que no pueda hacerlo con estilos ( <item name="android:textAllCaps">true</item>) o en cada archivo de diseño XML con el atributo textAllCaps , y la única forma de hacerlo es usar theString.toUpperCase () en cada una de las cadenas cuando lo hace un textViewXXX.setText (theString).

En mi caso, no quería tener theString.toUpperCase () en todas partes de mi código, sino tener un lugar centralizado para hacerlo porque tenía algunas Actividades y diseños de elementos de lista con TextViews que se suponía que se capitalizaban todo el tiempo (un título) y otros que no lo hicieron ... entonces ... algunas personas pueden pensar que es una exageración, pero creé mi propia clase CapitalizedTextView extendiendo android.widget.TextView y anulé el método setText capitalizando el texto sobre la marcha.

Al menos, si el diseño cambia o si necesito eliminar el texto en mayúscula en futuras versiones, solo necesito cambiar a TextView normal en los archivos de diseño.

Ahora, tenga en cuenta que hice esto porque el Diseñador de la aplicación realmente quería este texto (los títulos) en MAYÚSCULAS en toda la aplicación sin importar la capitalización de contenido original, y también tenía otras TextViews normales donde la capitalización vino con el contenido real .

Esta es la clase:

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

}

Y siempre que necesite usarlo, simplemente declare con todo el paquete en el diseño XML:

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

Algunos argumentarán que la forma correcta de diseñar el texto en un TextView es usar una SpannableString , pero creo que sería una exageración aún mayor, sin mencionar que consumirá más recursos porque creará una instancia de otra clase que TextView.

Oscar Salguero
fuente
9

Se me ocurrió una solución que es similar a la de RacZo en el hecho de que también he creado una subclase TextViewque maneja el uso de mayúsculas en el texto.

La diferencia es que, en lugar de anular uno de los setText()métodos, he usado un enfoque similar a lo queTextView realmente hace en API 14+ (que es, desde mi punto de vista, una solución más limpia).

Si observa la fuente , verá la implementación de setAllCaps():

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

La AllCapsTransformationMethodclase no es (actualmente) pública, pero aún así, la fuente también está disponible . He simplificado un poco esa clase (eliminé el setLengthChangesAllowed()método), por lo que la solución completa es 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
fuente
2

Parece que hay permiso en la configuración del teclado móvil, por lo que la forma más fácil de hacerlo es:

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

espero que esto funcione

Dhiren Hamal
fuente
1

El proyecto PixlUI le permite usar textAllCaps en cualquier vista de texto o subclase de vista de texto, incluyendo: Botón, EditarTexto AutocompletarEditarText Checkbox RadioButton y varios otros.

Deberá crear sus vistas de texto utilizando la versión pixlui en lugar de las de la fuente de Android, lo que significa que debe hacer esto:

<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 también le permite establecer un tipo de letra / fuente personalizado que coloca en su carpeta de activos.

Estoy trabajando en una bifurcación Gradle del marco PixlUI que usa gradle y permite especificar textAllCaps, así como el tipo de letra de los estilos en lugar de requerirlos en línea como lo hace el proyecto original.

Matt Wolfe
fuente