TextView için stili programlı olarak ayarlama


249

TextViewOluşturucu böyle bir stil ile kullanmaya çalışıyorum :

TextView myText = new TextView(MyActivity.this, null, R.style.my_style);

Ancak, bunu yaptığımda, metin görünümü stili almak için görünmüyor (stili statik bir nesne üzerinde ayarlayarak doğruladım).

Ben de kullanmayı denedim myText.setTextAppearance(MyActivity.this, R.style.my_style)ama aynı zamanda çalışmıyor.

Yanıtlar:


318

Stili programlı olarak ayarlayabileceğinize inanmıyorum. Bu sorunu aşmak için, aşağıdaki stilde olduğu gibi res / layout create tvtemplate.xml dosyasında stili atanmış bir şablon düzeni xml dosyası oluşturabilirsiniz:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="This is a template"
        style="@style/my_style" />

ardından yeni TextView'inizi başlatmak için bunu şişirin:

TextView myText = (TextView)getLayoutInflater().inflate(R.layout.tvtemplate, null);

Bu yardımcı olur umarım.


1
Bunun Dandre Allison'ın cevabını kazandığı yer API v11 gerektirmiyor.
Martin Capodici

2
Çalışmış olabilir, ama bu mantıklı değil. Muhtemelen xml dosyası ile nasıl ayarlanabilir? programlı değilse . Xml dosyalarını kullanmamanın nedenleri var, bunlardan biri, hafızam sınırlı olduğu için yeni bir yol öğrenmek istemediğim için kullanıcı arayüzünü oluşturmak için kod yazmak için kullanıldım. diğer şeyler.
Iharob Al Asimi

@IharobAlAsimi doğru, her şey programlı olarak yapılabilir ve LayoutInflater, XML'i nesnelere dönüştürmeyle ilgili her şeyi bilir. Ne yazık ki, bu tür birçok şey özel API'ler altında gizlidir ve bazı nesneler oluşturmanın tek yolu yapıcıya AttributeSet sağlamaktır.
Miha_x64

Diğer tüm cevapların aksine, bu aslında iplikçilerle çalıştı, bu yüzden sizin için bir altın yıldız
Rowan Berry

121

Genel bir stil oluşturabilir ve aşağıdaki gibi birden çok metin görünümünde yeniden kullanabilirsiniz:

textView.setTextAppearance(this, R.style.MyTextStyle);

Düzenleme: Bu , Bağlam anlamına gelir


50
Cevabınız, yaptığınız her şey metnin "stili" ile maymunlaştığı sürece işe yarar. TextView'e dolgu veya kenar boşlukları ekleme gibi başka şeyler yapmaya çalışıyorsanız çalışmaz. Yani, yanlış olduğunu söylemiyorum ama cevabın sınırlı. Çalışma zamanında görünümü şişirmek, kapsamlı bir stil uygulamanın tek yoludur.
Bill Mote

1
Şişirilmiş bir şablon kullanmanın ve setTextAppearance kullanmanın her iki çözümü de makuldür. 2 çözüm için dolgu / marjlar sorunu gidermek için, textView.setLayoutParams (layoutParams) çağırabilir
AlanKley

Bu yöntem API 23 düzeyinde kullanımdan kaldırılmıştır. API 23+ yerine setTextAppearance (int) kullanın.
Sergii

Sürümün en az API 23 (M) olduğundan emin olun
Br0thazS0ul

4
destek kitaplığındaki yöntemi kullanın,TextViewCompat.setTextAppearance
Rubin Yoo

97

Yapıcıya şu şekilde bir ContextThemeWrapper iletebilirsiniz :

TextView myText = new TextView(new ContextThemeWrapper(MyActivity.this, R.style.my_style));

1
harika şeyler! API 8'i desteklerken stilleri programlı olarak ayarlayabilmemin tek yolu
tbraun

Bazı nedenlerden dolayı, düğmemin stilini etkilemez. Ben gibi tarzımı tanımlamış: <style name="TabButton"><item name="android:background">@drawable/tabbar_button_bkgnd</item>...</style>. Sonra bir yapı ile çağırmak: new Button(new ContextThemeWrapper(context, R.style.TabButton));. Ancak düğme ayarlarımı görmezden gelir. Burada yanlış bir şey mi yapıyorum?
Aleks N.

Widget.Button tarzını böyle miras almalısınızparent="@android:style/Widget.Button"
maxcanna

@maxcanna Nedense ekleme parentbiraz değişmedi. Bu yüzden inflateçözüm ile devam ettim .
Aleks N.

11
@AliakseiN. 3-arg yapıcısını kullanmanız gerekir, örn new Button(new ContextThemeWrapper(context, R.style.TabButton), null, 0). Aksi takdirde, varsayılan düğme stili uygulanır ve bu stil ContextThemeWrapper aracılığıyla temayla birleştirdiğiniz düğme stilini geçersiz kılar.
Newtonx

17

Stili yapıcıda ayarlayabilirsiniz (ancak stiller dinamik olarak değiştirilemez / ayarlanamaz).

View(Context, AttributeSet, int)( intgeçerli temadaki bir stile başvuru içeren bir özelliktir)

Tarafından cevap Romain Guy

referans


cevabınız yanıltıcı - sonuna kadar bu konuyu okumaya çalıştınız mı?
andr

3
Nasıl yanlış yönlendirilir? Kabul edilen cevap yanıltıcıdır, çünkü Romain Guy açıkça bir stili programlı olarak "ayarlayabileceğinizi" söylüyor. Sadece dinamik olarak değiştirecek bir tesis yok. Bu iş parçacığının böyle olduğunu düşünmüyoruz.
Dandre Allison

