¿Hay alguna manera de aplicar un estilo TextView a todas sus letras en mayúsculas?


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

Los atributos android:inputType="textCapCharacters" y android:capitalize="characters" no hacen nada y parecen ser para el texto introducido por el usuario, no un 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.

Author: LOG_TAG, 2010-12-14

7 answers

Pensé que era una petición bastante razonable, pero parece que no puedes hacerlo en este momento. Qué Fracaso Total. lol

Actualizar

Ahora puede usar textAllCaps forzar todas las mayúsculas.

 303
Author: Terrance,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:03:02

¿Qué pasa con android: textAllCaps ?

 128
Author: Murphy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-16 07:49:26

Usando AppCompat textAllCaps en las aplicaciones de Android que admiten API más antiguas (menos de 14)

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

Para la nueva API de Android > 14 puede usar:

android:textAllCaps="true"

Un ejemplo sencillo:

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

Fuente:desarrollador.android

Actualización:

Como sucede, CompatTextView fue reemplazado por AppCompatTextView en latest appcompat-v7 library ~ Eugen Pecanec

 52
Author: LOG_TAG,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-09 14:54:02

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 manera de hacerlo es realmente usando theString.toUpperCase () en cada una de las cadenas cuando se hace un textViewXXX.setText (theString).

En mi caso, yo no quería tener theString.toUpperCase () en todas partes de mi código, pero tener un centralizado lugar para hacerlo porque tenía algunas Actividades y listas de diseños de elementos con TextViews que donde se supone que debe ser mayúscula todo el tiempo (un título) y otros que no lo hizo... tan... algunas personas pueden pensar que es un exceso, pero he creado 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 necesito eliminar el texto en mayúsculas en futuras versiones, solo necesito cambiar a TextView normal en los archivos de diseño.

Ahora, toma teniendo 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 del contenido original, y también tenía otras vistas de texto normales donde la capitalización venía 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 declararlo 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 estilo de texto en un TextView es usar un Control de calidad, pero creo que eso sería incluso una exageración mayor, por no mencionar que consume más recursos porque estarás instanciando otra clase que TextView.

 29
Author: Oscar Salguero,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-29 23:55:24

Se me ocurrió una solución que es similar a la de RacZo en el hecho de que también he creado una subclase de TextView que se encarga de hacer el texto en mayúsculas.

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

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

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

La clase AllCapsTransformationMethod es no es (actualmente) pública, pero aún así, la fuente también está disponible . He simplificado un poco esa clase (eliminé el método setLengthChangesAllowed()), así 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) {}
    };
}
 7
Author: Natix,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-05 13:53:00

PixlUI proyecto le permite utilizar textAllCaps en cualquier textview o subclase de textview incluyendo: Botón, EditText AutoCompleteEditText Casilla RadioButton y varios otros.

Tendrá que crear sus textviews usando la versión pixlui en lugar de las de la fuente de Android, lo que significa que tiene que 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 ponga en su carpeta assets.

Estoy trabajando en un Gradle fork de el framework 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.

 0
Author: Matt Wolfe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-06-12 07:23:50

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

 0
Author: Dhiren Hamal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-02 06:09:00