Android - TextView TextStyle programmgesteuert einstellen?

232

Gibt es eine Möglichkeit, das textStyleAttribut eines TextViewprogrammgesteuert festzulegen? Es scheint keine setTextStyle()Methode zu geben.

Um klar zu sein, ich spreche nicht über Ansichts- / Widget-Stile! Ich spreche von Folgendem:

<TextView
  android:id="@+id/my_text"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:text="Hello World"
  android:textStyle="bold" />
Jake Wilson
quelle
1
Sie können unten Link verweisen und Top 1 Antwort stackoverflow.com/questions/6200533/…
Tiep
Bitte überprüfen Sie meine Antwort hier . Hoffe das wird dir helfen
Summved Jain

Antworten:

410
textview.setTypeface(Typeface.DEFAULT_BOLD);

setTypeface ist das Attribut textStyle.

Wie Shankar V hinzufügte, können Sie Folgendes verwenden, um die zuvor festgelegten Schriftattribute beizubehalten:

textview.setTypeface(textview.getTypeface(), Typeface.BOLD);
Raz
quelle
14
es sollte seintextview.setTypeface(textview.getTypeface(), Typeface.DEFAULT_BOLD);
Sankar V
2
@IlyaEremin Um die zuvor festgelegte Schriftart beizubehalten, müssen Sie sie wie folgt verwenden.
Sankar V
Meine Antwort wurde basierend auf dem @ SankarV-Kommentar bearbeitet.
Raz
13
Ich denke, Sie sollten das STANDARD verlieren: Inhaber.title.setTypeface (Inhaber.title.getTypeface (), Typeface.BOLD);
Iman Akbari
Eigentlich textview.getTypeface().getStyle()istandroid:textStyle
Pierre
126

Angenommen, Sie haben einen Stil namens RedHUGEText für Ihre Werte / styles.xml:

<style name="RedHUGEText" parent="@android:style/Widget.TextView">
    <item name="android:textSize">@dimen/text_size_huge</item>
    <item name="android:textColor">@color/red</item>
    <item name="android:textStyle">bold</item>
</style>

Erstellen Sie einfach Ihre Textansicht wie gewohnt in der Datei XML layout / your_layout.xml. Nehmen wir an:

<TextView android:id="@+id/text_view_title" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content 
    android:text="FOO" />

Und im Java-Code Ihrer Aktivität tun Sie Folgendes:

TextView textViewTitle = (TextView) findViewById(R.id.text_view_title);
textViewTitle.setTextAppearance(this, R.style.RedHUGEText);

Es hat bei mir funktioniert! Und es hat Farbe, Größe, Schwerkraft usw. angewendet. Ich habe es ohne Probleme auf Handys und Tablets mit Android-API-Stufen von 8 bis 17 verwendet. Beachten Sie, dass diese Methode ab Android 23 veraltet ist. Das Kontextargument wurde gelöscht, daher müsste die letzte Zeile lauten:

textViewTitle.setTextAppearance(R.style.RedHUGEText);

Denken Sie daran ... dies ist nur dann nützlich, wenn der Stil des Textes wirklich von einer Bedingung in Ihrer Java-Logik abhängt oder Sie die Benutzeroberfläche "on the fly" mit Code erstellen ... wenn dies nicht der Fall ist, ist es besser, einfach machen:

<TextView android:id="@+id/text_view_title" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content 
    android:text="FOO" 
    style="@style/RedHUGEText" />

Sie können es immer so haben, wie Sie es wollen!

Oscar Salguero
quelle
4
Dadurch wird nur eine Teilmenge von Attributen festgelegt, die in einem <style>Tag definiert werden können . Es macht die üblichen (Größe, Farbe, Stil), aber wendet keine anderen an (einschließlich Polsterung, Hintergrund, Schwerkraft usw.)
Karl
5
Scheint min API 23 zu erfordern?
William T. Mallard
4
Es gibt zwei Methoden, eine für API <23 und eine für API 23+. Sie scheinen identisch zu sein, außer dass das für <23 ein Kontextargument verwendet und das für 23+ nicht. Unter der Haube ruft die für API 23+ die Methode für <23 auf und verwendet den Elementkontext für die Textansicht.
MrPlow
63

Suche nach setTextAppearanceoder auch setTextTypeface. Es gibt eine ähnliche Frage zum Stackoverflow: So ändern Sie den Stil einer TextView zur Laufzeit

peter.bartos
quelle
setTextAppearance veraltete API Level 23
Athospy
Es gibt eine neue Methode für API 23+, die einfach kein Kontextargument akzeptiert.
MrPlow
52

Es gibt so viele Möglichkeiten, um diese Aufgabe zu erfüllen:

1.

String text_view_str = "<b>Bolded text</b>, <i>italic text</i>, even <u>underlined</u>!";
TextView tv = (TextView)findViewById(R.id.ur_text_view_id);
tv.setText(Html.fromHtml(text_view_str));

2.

tv.setTypeface(null, Typeface.BOLD);
tv.setTypeface(null, Typeface.ITALIC);
tv.setTypeface(null, Typeface.BOLD_ITALIC);
tv.setTypeface(null, Typeface.NORMAL);

3.

SpannableString spannablecontent=new SpannableString(o.content.toString());
spannablecontent.setSpan(new StyleSpan(android.graphics.Typeface.BOLD_ITALIC), 
                         0,spannablecontent.length(), 0);
// set Text here
tt.setText(spannablecontent);

4.

<?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>

 tv.setTextAppearance(getApplicationContext(), R.style.boldText);

oder wenn du durch xml willst

