Esiste un modo per dare uno stile a TextView per mettere in maiuscolo tutte le sue lettere?


239

Vorrei essere in grado di assegnare un attributo o uno stile xml a uno TextViewche renderà qualsiasi testo abbia in TUTTE LE LETTERE DI CAPITALE.

Gli attributi android:inputType="textCapCharacters"e android:capitalize="characters"non fanno nulla e sembrano che siano per il testo inserito dall'utente, non a TextView.

Vorrei farlo in modo da poter separare lo stile dal contenuto. So che potrei farlo a livello di programmazione, ma di nuovo voglio mantenere lo stile fuori dal contenuto e dal codice.


1
né inputType = "textCapCharacters", textAllCaps = "true" funziona in smasung famili ^^. Ho aggiunto TextWatcher al mio EditText che
chiude

Risposte:


359

Ho pensato che fosse una richiesta abbastanza ragionevole, ma sembra che tu non possa farlo in questo momento. Che fallimento totale. lol

Aggiornare

Ora puoi usare textAllCaps per forzare tutti i limiti.


14
gli attributi di textview sono sicuramente carenti. sarebbe bello assegnare anche un ttf dalla cartella degli attributi!
Nathan Schwermann,

8
Una delle risposte alla domanda collegata suggerisce 'android: textAllCaps = "true"' Questo ha funzionato per me.
Blaffie,

@blaffie Grazie per l'aggiornamento. Controllerò per vedere se android: textAllCaps = "true" funziona correttamente.
Terrance

1
Puoi farlo usando l'attributo "textAllCaps", quindi il downvote.
JaydeepW

1
Sembra che textAllCapscausi l'arresto anomalo dell'app se specificato android:fontFamilyin themes.xml.
Alaa M.

142

Che dire di Android: textAllCaps ?


8
@ larham1 È un attributo xml, quindi non vedo come altro possa essere utilizzato. Se non funziona segnalalo a Google. Suppongo che sia limitato al livello API 14 come setAllCaps (booleano).
Murphy,

1
Ho appena provato questo e sta funzionando. Ho un file di stile esterno
7heViking,

1
@Murphy sì, questo è un problema di controllo delle versioni. SDK 14 e versioni successive per setAllCaps (); non è chiaro quando è stato aggiunto l'xml, ma presumo anche SDK 14.
larham1,

Questo è strano, textAllCaps funziona in un semplice progetto di test, ma quando la vista viene creata all'interno di ArrayAdapter.getView (), non lo fa. Tutto funziona: sfondo, textStyle, ecc., Ma textAllCaps non lo fa :(
Y2i

1
@JawadLeWywadi non puoi usare questo attributo xml prima dell'API 14. Devi farlo manualmente nel codice Java.
Murphy,

63

Utilizzando AppCompat textAllCaps in App Android che supportano API più vecchie (meno di 14)

Esiste un widget UI fornito con AppCompat denominato CompatTextView è un'estensione TextView personalizzata che aggiunge il supporto per textAllCaps

Per le nuove API Android> 14 puoi usare:

android:textAllCaps="true"

Un semplice esempio:

<android.support.v7.internal.widget.CompatTextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:textAllCaps="true"/>

Fonte: developer.android

Aggiornare:

In tal caso, CompatTextView è stato sostituito da AppCompatTextView nell'ultima libreria appcompat-v7 ~ Eugen Pechanec


Hai notato l'interno in android.support.v7.internal? Interno come in potrebbe non esserci più nella prossima versione della libreria di supporto?
Emanuel Moecklin,

1
Questo e spettacolare! @EmanuelMoecklin Una volta che lo hai nel tuo progetto, non funzionerà magicamente.
Eugen Pechanec,

@eugen ovviamente non aggiorni mai la libreria di supporto all'ultima versione poiché Google non aggiunge mai nulla di utile, giusto?
Emanuel Moecklin,

