Gibt es eine Möglichkeit, eine Textansicht so zu gestalten, dass alle Buchstaben in Großbuchstaben geschrieben werden?

239

Ich möchte in der Lage sein, einem XML-Attribut oder -Stil ein XML-Attribut oder einen XML-Stil zuzuweisen TextView, der den Text in ALLEN GROSSBUCHSTABEN enthält.

Die Attribute android:inputType="textCapCharacters"und android:capitalize="characters"tun nichts und sehen so aus, als wären sie für vom Benutzer eingegebenen Text, nicht für a TextView.

Ich möchte dies tun, damit ich den Stil vom Inhalt trennen kann. Ich weiß, dass ich dies programmgesteuert tun kann, aber ich möchte wieder Stil aus dem Inhalt und dem Code heraushalten.

CottonBallPaws
quelle
1
Weder inputType = "textCapCharacters", textAllCaps = "true" funktioniert in smasung famili ^^. Ich habe TextWatcher zu meinem EditText hinzugefügt, der alle Wörter begrenzt
murt

Antworten:

356

Ich dachte, das war eine ziemlich vernünftige Anfrage, aber es sieht so aus, als ob Sie es derzeit nicht tun können. Was für ein Totalausfall. lol

Aktualisieren

Sie können jetzt textAllCaps verwenden , um alle Caps zu erzwingen.

Terrance
quelle
14
Textansichtsattribute fehlen definitiv. Es wäre schön, auch einen ttf aus dem Attributordner zuzuweisen!
Nathan Schwermann
8
Eine der Antworten auf die verknüpfte Frage schlägt 'android: textAllCaps = "true" vor.' Das hat bei mir funktioniert.
Blaffie
@blaffie Danke für das Update. Ich werde überprüfen, ob android: textAllCaps = "true" ordnungsgemäß funktioniert.
Terrance
1
Sie können dies mit dem Attribut "textAllCaps" tun, daher die Abwertung.
JaydeepW
1
Scheint , wie textAllCapsUrsachen zum Absturz App , wenn Sie festgelegt android:fontFamilyin themes.xml.
Alaa M.
142

Was ist mit Android: TextAllCaps ?

Murphy
quelle
8
@ larham1 Es ist ein XML-Attribut, daher sehe ich nicht, wie es sonst verwendet werden kann. Wenn dies nicht funktioniert, melden Sie es Google. Ich nehme an, es ist auf API-Level 14 wie setAllCaps (boolean) beschränkt.
Murphy
1
Ich habe das gerade getestet und es funktioniert. Ich habe eine externe Style-Datei
7heViking
1
@ Murphy ja, das ist ein Versionsproblem. SDK 14 und höher für setAllCaps (); nicht klar, wann die XML hinzugefügt wurde, aber ich gehe auch von SDK 14 aus.
Larham1
Das ist seltsam, textAllCaps funktioniert in einem einfachen Testprojekt, aber wenn die Ansicht in ArrayAdapter.getView () erstellt wird, funktioniert dies nicht. Alles funktioniert: Hintergrund, TextStyle usw., aber textAllCaps nicht :(
Y2i
1
@JawadLeWywadi Sie können dieses XML-Attribut nicht vor API 14 verwenden. Sie müssen es manuell in Java-Code ausführen.
Murphy
63

Durch die Verwendung von AppCompat textAllCaps in Android Apps, die ältere APIs unterstützen (weniger als 14)

Im Lieferumfang von AppCompat ist ein UI-Widget mit dem Namen CompatTextView enthalten, eine benutzerdefinierte TextView-Erweiterung, die die Unterstützung von textAllCaps hinzufügt

Für neuere Android API> 14 können Sie verwenden:

android:textAllCaps="true"

Ein einfaches Beispiel:

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

Quelle: developer.android

Aktualisieren:

Zufällig wurde CompatTextView in der neuesten Appcompat-v7-Bibliothek ~ Eugen Pechanec durch AppCompatTextView ersetzt

LOG_TAG
quelle
Haben Sie das interne in android.support.v7.internal bemerkt? Intern wie in ist in der nächsten Version der Support-Bibliothek möglicherweise nicht mehr vorhanden?
Emanuel Moecklin
1
Das ist fantastisch! @EmanuelMoecklin Sobald Sie es in Ihrem Projekt haben, wird es nicht auf magische Weise einen Weg laufen.
Eugen Pechanec
@eugen Natürlich aktualisieren Sie die Support-Bibliothek nie auf die neueste Version, da Google nie etwas Nützliches hinzufügt, oder?
Emanuel Moecklin
@EmanuelMoecklin Eigentlich aktualisiere ich oft so schnell, dass mein Code kaputt geht: DI stimmt vollkommen zu, dass Sie vorsichtig sein sollten, interne Ressourcen zu verwenden, ABER ich habe nur einen Blick auf die Quelle von appcompat-v7 geworfen und CompatTextViewwird verwendet, in ScrollingTabCointainerViewder verwendet wird ToolbarWidgetWrapper, was ziemlich neu klingt und Solange der Name "v7" in seinem Namen behält, ist dies eine gute Garantie für mich, dass CompatTextViewer dort bleiben wird, wo er ist.
Eugen Pechanec
2
@EmanuelMoecklin Wie es passiert, CompatTextViewwurde AppCompatTextViewin der neuesten Appcompat-v7-Bibliothek durch ersetzt. Du warst ganz richtig.
Eugen Pechanec
30

Es ist wirklich sehr enttäuschend, dass Sie dies nicht mit styles ( <item name="android:textAllCaps">true</item>) oder in jeder XML-Layoutdatei mit dem textAllCaps- Attribut tun können. Die einzige Möglichkeit, dies zu tun, besteht darin, theString.toUpperCase () für jede der Zeichenfolgen zu verwenden, wenn Sie dies tun ein textViewXXX.setText (theString).

In meinem Fall wollte ich theString.toUpperCase () nicht überall in meinem Code haben, sondern einen zentralen Ort dafür haben, da ich einige Aktivitäten hatte und Elementlayouts mit TextViews auflistete, die die ganze Zeit groß geschrieben werden sollten (a title) und andere, die dies nicht getan haben ... also ... einige Leute denken vielleicht, dass dies ein Overkill ist, aber ich habe meine eigene CapitalizedTextView-Klasse erstellt, die android.widget.TextView erweitert, und die setText-Methode überschrieben, die den Text im laufenden Betrieb großschreibt.

Zumindest wenn sich das Design ändert oder ich den großgeschriebenen Text in zukünftigen Versionen entfernen muss, muss ich nur in den Layoutdateien zu normaler Textansicht wechseln.

Bedenken Sie nun, dass ich dies getan habe, weil der Designer der App diesen Text (die Titel) tatsächlich in CAPS in der gesamten App haben wollte, unabhängig von der ursprünglichen Großschreibung des Inhalts, und ich hatte auch andere normale TextViews, bei denen die Großschreibung mit dem tatsächlichen Inhalt kam .

Das ist die Klasse:

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

}

