example - uppercase android
¿Hay una manera de diseñar un TextView para escribir en mayúsculas todas sus letras? (7)
¿Qué pasa con android:textAllCaps ?
Me gustaría poder asignar un atributo o estilo xml a un TextView
que hará cualquier texto que tenga en TODAS LAS LETRAS DE CAPITAL.
Los atributos android:inputType="textCapCharacters"
y android:capitalize="characters"
no hacen nada y parecen ser para el texto TextView
por el usuario, no para un TextView
.
Me gustaría hacer esto para poder separar el estilo del contenido. Sé que podría hacer esto mediante programación, pero nuevamente quiero mantener el estilo fuera del contenido y el código.
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 en realidad usa theString.toUpperCase () en cada una de las cadenas cuando haces 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 listas de diseños de elementos con TextViews que se suponían en mayúsculas todo el tiempo (un título) y otros que no ... así que ... algunas personas pueden pensar que es una exageración, pero yo 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 necesito eliminar el texto en mayúsculas en versiones futuras, 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 en realidad quería este texto (los títulos) en todas las aplicaciones, independientemente de la capitalización del contenido original, y también tuve otras vistas de texto normales en las que 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 cuando 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 aplicar estilo al texto en un TextView es usar una SpannableString , pero creo que eso sería un exceso excesivo, sin mencionar que consumirá más recursos porque estará creando una instancia de otra clase que no sea TextView.
He encontrado una solución similar a la de RacZo en el hecho de que también he creado una subclase de TextView
que maneja el texto en mayúsculas.
La diferencia es que, en lugar de anular uno de los métodos setText()
, he utilizado un enfoque similar al de TextView
en API 14+ (que en mi punto de vista es una solución más limpia).
Si observa la source , verá la implementación de setAllCaps()
:
public void setAllCaps(boolean allCaps) {
if (allCaps) {
setTransformationMethod(new AllCapsTransformationMethod(getContext()));
} else {
setTransformationMethod(null);
}
}
La clase AllCapsTransformationMethod
no es (actualmente) pública, pero aún así, la fuente también está available . He simplificado esa clase un poco ( setLengthChangesAllowed()
método setLengthChangesAllowed()
), por lo que la solución completa es la siguiente:
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) {}
};
}
Parece que hay permiso en la configuración del teclado móvil, por lo que la forma más sencilla de hacerlo es:
editText.setFilters(new InputFilter[]{new InputFilter.AllCaps()});
espero que esto funcione
Pensé que era una solicitud bastante razonable pero parece que no puedes hacerlo en este momento. Qué fracaso total. jajaja
Actualizar
Ahora puedes usar textAllCaps para forzar todas las mayúsculas.
Usando AppCompat textAllCaps
en aplicaciones de Android que admiten API''s más antiguas (menos de 14)
Hay un widget de UI que viene con AppCompat llamado CompatTextView, es una extensión de TextView personalizada que agrega soporte para textAllCaps
Para la API de Android más nueva> 14 puedes usar:
android:textAllCaps="true"
Un ejemplo simple:
<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:
Como sucede, CompatTextView fue reemplazado por AppCompatTextView en la última biblioteca de appcompat-v7 ~ Eugen Pechanec
PixlUI proyecto PixlUI permite usar textAllCaps en cualquier vista de texto o subclase de vista de texto, incluyendo: Botón, EditarTexto AutocompletarEditarTexto Casilla de verificación 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 coloque en su carpeta de activos.
Estoy trabajando en una bifurcación Gradle del marco PixlUI que utiliza 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.