260 votes

Existe-t-il un moyen de styliser un TextView pour mettre en majuscule toutes ses lettres?

Je voudrais pouvoir attribuer un attribut ou un style xml à un TextView qui produira le texte qu'il contient dans TOUTES LES LETTRES MAJUSCULES.

Les attributs android:inputType="textCapCharacters" et android:capitalize="characters" ne font rien et ressemblent à du texte saisi par l'utilisateur, et non à un TextView .

Je voudrais le faire pour séparer le style du contenu. Je sais que je pourrais le faire par programmation, mais encore une fois, je veux garder le style hors du contenu et du code.

379voto

Terrance Points 5384

Je pensais que c'était une demande assez raisonnable, mais on dirait que vous ne pouvez pas le faire en ce moment. Quel échec total. lol

Mettre à jour

Vous pouvez maintenant utiliser textAllCaps pour forcer tous les majuscules.

150voto

Murphy Points 1808

68voto

LOG_TAG Points 4506

En utilisant AppCompat textAllCaps dans les Applications Android de support des anciennes API (moins de 14)

Il est l'un de widgets qui est livré avec AppCompat nommé CompatTextView est une Coutume TextView extension qui ajoute le support pour textAllCaps

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 de:développeur.android

30voto

RacZo Points 5731

Il est vraiment très décevant de constater que vous ne pouvez pas le faire avec des styles (<item name="android:textAllCaps">true</item>) ou sur chaque XML fichier de mise en page avec le textAllCaps attribut, et la seule façon de le faire est en fait l'utilisation de theString.toUpperCase() sur chacune des chaînes lorsque vous faites un textViewXXX.setText(theString).

Dans mon cas, je n'ai pas voulu avoir theString.toUpperCase() partout dans mon code, mais d'avoir une centralisé endroit pour le faire parce que j'avais des Activités et des listes d'éléments de mise en page TextViews que où censé être capitalisés tout le temps (un titre) et d'autres qui n'ont pas... alors... certaines personnes peuvent penser est un exagéré, mais j'ai créé mon propre CapitalizedTextView classe étendant android.widget de.TextView et emportait la méthode setText capitaliser le texte à la volée.

Au moins, si les modifications de conception ou j'ai besoin de supprimer le texte majuscule dans les futures versions, j'ai juste besoin de changement à la normale TextView dans les fichiers de mise en page.

Maintenant, prenez en considération que j'ai fait cela parce que l'Application de créateurs voulaient réellement ce texte (titres) en MAJUSCULES partout dans l'Application, peu importe le contenu original de la capitalisation, et aussi, j'ai eu d'autres TextViews où la capitalisation est venu avec le contenu réel.

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 quand vous avez besoin de l'utiliser, il suffit de déclarer avec tout le paquet dans le fichier XML du layout:

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

Certains feront valoir que la façon correcte de style de texte sur un TextView est d'utiliser un SpannableString, mais je pense que ce serait encore plus exagéré, pour ne pas mentionner plus consommatrices de ressources parce que vous serez l'instanciation d'une autre classe que TextView.

9voto

Natix Points 4421

Je suis venu avec une solution qui est similaire avec RacZo dans le fait que j'ai également créé une sous-classe de TextView qui s'occupe de rendre le texte en majuscules.

La différence est qu'au lieu d'annuler l'un de l' setText() méthodes, j'ai utilisé une approche similaire à ce que l' TextView fait réellement sur l'API 14+ (qui est, à mon point de vue, une solution plus propre).

Si vous recherchez dans la source, vous verrez la mise en œuvre de l' setAllCaps():

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

L' AllCapsTransformationMethod de la classe n'est pas (actuellement) public, mais encore, la source est également disponible. J'ai simplifié la classe un peu (plus d' setLengthChangesAllowed() méthode), de sorte que la solution complète est ceci:

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X