So ändern Sie den Stil einer Textansicht zur Laufzeit

98

Ich habe eine Android-App, auf die ich, wenn der Benutzer auf a tippt TextView, einen definierten Stil anwenden möchte.

Ich dachte, ich finde ein, textview.setStyle()aber es existiert nicht. Ich habe es versucht

textview.setTextAppearance();

aber es funktioniert nicht.

Krise
quelle
1
Ich habe irgendwo gelesen, dass dies nicht möglich ist ... stackoverflow.com/questions/2016249/… . Sie können einige Eigenschaften jedoch separat festlegen.
Floern
1
Haben Sie versucht: textView.setTextTypeface? developer.android.com/reference/android/widget/…
Jonathan Roth
21
@Falmarri Haben SIE die TextView-API-Dokumente durchgesehen? Wenn ja, könnten Sie vielleicht etwas Konstruktiveres sagen.
Fletch

Antworten:

143

Dazu habe ich eine neue XML-Datei res/values/style.xmlwie folgt erstellt:

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <style name="boldText">
        <item name="android:textStyle">bold|italic</item>
        <item name="android:textColor">#FFFFFF</item>
    </style>

    <style name="normalText">
        <item name="android:textStyle">normal</item>
        <item name="android:textColor">#C0C0C0</item>
    </style>

</resources>

Ich habe auch Einträge in meiner "strings.xml" -Datei wie folgt:

<color name="highlightedTextViewColor">#000088</color>
<color name="normalTextViewColor">#000044</color>

Dann habe ich in meinem Code einen ClickListener erstellt, um das Tap-Ereignis in dieser TextView abzufangen: BEARBEITEN : Ab API 23 ist 'setTextAppearance' veraltet

    myTextView.setOnClickListener(new View.OnClickListener() {
                public void onClick(View view){
                    //highlight the TextView
                    //myTextView.setTextAppearance(getApplicationContext(), R.style.boldText);
    if (Build.VERSION.SDK_INT < 23) {
       myTextView.setTextAppearance(getApplicationContext(), R.style.boldText);
    } else {
       myTextView.setTextAppearance(R.style.boldText);
    }
     myTextView.setBackgroundResource(R.color.highlightedTextViewColor);
                }
            });

Um es wieder zu ändern, würden Sie Folgendes verwenden:

if (Build.VERSION.SDK_INT < 23) {
    myTextView.setTextAppearance(getApplicationContext(), R.style.normalText);
} else{
   myTextView.setTextAppearance(R.style.normalText);
}
myTextView.setBackgroundResource(R.color.normalTextViewColor);
Glenn
quelle
2
Eigentlich funktioniert das nicht mit Schattenstilen. Wenn Sie den Schatten ändern möchten, müssen Sie dies folgendermaßen tun: lockText.setShadowLayer (20, 4, 4, 0xFFFF0000);
Lukas
3
Um die SDK-Überprüfung zu vermeiden, können Sie TextViewCompat.setTextAppearance (myTextView, R.style.myStyle) verwenden.
Justin Fiedler
90

Wie Jonathan vorgeschlagen hat textView.setTextTypeface, habe ich es vor einigen Sekunden in einer App verwendet.

textView.setTypeface(null, Typeface.BOLD); // Typeface.NORMAL, Typeface.ITALIC etc.
DKDiveDude
quelle
9
Sie können textView.setTypeface (null, Typeface.BOLD) verwenden. textView..setTypeface (null, Typeface.ITALIC); textView.setTypeface (null, Typeface.BOLD_ITALIC);
Peceps
2
textView.setTypeface (null, Typeface.BOLD) hat bei mir funktioniert. Natürlich könnten Sie stattdessen 1 verwenden, aber ich denke, es ist keine gute Praxis, Konstanten manuell einzugeben. Verwenden Sie besser vordefinierte Variablen in Bibliotheken.
Pijusn
4
Ermutigen Sie die Leute nicht, Ints anstelle von Konstanten zu verwenden
Chris.Jenkins
3
Gut! Mein Fehler war, dass ich meine alte Schrift im ersten Parameter gesendet habe. Es funktioniert also, wenn ich NORMAL -> BOLD, aber nicht BOLD -> NORMAL ändere. Ich wusste nicht, dass der erste Parameter null sein kann! Jetzt funktioniert es gut für mich!
Felipe
12
TextView tvCompany = (TextView)findViewById(R.layout.tvCompany);
tvCompany.setTypeface(null,Typeface.BOLD);

Sie können es aus Code einstellen. Schrift

Azhar
quelle
4

Programmatisch: Laufzeit

Sie können dies programmgesteuert mit setTypeface () tun:

textView.setTypeface(null, Typeface.NORMAL);      // for Normal Text
textView.setTypeface(null, Typeface.BOLD);        // for Bold only
textView.setTypeface(null, Typeface.ITALIC);      // for Italic
textView.setTypeface(null, Typeface.BOLD_ITALIC); // for Bold and Italic

XML: Entwurfszeit

Sie können auch in XML festlegen:

android:textStyle="normal"
android:textStyle="normal|bold"
android:textStyle="normal|italic"
android:textStyle="bold"
android:textStyle="bold|italic"

Hoffe das wird helfen

Summiert

Summierter Jain
quelle
2

Ich fand textView.setTypeface(Typeface.DEFAULT_BOLD);die einfachste Methode.

sfera
quelle
Dies ändert die Schrift. nicht der vom OP angegebene Stil.
HBG
Zwar war dies zum Zeitpunkt des Beitrags die einfachste Methode - und soweit ich mich an die einzige Methode erinnere. Ich bin mir nicht sicher, ob in der Zwischenzeit eine neue API-Methode hinzugefügt wurde, mit der der "Stil" fett gedruckt werden kann, ohne die Schriftart zu ändern. Bitte korrigieren Sie mich, wenn ich falsch liege.
Sfera
1

Versuchen Sie diese Codezeile.

textview.setTypeface(textview.getTypeface(), Typeface.DEFAULT_BOLD);

Hier wird die aktuelle Schrift aus dieser Textansicht abgerufen und durch eine neue Schrift ersetzt. Neue Schriftart hier ist, DEFAULT_BOLDaber Sie können viel mehr anwenden.

Md. Sajedul Karim
quelle
Sie möchten lieber erklären, warum Ihr Code sein Problem lösen wird, danke.
Muhammed Refaat
Das OP möchte den Stil ändern, nicht die Schrift.
HBG
0

Siehe doco für setText () in TextView http://developer.android.com/reference/android/widget/TextView.html

Um Ihre Zeichenfolgen zu formatieren, hängen Sie android.text.style. * -Objekte an einen SpannableString an oder finden Sie in der Dokumentation Verfügbare Ressourcentypen ein Beispiel für das Festlegen von formatiertem Text in der XML-Ressourcendatei.

GSree
quelle
0

Je nachdem, welchen Stil Sie festlegen möchten, müssen Sie unterschiedliche Methoden verwenden. TextAppearance-Inhalte haben einen eigenen Setter, TypeFace hat einen eigenen Setter, der Hintergrund hat einen eigenen Setter usw.

akohout
quelle