web-dev-qa-db-fra.com

Y a-t-il un moyen de styler un TextView pour mettre toutes ses lettres en majuscule?

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.

223
cottonBallPaws

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

Mise à jour

Vous pouvez maintenant utiliser textAllCaps pour forcer toutes les majuscules.

328
Terrance

Qu'en est-il de Android: textAllCaps ?

134
Murphy

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

59
LOG_TAG

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.

30
Oscar S.

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

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

2
Dhiren Hamal

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.

1
Matt Wolfe