@EmanuelMoecklin In realtà spesso aggiorno così rapidamente che rompe il mio codice: DI sono pienamente d'accordo sul fatto che dovresti essere cauto nell'utilizzare le risorse interne MA ho appena dato un'occhiata alla fonte appcompat-v7 e CompatTextViewviene utilizzato in ScrollingTabCointainerViewcui viene utilizzato ToolbarWidgetWrapper, che suona piuttosto nuovo e fintanto che il nome mantiene "v7" nel suo nome, questa è una garanzia abbastanza buona per me CompatTextViewche rimarrà dove si trova.
Eugen Pechanec,

2
@EmanuelMoecklin A quanto pare è CompatTextViewstato sostituito AppCompatTextViewdall'ultima libreria appcompat-v7. Avevi ragione.
Eugen Pechanec,

30

È davvero molto deludente non poterlo fare con styles ( <item name="android:textAllCaps">true</item>) o su ogni file di layout XML con l' attributo textAllCaps e l'unico modo per farlo è in realtà utilizzare theString.toUpperCase () su ciascuna stringa quando lo fai un textViewXXX.setText (theString).

Nel mio caso, non volevo avere theString.toUpperCase () ovunque nel mio codice, ma avere un posto centralizzato per farlo perché avevo alcune attività ed elenca layout di elementi con TextViews che dovevano essere maiuscoli per tutto il tempo (un titolo) e altri che non ... quindi ... alcune persone potrebbero pensare che sia eccessivo, ma ho creato la mia classe CapitalizedTextView estendendo android.widget.TextView e sovrascrivendo il metodo setText capitalizzando il testo al volo.

Almeno, se il design cambia o devo rimuovere il testo in maiuscolo nelle versioni future, devo solo passare a TextView normale nei file di layout.

Ora, prendi in considerazione che l'ho fatto perché il Designer dell'App voleva davvero questo testo (i titoli) in CAPS su tutta l'App, indipendentemente dalla capitalizzazione del contenuto originale, e avevo anche altre normali TextView in cui la capitalizzazione arrivava con il contenuto effettivo .

Questa è 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);
    }

}

E ogni volta che devi usarlo, dichiaralo con tutto il pacchetto nel layout XML:

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

Alcuni sosterranno che il modo corretto di dare uno stile al testo su un oggetto TextView è usare uno SpannableString , ma penso che sarebbe un eccesso eccessivo, per non parlare del consumo di risorse maggiore, perché si crea un'istanza di un'altra classe rispetto a TextView.


9

Ho trovato una soluzione simile a quella di RacZo nel fatto che ho anche creato una sottoclasse di TextViewcui gestisce il testo in maiuscolo.

La differenza è che invece di ignorare uno dei setText()metodi, ho usato un approccio simile a quello che TextVieweffettivamente fa su API 14+ (che è a mio avviso una soluzione più pulita).

Se guardi alla fonte , vedrai l'implementazione di setAllCaps():

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

La AllCapsTransformationMethodclasse non è (attualmente) pubblica, ma è comunque disponibile anche la fonte . Ho semplificato un po 'quella classe (rimosso il setLengthChangesAllowed()metodo), quindi la soluzione completa è questa:

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

2

Sembra che ci sia l'autorizzazione per l'impostazione della tastiera mobile, quindi il modo più semplice per farlo è:

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

spero che questo funzionerà


1

Il progetto PixlUI ti consente di utilizzare textAllCaps in qualsiasi visualizzazione di testo o sottoclasse di visualizzazione di testo, tra cui: Pulsante, Modifica testo Completamento automatico Modifica testo Casella di controllo RadioButton e molti altri.

Dovrai creare le tue visualizzazioni di testo usando la versione pixlui anziché quelle della sorgente Android, il che significa che devi fare questo:

<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 ti consente anche di impostare un carattere / carattere personalizzato da inserire nella cartella delle risorse.

Sto lavorando su un fork Gradle del framework PixlUI che utilizza il gradle e consente di specificare textAllCaps e il carattere tipografico dagli stili piuttosto che richiederli in linea come fa il progetto originale.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.