J'aimerais pouvoir attribuer un attribut ou un style XML à un TextView
qui créera le texte qu'il contient dans TOUTES LES LETTRES MAJUSCULES.
Les attributs Android:inputType="textCapCharacters"
et Android:capitalize="characters"
ne font rien et semblent être du texte saisi par l'utilisateur, pas un TextView
.
J'aimerais faire cela afin de pouvoir séparer le style du contenu. Je sais que je pourrais le faire par programmation, mais encore une fois, je veux que le style reste en dehors du contenu et du code.
Je pensais que c’était une demande assez raisonnable mais on dirait que vous ne pouvez pas le faire pour le moment. Quel échec total. lol
Vous pouvez maintenant utiliser textAllCaps pour forcer toutes les majuscules.
Qu'en est-il de Android: textAllCaps ?
En utilisant AppCompat textAllCaps
dans Android Applications prenant en charge les anciennes API (moins de 14)
Un widget d'interface utilisateur livré avec AppCompat nommé CompatTextView est une extension Custom TextView qui ajoute la prise en charge de textAllCaps.
Pour les nouvelles Android API> 14, vous pouvez utiliser:
Android:textAllCaps="true"
Un exemple simple:
<Android.support.v7.internal.widget.CompatTextView
Android:id="@+id/text"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
app:textAllCaps="true"/>
Source: developer.Android
Mise à jour:
En l'occurrence, CompatTextView a été remplacé par AppCompatTextView dans la dernière version bibliothèque appcompat-v7 ~ Eugen Pechanec
Il est vraiment très décevant que vous ne puissiez pas le faire avec des styles (<item name="Android:textAllCaps">true</item>
) ou sur chaque fichier de présentation XML avec l’attribut textAllCaps , et le seul moyen de le faire consiste à utiliser theString.toUpperCase () sur chacune des chaînes lorsque vous effectuez textViewXXX.setText (theString).
Dans mon cas, je ne voulais pas avoir theString.toUpperCase () partout dans mon code mais un endroit centralisé pour le faire parce que j'avais Les activités et les listes d'éléments de disposition avec TextViews qui étaient supposées être capitalisées tout le temps (un titre) et d'autres qui ne le savaient pas ... alors ... certaines personnes peuvent penser que c'est une surcharge, mais j'ai créé ma propre classe CapitalizedTextView qui s'étend - Android.widget.TextView et substitué la méthode setText en capitalisant le texte à la volée.
Au moins, si la conception change ou si je dois supprimer le texte en majuscule dans les versions futures, il me suffit de passer à TextView normal dans les fichiers de présentation.
Maintenant, prenez en considération le fait que je l'ai fait parce que le concepteur de l'application souhaitait réellement ce texte (les titres) en majuscules partout dans l'application, quelle que soit la capitalisation du contenu d'origine. .
C'est la 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);
}
}
Et chaque fois que vous avez besoin de l’utiliser, déclarez-le simplement avec tout le paquet dans la mise en page XML:
<com.realactionsoft.Android.widget.CapitalizedTextView
Android:id="@+id/text_view_title"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content" />
Certains diront que la façon correcte de styliser du texte sur un TextView est d’utiliser un SpannableString, mais je pense que ce serait même une surcharge excessive, sans parler de plus de ressources, car vous allez instancier une autre classe que TextView.
J'ai mis au point une solution similaire à celle de RacZo dans le fait que j'ai également créé une sous-classe de TextView
qui gère la mise en majuscule du texte.
La différence est qu'au lieu de remplacer l'une des méthodes setText()
, j'ai utilisé une approche similaire à celle utilisée par la TextView
sur l'API 14+ (qui, à mon point de vue, est une solution plus propre). .
Si vous regardez dans le source , vous verrez l'implémentation de setAllCaps()
:
public void setAllCaps(boolean allCaps) {
if (allCaps) {
setTransformationMethod(new AllCapsTransformationMethod(getContext()));
} else {
setTransformationMethod(null);
}
}
La classe AllCapsTransformationMethod
n'est pas (actuellement) publique, mais la source est également disponible . J'ai un peu simplifié cette classe (en supprimant la méthode setLengthChangesAllowed()
), donc la solution complète est la suivante:
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) {}
};
}
Il semble qu'il existe une autorisation sur le réglage du clavier mobile. Le moyen le plus simple de procéder consiste à:
editText.setFilters(new InputFilter[]{new InputFilter.AllCaps()});
espérons que cela fonctionnera
PixlUI projet vous permet d’utiliser textAllCaps dans n’importe quel textview ou sous-classe de textview, notamment: Button, EditText AutoCompleteEditText Checkbox RadioButton et plusieurs autres.
Vous devrez créer vos vues de texte en utilisant la version de pixlui plutôt que celles de la source Android, ce qui signifie que vous devez procéder comme suit:
<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 vous permet également de définir une police de caractère personnalisée que vous placez dans votre dossier de ressources.
Je travaille sur un Gradle fork du framework PixlUI qui utilise gradle et permet de spécifier textAllCaps ainsi que la police de caractères à partir de styles plutôt que de les exiger en ligne comme le projet original.