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

239

Je voudrais pouvoir attribuer un attribut ou un style xml à un TextViewqui fera 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, pas à un TextView.

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

cottonBallPaws
la source
1
ni inputType = "textCapCharacters", textAllCaps = "true" ne fonctionne dans smasung famili ^^. J'ai ajouté TextWatcher à mon EditText qui couvre tous les mots
murt

Réponses:

359

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

Mettre à jour

Vous pouvez maintenant utiliser textAllCaps pour forcer toutes les majuscules.

Terrance
la source
14
les attributs textview font définitivement défaut. serait bien d'attribuer un ttf à partir du dossier d'attributs aussi!
Nathan Schwermann
8
L'une des réponses à la question liée suggère 'android: textAllCaps = "true"' Cela a fonctionné pour moi.
blaffie
@blaffie Merci pour la mise à jour. Je vais vérifier si android: textAllCaps = "true" fonctionne correctement.
Terrance
1
Vous pouvez le faire en utilisant l'attribut "textAllCaps", d'où le downvote.
JaydeepW
1
Il semble que l' textAllCapsapplication se bloque si vous l'avez spécifié android:fontFamilydans themes.xml.
Alaa M.
142

Qu'en est-il d' Android: textAllCaps ?

Murphy
la source
8
@ larham1 C'est un attribut xml donc je ne vois pas comment il peut être utilisé autrement. Si cela ne fonctionne pas, signalez-le à Google. Je suppose que c'est limité au niveau d'API 14 comme setAllCaps (booléen).
Murphy
1
Je viens de tester cela et cela fonctionne. J'ai un fichier de style externe
7heViking
1
@Murphy oui, c'est un problème de version. SDK 14 et supérieur pour setAllCaps (); pas clair quand le xml a été ajouté, mais je suppose que le SDK 14 aussi.
larham1
C'est étrange, textAllCaps fonctionne dans un projet de test simple, mais lorsque la vue est créée dans ArrayAdapter.getView (), ce n'est pas le cas. Tout fonctionne: background, textStyle, etc., mais textAllCaps ne fonctionne pas :(
Y2i
1
@JawadLeWywadi vous ne pouvez pas utiliser cet attribut xml avant l'API 14. Vous devez le faire manuellement en code Java.
Murphy
63

En utilisant AppCompat textAllCaps dans les applications Android prenant en charge les anciennes API (moins de 14)

Il existe un widget d'interface utilisateur fourni avec AppCompat nommé CompatTextView est une extension TextView personnalisée qui ajoute la prise en charge de textAllCaps

Pour les nouvelles API Android> 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

Mettre à jour:

En l'occurrence, CompatTextView a été remplacé par AppCompatTextView dans la dernière bibliothèque appcompat-v7 ~ Eugen Pechanec

LOG_TAG
la source
Avez-vous remarqué l'interne dans android.support.v7.internal? Interne comme dans peut-être plus dans la prochaine version de la bibliothèque de support?
Emanuel Moecklin
1
C'est génial! @EmanuelMoecklin Une fois que vous l'aurez dans votre projet, cela ne fonctionnera pas comme par magie.
Eugen Pechanec
@eugen bien sûr, vous ne mettez jamais à jour la bibliothèque de support vers la dernière version car Google n'ajoute jamais rien d'utile, non?
Emanuel Moecklin
@EmanuelMoecklin En fait, je mets souvent à jour si rapidement que cela casse mon code: DI est totalement d'accord que vous devriez vous méfier de l'utilisation des ressources internes MAIS je viens de jeter un coup d'œil à la source appcompat-v7 et CompatTextViewest utilisé dans ScrollingTabCointainerViewce qui est utilisé dans ToolbarWidgetWrapper, ce qui semble assez nouveau et tant que le nom conserve "v7" dans son nom, c'est une garantie suffisante pour moi que ça CompatTextViewva rester où il est.
Eugen Pechanec
2
@EmanuelMoecklin En l'occurrence, il a CompatTextViewété remplacé par AppCompatTextViewdans la dernière bibliothèque appcompat-v7. Vous aviez tout à fait raison.
Eugen Pechanec
30

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 disposition XML avec l' attribut textAllCaps , et la seule façon de le faire consiste à utiliser theString.toUpperCase () sur chacune des chaînes lorsque vous le faites un textViewXXX.setText (theString).

Dans mon cas, je ne voulais pas avoir theString.toUpperCase () partout dans mon code mais avoir un emplacement centralisé pour le faire parce que j'avais des activités et des listes d'éléments avec TextViews qui étaient censées être capitalisées tout le temps (un title) et d'autres qui ne l'ont pas ... alors ... certaines personnes peuvent penser que c'est une exagération, mais j'ai créé ma propre classe CapitalizedTextView étendant android.widget.TextView et j'ai remplacé 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, je dois simplement passer à TextView normal dans les fichiers de mise en page.

Maintenant, prenez en considération que j'ai fait cela parce que le concepteur de l'application voulait en fait ce texte (les titres) dans CAPS partout dans l'application, peu importe la capitalisation de contenu d'origine, et j'avais également d'autres TextViews normales où la capitalisation est venue avec le contenu réel .

Voici 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 en avez besoin, déclarez-le simplement avec tout le package dans la disposition 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 bonne façon de styliser du texte sur une TextView est d'utiliser une SpannableString , mais je pense que ce serait encore plus exagéré, sans parler de consommer plus de ressources, car vous instancierez une autre classe que TextView.

Oscar Salguero
la source
9

J'ai trouvé une solution similaire à celle de RacZo dans le fait que j'ai également créé une sous-classe TextViewqui gère la mise en majuscule du texte.

La différence est qu'au lieu de remplacer l'une des setText()méthodes, j'ai utilisé une approche similaire à ce que TextViewfait réellement l'API 14+ (qui est à mon avis une solution plus propre).

Si vous regardez dans la source , vous verrez l'implémentation de setAllCaps():

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

La AllCapsTransformationMethodclasse n'est pas (actuellement) publique, mais la source est également disponible . J'ai un peu simplifié cette classe (supprimé la setLengthChangesAllowed()méthode), 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) {}
    };
}
Natix
la source
2

Il semble qu'il y ait une autorisation sur le réglage du clavier mobile, donc la façon la plus simple de le faire est:

editText.setFilters(new InputFilter[]{new InputFilter.AllCaps()});

j'espère que cela fonctionnera

Dhiren Hamal
la source
1

Le projet PixlUI vous permet d'utiliser textAllCaps dans n'importe quelle visualisation de texte ou sous-classe de visualisation de texte, y compris: Button, EditText AutoCompleteEditText Checkbox RadioButton et plusieurs autres.

Vous devrez créer vos vues de texte en utilisant la version pixlui plutôt que celles de la source Android, ce qui signifie que vous devez le faire:

<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 / police personnalisée que vous mettez dans votre dossier d'actifs.

Je travaille sur un fork Gradle du framework PixlUI qui utilise gradle et permet de spécifier textAllCaps ainsi que la police de caractères des styles plutôt que de les exiger en ligne comme le fait le projet d'origine.

Matt Wolfe
la source