Und wann immer Sie es verwenden müssen, deklarieren Sie es einfach mit dem gesamten Paket im XML-Layout:

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

Einige werden argumentieren, dass die richtige Art, Text in einer TextView zu formatieren , die Verwendung eines SpannableString ist , aber ich denke, das wäre ein noch größerer Overkill, ganz zu schweigen von einem höheren Ressourcenverbrauch, da Sie eine andere Klasse als TextView instanziieren.

Oscar Salguero
quelle
9

Ich habe eine Lösung gefunden, die der von RacZo insofern ähnlich ist, als ich auch eine Unterklasse erstellt habe, TextViewderen Handles den Text in Großbuchstaben schreiben .

Der Unterschied besteht darin, dass setText()ich , anstatt eine der Methoden zu überschreiben , einen ähnlichen Ansatz TextViewwie bei API 14+ verwendet habe (was aus meiner Sicht eine sauberere Lösung darstellt).

Wenn Sie sich die Quelle ansehen , sehen Sie die Implementierung von setAllCaps():

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

Die AllCapsTransformationMethodKlasse ist (derzeit) nicht öffentlich, aber die Quelle ist auch verfügbar . Ich habe diese Klasse ein wenig vereinfacht (die setLengthChangesAllowed()Methode entfernt), daher lautet die vollständige Lösung wie folgt:

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
quelle
2

Anscheinend gibt es eine Berechtigung für die Einstellung der mobilen Tastatur. Der einfachste Weg, dies zu tun, ist:

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

hoffe das wird klappen

Dhiren Hamal
quelle
1

Mit dem PixlUI- Projekt können Sie textAllCaps in jeder Textansicht oder Unterklasse der Textansicht verwenden, einschließlich: Schaltfläche, EditText AutoCompleteEditText-Kontrollkästchen RadioButton und mehreren anderen.

Sie müssen Ihre Textansichten mit der Pixlui-Version und nicht mit denen aus der Android-Quelle erstellen. Dies bedeutet, dass Sie Folgendes tun müssen:

<com.neopixl.pixlui.components.textview.TextView

        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world"
        pixlui:textAllCaps="true" />

Mit PixlUI können Sie auch eine benutzerdefinierte Schriftart festlegen, die Sie in Ihrem Assets-Ordner ablegen.

Ich arbeite an einer Gradle- Abzweigung des PixlUI-Frameworks, die gradle verwendet und es ermöglicht, textAllCaps sowie die Schriftart aus Stilen anzugeben, anstatt sie wie im ursprünglichen Projekt inline zu benötigen.

Matt Wolfe
quelle