android:textStyle="normal"
android:textStyle="normal|bold"
android:textStyle="normal|italic"
android:textStyle="bold"
android:textStyle="bold|italic"
Duggu
quelle
setTextAppearance () ist die Antwort, nach der ich gesucht habe, um einen in meinem XML definierten benutzerdefinierten Stil anzuwenden. Vielen Dank.
Ashario
Meiner Meinung nach ist dies die beste Antwort für den Thread. Viele Optionen für den programmgesteuerten Aufruf von Code
Nguyen Minh Hien
9

• • Kotlin Version

So behalten Sie die aktuelle Schriftart zusätzlich zum Textstil bei:

textView.apply {
    setTypeface(typeface, Typeface.NORMAL)
    // or
    setTypeface(typeface, Typeface.BOLD)
    // or
    setTypeface(typeface, Typeface.ITALIC)
    // or
    setTypeface(typeface, Typeface.BOLD_ITALIC)
}
Aminographie
quelle
7

Diese Frage wird an vielen Stellen auf viele verschiedene Arten gestellt. Ich antwortete , es ursprünglich hier , aber ich fühle es auch in diesem Thread relevant ist (da ich am Ende hier gelandet bin, als ich nach einer Antwort gesucht habe).

Es gibt keine einzeilige Lösung für dieses Problem, aber dies hat für meinen Anwendungsfall funktioniert. Das Problem ist, dass der Konstruktor 'View (context, attrs, defStyle)' nicht auf einen tatsächlichen Stil verweist, sondern ein Attribut benötigt. Wir werden:

  1. Definieren Sie ein Attribut
  2. Erstellen Sie einen Stil, den Sie verwenden möchten
  3. Wenden Sie einen Stil für dieses Attribut auf unser Thema an
  4. Erstellen Sie mit diesem Attribut neue Instanzen unserer Ansicht

Definieren Sie in 'res / values ​​/ attrs.xml' ein neues Attribut:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <attr name="customTextViewStyle" format="reference"/>
    ...
</resources>    

In res / values ​​/ styles.xml 'werde ich den Stil erstellen, den ich in meiner benutzerdefinierten Textansicht verwenden möchte

<style name="CustomTextView">
    <item name="android:textSize">18sp</item>
    <item name="android:textColor">@color/white</item>
    <item name="android:paddingLeft">14dp</item>
</style>

Ändern Sie in 'res / values ​​/ theme.xml' oder 'res / values ​​/ styles.xml' das Thema für Ihre Anwendung / Aktivität und fügen Sie den folgenden Stil hinzu:

<resources>
    <style name="AppBaseTheme" parent="android:Theme.Light">
        <item name="@attr/customTextViewStyle">@style/CustomTextView</item>
    </style>
    ... 
</resources>

Schließlich können Sie in Ihrer benutzerdefinierten Textansicht jetzt den Konstruktor mit dem Attribut verwenden, und er erhält Ihren Stil

public class CustomTextView extends TextView {

    public CustomTextView(Context context) {
       super(context, null, R.attr.customTextView);
    }
}

Es ist erwähnenswert, dass ich customTextView wiederholt in verschiedenen Varianten und an verschiedenen Stellen verwendet habe, aber es ist in keiner Weise erforderlich, dass der Name der Ansicht mit dem Stil oder dem Attribut oder irgendetwas übereinstimmt. Diese Technik sollte auch mit jeder benutzerdefinierten Ansicht funktionieren, nicht nur mit TextViews.

Kevin Grant
quelle
4

Das hat bei mir funktioniert

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

oder

textview.setTypeface(Typeface.DEFAULT_BOLD);
Ray Hunter
quelle
2

Ich habe es mit zwei einfachen Methoden gelöst.

Folgen Sie der Erklärung.

Meine bestehende Stilerklärung:

<style name="SearchInfoText">
    <item name="android:layout_width">wrap_content</item>
    <item name="android:layout_height">wrap_content</item>
    <item name="android:textSize">24sp</item>
    <item name="android:textColor">@color/Church_Grey</item>
    <item name="android:shadowColor">@color/Shadow_Church</item>
    <item name="android:shadowRadius">3</item>
    <item name="android:shadowDx">1</item>
    <item name="android:shadowDy">1</item>
</style>

Mein Android Java Code:

    TextView locationName = new TextView(getSupportActivity());
    locationName.setId(IdGenerator.generateViewId());
    locationName.setText(location.getName());
    locationName.setLayoutParams(super.centerHorizontal());
    locationName.setTextSize(24f);
    locationName.setPadding(0, 0, 0, 15);
    locationName.setTextColor(getResources().getColor(R.color.Church_Grey));
    locationName.setShadowLayer(3, 1, 1,  getResources().getColor(R.color.Shadow_Church));

Grüße.

andresmafra
quelle
0

Sie können diesen versuchen

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                textView.setTextAppearance(R.style.Lato_Bold);
            } else {
                textView.setTextAppearance(getActivity(), R.style.Lato_Bold);
            }
insane_warewolf
quelle
0

Da setTextAppearance(resId)nur für API 23 und höher verfügbar ist, verwenden Sie:

TextViewCompat.setTextAppearance(textViewGoesHere, resId)

Diese Methode wird intern wie folgt implementiert:

public static void setTextAppearance(@NonNull TextView textView, @StyleRes int resId) {
    if (Build.VERSION.SDK_INT >= 23) {
        textView.setTextAppearance(resId);
    } else {
        textView.setTextAppearance(textView.getContext(), resId);
    }
}
Rohan Taneja
quelle
-1

Wie hier erwähnt , wird diese Funktion derzeit nicht unterstützt.

dcanh121
quelle