Android - TextView TextStyle'ı programlı olarak mı ayarlıyorsunuz?


232

Programlı olarak textStyleözniteliği ayarlamanın bir yolu var mı TextView? Bir setTextStyle()yöntem yok gibi görünüyor .

Açık olmak gerekirse, Görünüm / Widget stilleri hakkında konuşmuyorum! Aşağıdakilerden bahsediyorum:

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

1
aşağıdaki bağlantıya başvurabilir ve ilk 1 cevabı kilitleyebilirsiniz stackoverflow.com/questions/6200533/…
Tiep

Lütfen cevabımı buradan kontrol edin . Umarım bu size yardımcı olacaktır
Summved Jain

Yanıtlar:


410
textview.setTypeface(Typeface.DEFAULT_BOLD);

setTypeface, Attribute textStyle öğesidir.

As Shankar V eklendi, daha önce ayarlanmış yazı biçimi kullanabilirsiniz niteliklerini korumak için:

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

14
olması gerekirtextview.setTypeface(textview.getTypeface(), Typeface.DEFAULT_BOLD);
Sankar V

2
@IlyaEremin Önceden ayarlanmış yazı tipini korumak için bu şekilde kullanmanız gerekir.
Sankar V

Cevabım @SankarV yorumuna dayanarak düzenlendi.
Raz

13
Ben VARSAYILAN gevşek gerektiğini düşünüyorum: holder.title.setTypeface (holder.title.getTypeface (), Typeface.BOLD);
Iman Akbari

Aslında textview.getTypeface().getStyle()iseandroid:textStyle
Pierre

126

Diyelim ki değerleriniz / styles.xml dosyasında RedHUGEText adlı bir stiliniz var:

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

TextView'inizi her zamanki gibi XML düzeninde / your_layout.xml dosyasında oluşturun, diyelim:

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

Ve Faaliyetinizin java kodunda bunu yaparsınız:

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

Benim için çalıştı! Ve renk, boyut, yerçekimi vb. Uyguladı. 8'den 17'ye kadar Android API Seviyeleri ile cep telefonlarında ve tabletlerde sorunsuz kullandım. Android 23'ten itibaren bu yöntemin kullanımdan kaldırıldığını unutmayın. Bağlam argümanı kaldırılmıştır, bu nedenle son satırın olması gerekir:

textViewTitle.setTextAppearance(R.style.RedHUGEText);

Unutmayın ... Bu, yalnızca metnin stili gerçekten Java mantığınızdaki bir koşula bağlıysa veya kullanıcı arayüzünü kodla "anında" oluşturuyorsanız yararlıdır ... değilse, yapmak:

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

Her zaman istediğiniz gibi olabilir!


4
Bu, yalnızca bir <style>etikette tanımlanabilecek niteliklerin bir alt kümesini ayarlar . Yaygın olanları yapar (boyut, renk, stil), ancak başkalarını uygulamaz (dolgu, arka plan, yerçekimi vb. Dahil)
karl

5
Min. API 23 gerektiriyor mu?
William T. Mallard

4
biri api <23 ve diğeri api 23+ için olmak üzere iki yöntem vardır. <23 için olanı bir bağlam argümanı alır ve 23+ için olanı aynı değilse, aynı görünürler. Başlık altında, api 23+ için olan yöntem <23 için yöntemi çağırır ve metin görünümü için üye bağlamını kullanır.
MrPlough


52

Bu görevi yerine getirmenin birçok yolu aşağıdadır: -

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

veya xml ile isterseniz

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

setTextAppearance (), XML'imde tanımlanan özel bir stili uygulamak için peşimde olduğum cevaptır. Teşekkürler.
ashario

Bence, bu konu için en iyi cevap. Programlı olarak kod için birçok seçenek arayın
Nguyen Minh Hien

9

Kotlin Version

Metin stiline ek olarak geçerli yazı tipini korumak için:

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

7

Bu soru birçok yerde çok farklı şekillerde soruluyor. Aslında burada cevap verdi ama ben de bu konu ile ilgili hissediyorum (sona erdi beri burada bir cevap ararken ).

Bu sorunun tek bir çözümü yoktur, ancak bu benim kullanım durumumda işe yaradı. Sorun şu ki, 'Görünüm (bağlam, attrs, defStyle)' yapıcısı gerçek bir stile başvurmuyor, bir nitelik istiyor. O zaman yapacağız:

  1. Bir nitelik tanımlama
  2. Kullanmak istediğiniz bir stil oluşturun
  3. Temamıza bu özellik için bir stil uygulayın
  4. Bu özellik ile görünümümüzün yeni örneklerini oluşturun

'Res / değerleri / attrs.xml' bölümünde yeni bir özellik tanımlayın:

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

Res / değerleri / styles.xml 'de benim özel TextView üzerinde kullanmak istediğim stili yaratacağım

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

'Res / değerleri / themes.xml' veya 'res / değerleri / styles.xml' içinde, uygulamanızın / etkinliğinizin temasını değiştirin ve aşağıdaki stili ekleyin:

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

Son olarak, özel TextView'inizde, yapıcıyı öznitelikle birlikte kullanabilirsiniz ve stilinizi alacaktır

public class CustomTextView extends TextView {

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

Farklı varyantlarda ve farklı yerlerde tekrar tekrar customTextView kullandığımı belirtmek gerekir, ancak hiçbir şekilde görünümün adının stille veya nitelikle veya herhangi bir şeyle eşleşmesi gerekmez. Ayrıca, bu teknik yalnızca TextViews ile değil, herhangi bir özel görünümle çalışmalıdır.


5

Bu benim için çalıştı

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

veya

textview.setTypeface(Typeface.DEFAULT_BOLD);

2

Bunu iki basit yöntemle çözdüm.

Açıklamayı takip edin.

Mevcut stil beyanım:

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

Android Java kodum:

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

Saygılarımızla.


0

Bunu deneyebilirsin

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

0

Yana setTextAppearance(resId)API 23 ve üzeri, kullanım için mevcuttur:

TextViewCompat.setTextAppearance(textViewGoesHere, resId)

Bu yöntem dahili olarak aşağıdaki gibi uygulanır:

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.