1
Dikkat, bu çağrı API seviye 11 gerektiriyor.
Martin Capodici

1
@PaulVerest bir teklif değil.
Dandre Allison

6
Son int bir stil kaynağı değildir . "Geçerli temada, görünüm için varsayılan değerler sağlayan bir stil kaynağına başvuru içeren bir özelliktir."
rve

11

İnt parametresi defStyleAttrstili belirtmez. Android dokümanlarından:

defStyleAttr - Geçerli temada, görünüm için varsayılan değerler sağlayan bir stil kaynağına başvuru içeren bir öznitelik. Varsayılanları aramamak için 0 olabilir.

Görünüm yapıcısında stili ayarlamak için 2 olası çözümümüz vardır:

  1. ContextThemeWrapper kullanımı ile:

    ContextThemeWrapper wrappedContext = new ContextThemeWrapper(yourContext, R.style.your_style);
    TextView textView = new TextView(wrappedContext, null, 0);
  2. Dört bağımsız değişken yapıcısıyla (LOLLIPOP'tan başlayarak kullanılabilir):

    TextView textView = new TextView(yourContext, null, 0, R.style.your_style);

Her iki çözüm için de kilit nokta - defStyleAttrstilimizi görünüme uygulamak için parametre 0 olmalıdır.


5

Dinamik olarak değişen stiller desteklenmemektedir (henüz). Görünümü, XML oluşturulmadan, görünüm oluşturulmadan önce ayarlamanız gerekir .


20
Bu aslında aynı şey olur
njzk2

@ njzk2 teşekkürler ... Açıkçası göndermeden önce yaptığı yorum hakkında düşünmüyordu. Kullanıcı arayüzünün oluşturulmasından önce stili programlı olarak ayarlamanın bir yolu yoktur, bu nedenle stili programlı olarak değiştirmek veya ayarlamak için aynı kod kullanılır.
Chris Cashwell

3

Kabul edilen cevap benim için harika bir çözümdü. Eklenecek tek şey inflate()yöntem hakkında .

Kabul edilen cevapta tüm android:layout_*parametreler uygulanmayacaktır.

Nedeni ayarlamak için bir yol yoktur, nedeni nullolarak geçti ViewGroup parent.

Bu şekilde kullanabilirsiniz:

View view = inflater.inflate(R.layout.view, parent, false);

ve parentolduğu ViewGroupayarlamak ister yerden android:layout_*.

Bu durumda, tüm göreli özellikler ayarlanacaktır.

Umarım birisi için yararlı olur.


2

Stil devralma (veya olay stilize edilebilir nitelikler) kullanabilen özel görünümler kullanırken, stili kaybetmemek için ikinci yapıcıyı değiştirmeniz gerekir. Bu, setTextAppearence () kullanmanıza gerek kalmadan benim için çalıştı :

public CustomView(Context context, AttributeSet attrs) {
    this(context, attrs, attrs.getStyleAttribute());
}

2

Ben de problemle karşılaştım ve üslup programlı olarak ayarlamanın yolunu buldum. Belki hepiniz buna ihtiyacınız var, o yüzden orada güncelleme yapıyorum.

Görünüm yapıcısının üçüncü parametresi, temanızdaki bir tür attr türünü aşağıdaki kaynak kod olarak kabul eder:

public TextView(Context context, AttributeSet attrs) {
    this(context, attrs, com.android.internal.R.attr.textViewStyle);
}

Bu nedenle R.style yerine bir tür R.attr. ** iletmelisiniz. **

Kodlarımda aşağıdaki adımları uyguladım:

İlk olarak, attr.xml dosyasında temalar tarafından kullanılacak özelleştirilmiş bir attr öğesini özelleştirin.

<attr name="radio_button_style" format="reference" />

İkinci olarak, style.xml dosyasında kullanılan temanızdaki stilinizi belirleyin.

 <style name="AppTheme" parent="android:Theme.Translucent">
    <!-- All customizations that are NOT specific to a particular API-level can go here. -->
    <item name="radio_button_style">@style/radioButtonStyle</item>
</style>
<style name="radioButtonStyle" parent="@android:style/Widget.CompoundButton.RadioButton">
    <item name="android:layout_width">wrap_content</item>
    <item name="android:layout_height">64dp</item>
    <item name="android:background">#000</item>
    <item name="android:button">@null</item>
    <item name="android:gravity">center</item>
    <item name="android:saveEnabled">false</item>
    <item name="android:textColor">@drawable/option_text_color</item>
    <item name="android:textSize">9sp</item>
</style>

Sonunda kullanın!

            RadioButton radioButton = new RadioButton(mContext, null, R.attr.radio_button_style);

programlı olarak oluşturulan görünüm temanızda belirtilen stili kullanır.

Bir deneyebilir ve umarım sizin için mükemmel bir şekilde çalışabilir.


0

Ben sadece EditText ile test ettim ama yöntemi kullanabilirsiniz

public void setBackgroundResource (int kalıntı)

XML dosyasında tanımlanan bir stili uygulamak için.

Sine Bu yöntem Görünüm herhangi bir UI elemanı ile çalışacağına inanıyorum aittir.

Saygılarımızla.


Belgelere göre, bu sadece stil ile değil, sadece çekmecelerle çalışmalıdır. Dolayısıyla, eğer bu gerçekten işe yarıyorsa, sadece "kazara" olur ve buna güvenmemelisiniz.
Heinzi

0

Kullanabiliriz TextViewCompact.setTextAppearance(textView, R.style.xyz).

Referans için Android doc .

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.