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

j'aimerais pouvoir attribuer un attribut ou un style xml à un TextView qui fera n'importe quel texte qu'il a dans toutes les lettres majuscules.

attributs android:inputType="textCapCharacters" et android:capitalize="characters" ne rien faire et regarder comme ils sont pour l'utilisateur entrées de texte, pas un TextView .

je voudrais faire cela pour que je puisse séparer le style du contenu. Je sais que je pourrais le faire de manière programmée mais encore une fois je veux garder le style hors du contenu et de la code.

208
demandé sur LOG_TAG 2010-12-14 02:43:07

7 réponses

je pensais que c'était une requête raisonnable mais il semble que vous ne pouvez pas le faire en ce moment. quel échec total. lol

mise à Jour

Vous pouvez maintenant utiliser textAllCaps pour forcer toutes les casquettes.

303
répondu Terrance 2017-05-23 12:03:02

Qu'en est-il android:textAllCaps ?

128
répondu Murphy 2015-01-16 07:49:26

en utilisant AppCompat textAllCaps dans les applications Android supportant des API plus anciennes (moins de 14)

il y a un widget UI que les navires avec AppCompat nommé CompatTextView est une extension TextView personnalisée qui ajoute le soutien pour textAllCaps

pour la nouvelle 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: développeur.Android

mise à jour:

comme il se trouve que CompatTextView a été remplacé par AppCompatTextView en dernier appcompat-V7 library ~ Eugen Pechanec

52
répondu LOG_TAG 2016-07-09 14:54:02

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

dans mon cas, je ne voulais pas avoir la corde.toUpperCase() partout dans mon code, mais d'avoir une centralisé l'endroit pour le faire parce que j'ai eu quelques activités et liste des layouts d'articles avec des vues de texte qui étaient censés être capitalisés tout le temps (un titre) et d'autres qui ne l'ont pas fait... si... certaines personnes pensent peut-être que c'est exagéré, mais j'ai créé ma propre classe CapitalizedTextView prolongeant android.widget.TextView et outrepasse la méthode setText en capitalisant le texte à la volée.

au moins, si la conception change ou je dois supprimer le texte en majuscules dans les versions futures, je il suffit de passer à TextView normal dans les fichiers de mise en page.

maintenant, prendre en considération que j'ai fait cela parce que le concepteur de L'application voulait réellement ce texte (les titres) en majuscules partout dans L'application, peu importe la capitalisation du contenu original, et aussi j'ai eu D'autres TextViews normales où la capitalisation est venue 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 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 un texte sur un TextView est d'utiliser un SpannableString , mais je pense que ce serait encore plus exagéré, sans parler de plus de consommation de ressources parce que vous instancierez une autre classe que TextView.

29
répondu Oscar Salguero 2012-05-29 23:55:24

j'ai trouvé une solution qui est similaire à celle de RacZo dans le fait que j'ai aussi créé une sous-classe de TextView qui s'occupe de rendre le texte majuscule.

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

si vous regardez dans le source , vous verrez la mise en œuvre 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 aussi disponible . J'ai un peu simplifié cette classe (j'ai supprimé 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) {}
    };
}
7
répondu Natix 2013-09-05 13:53:00

PixlUI le projet vous permet d'utiliser textAllCaps dans n'importe quel textview ou sous-classe de textview y compris: Bouton, EditText Autocompletedittext Case RadioButton et plusieurs autres.

vous aurez besoin de créer vos textviews en utilisant la version pixlui plutôt que ceux 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 un caractère personnalisé / police que vous mettez dans votre dossier des actifs.

je travaille sur un Grad fourche du cadre PixlUI qui utilise Grad et permet de spécifier textAllCaps ainsi que la police de styles plutôt que de Les exiger en ligne comme le fait le projet original.

0
répondu Matt Wolfe 2014-06-12 07:23:50

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

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

espère que cela va fonctionner

0
répondu Dhiren Hamal 2017-02-02 06:09:00