Android - ustawić program TextView TextStyle programowo?


232

Czy istnieje sposób programowego ustawienia textStyleatrybutu TextView? Wydaje się, że nie ma setTextStyle()metody.

Żeby było jasne, nie mówię o stylach Widoku / Widżetu! Mówię o:

<TextView
  android:id="@+id/my_text"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:text="Hello World"
  android:textStyle="bold" />

1
możesz odwołać się do poniższego linku i zablokować pierwszą odpowiedź 1 stackoverflow.com/questions/6200533/...
Tiep

Sprawdź moją odpowiedź tutaj . Mam nadzieję, że to ci pomoże
podsumował Jain,

Odpowiedzi:


410
textview.setTypeface(Typeface.DEFAULT_BOLD);

setTypeface jest atrybutem textStyle.

Jak dodał Shankar V , aby zachować wcześniej ustawione atrybuty kroju pisma, możesz użyć:

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

14
powinno byćtextview.setTypeface(textview.getTypeface(), Typeface.DEFAULT_BOLD);
Sankar V

2
@IlyaEremin, aby zachować wcześniej ustawioną czcionkę, musisz użyć jej w ten sposób.
Sankar V,

Edytowałem moją odpowiedź na podstawie komentarza @SankarV.
Raz

13
Myślę, że powinieneś stracić DOMYŚLNE: holder.title.setTypeface (holder.title.getTypeface (), Typeface.BOLD);
Iman Akbari

W rzeczywistości textview.getTypeface().getStyle()jestandroid:textStyle
Pierre

126

Załóżmy, że masz styl o nazwie RedHUGEText w twoich wartościach / 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>

Po prostu utwórz TextView jak zwykle w pliku XML layout / your_layout.xml, powiedzmy:

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

W kodzie Java swojej aktywności robisz to:

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

To zadziałało dla mnie! I zastosował kolor, rozmiar, grawitację itp. Użyłem go na telefonach i tabletach z Android API Poziomami od 8 do 17 bez żadnych problemów. Pamiętaj, że od Androida 23 ta metoda jest przestarzała. Argument kontekstu został usunięty, więc ostatni wiersz musiałby być:

textViewTitle.setTextAppearance(R.style.RedHUGEText);

Pamiętaj ... jest to przydatne tylko wtedy, gdy styl tekstu naprawdę zależy od warunku logiki Java lub budujesz interfejs użytkownika „w locie” z kodem ... jeśli nie, lepiej po prostu robić:

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

Zawsze możesz mieć to na swój sposób!


4
Spowoduje to ustawienie tylko podzbioru atrybutów, które można zdefiniować w <style>znaczniku. Robi te typowe (rozmiar, kolor, styl), ale nie stosuje innych (w tym wypełnienia, tła, grawitacji itp.)
karl

5
Wydaje się, że wymaga min API 23?
William T. Mallard

4
istnieją dwie metody, jedna dla API <23 i jedna dla API 23+. Wyglądają identycznie, z wyjątkiem tego, że <23 przyjmuje argument kontekstowy, a ten dla 23+ nie. Pod maską, ten dla interfejsu API 23+ wywołuje metodę dla <23 i używa kontekstu członka dla widoku tekstu.
MrPlow


52

Tak wiele sposobów na osiągnięcie tego zadania, niektóre są poniżej:

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

lub jeśli chcesz przez xml

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

setTextAppearance () to odpowiedź, której szukałem, aby zastosować niestandardowy styl zdefiniowany w moim pliku XML. Dzięki.
ashario

Moim zdaniem jest to najlepsza odpowiedź dla wątku. Wiele opcji programowego wywoływania kodu
Nguyen Minh Hien

9

Kotlin Version

Aby zachować bieżącą czcionkę oprócz stylu tekstu:

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

7

To pytanie jest zadawane w wielu miejscach na wiele różnych sposobów. Początkowo odpowiedziałem na to tutaj, ale czuję, że jest to również istotne w tym wątku (odkąd skończyłem tutaj gdy szukałem odpowiedzi).

Nie ma jednego liniowego rozwiązania tego problemu, ale zadziałało to w moim przypadku użycia. Problem polega na tym, że konstruktor „Widok (kontekst, attrs, defStyle)” nie odnosi się do rzeczywistego stylu, chce atrybutu. Więc będziemy:

  1. Zdefiniuj atrybut
  2. Utwórz styl, którego chcesz użyć
  3. Zastosuj styl dla tego atrybutu w naszym motywie
  4. Utwórz nowe wystąpienia naszego widoku za pomocą tego atrybutu

W „res / wartości / attrs.xml” zdefiniuj nowy atrybut:

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

W res / wartości / styles.xml „Mam zamiar stworzyć styl, którego chcę używać w moim niestandardowym TextView

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

W „res / wartości / themes.xml” lub „res / wartości / styles.xml” zmodyfikuj motyw swojej aplikacji / działania i dodaj następujący styl:

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

Wreszcie, w niestandardowym TextView możesz teraz użyć konstruktora z atrybutem, który otrzyma Twój styl

public class CustomTextView extends TextView {

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

Warto zauważyć, że wielokrotnie używałem customTextView w różnych wariantach i różnych miejscach, ale w żadnym wypadku nie jest wymagane, aby nazwa widoku pasowała do stylu, atrybutu lub czegokolwiek. Ponadto ta technika powinna działać z dowolnym niestandardowym widokiem, a nie tylko z widokami tekstowymi.


5

To zadziałało dla mnie

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

lub

textview.setTypeface(Typeface.DEFAULT_BOLD);

2

Rozwiązałem to za pomocą dwóch prostych metod.

Postępuj zgodnie z wyjaśnieniem.

Moja istniejąca deklaracja stylu:

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

Mój kod Java Androida:

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

Pozdrowienia.


0

Możesz spróbować tego

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

0

Ponieważ setTextAppearance(resId)jest dostępny tylko dla API 23 i wyższych, użyj:

TextViewCompat.setTextAppearance(textViewGoesHere, resId)

Ta metoda jest implementowana wewnętrznie w następujący sposób:

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.