Android'de Görünümler için genel stiller belirleme


Yanıtlar:


250

Aslında, özel bir java sınıfı yapmanıza veya stili ayrı ayrı ayarlamanıza gerek kalmadan TextViews (ve diğer birçok yerleşik widget) için varsayılan bir stil ayarlayabilirsiniz.

themes.xmlAndroid kaynağına bakarsanız, çeşitli widget'lar için varsayılan stil için bir dizi özellik göreceksiniz. Anahtar, özel temanızda geçersiz kıldığınız textViewStyle(veya editTextStyle, vb.) Özniteliktir. Bunları aşağıdaki şekilde geçersiz kılabilirsiniz:

Oluşturun styles.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="MyTheme" parent="android:Theme">
    <item name="android:textViewStyle">@style/MyTextViewStyle</item>
</style>

<style name="MyTextViewStyle" parent="android:Widget.TextView">
    <item name="android:textColor">#F00</item>
    <item name="android:textStyle">bold</item>
</style>
</resources>

Ardından bu temayı uygulamanıza uygulayın AndroidManifest.xml:

<application […] android:theme="@style/MyTheme">

Ve tüm metin görünümleriniz varsayılan olarak tanımlı stile MyTextViewStyle(bu örnekte kalın ve kırmızı) sahip olacaktır!

Bu, API seviye 4'ten itibaren cihazlarda test edildi ve harika çalışıyor gibi görünüyor.


1
Şimdiye kadar gördüğüm en zarif çözüm.
Italo Borssatto

@Steve, öğeyi MyTheme stiline dahil edersem <item name="android:textViewStyle">@style/MyTextViewStyle</item>ve ardından stili uygulamama uygularsam, tüm e- postalarım stile TextViewgöre gösterilecektir (işlem çubuğundaki uygulamanın adı bile). Eylem çubuğu ile sorunu nasıl çözebilirim? Varsayılan görünüme sahip olmasını istiyorum. Github
Maksim Dmitriev

@Steve, nasıl uygulamaya hem (aksiyon bar ve widget) tema uygulamak için
Pratik Butani

ActionBar'ı diğer şeylerden nasıl ayırt edeceğimi bilmiyorum. ActionBar stilinizin ayarlandığı her yerde bulabilir ve sonra <item name="android:textViewStyle">@style/MyTextViewStyle</item>oraya da koyabilirsiniz , sadece ActionBar varsayılanına (veya benzer bir şeye) işaret edebilirsiniz
Steve Pomeroy

@StevePomeroy bu benim için çalışmıyor .. biraz destek sağlayabilir misiniz? Metin Görünümleri için Stilim aynı kalır. Ayarlamam gereken Minimum öğe var mı veya ayarlamama izin verilmeyen bazı öğeler var mı?
Mike

52

Bunu yapmanın iki yolu vardır:

1. Stilleri kullanma

Dizinde XML dosyaları oluşturarak kendi stillerinizi tanımlayabilirsiniz res/values. Öyleyse, kırmızı ve kalın bir metne sahip olmak istediğinizi varsayalım, sonra bu içerikle bir dosya oluşturursunuz:

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <style name="MyRedTheme" parent="android:Theme.Light">
    <item name="android:textAppearance">@style/MyRedTextAppearance</item>
  </style>
  <style name="MyRedTextAppearance" parent="@android:style/TextAppearance">
    <item name="android:textColor">#F00</item>
    <item name="android:textStyle">bold</item>
  </style>
</resources>

Örneğin, istediğiniz gibi adlandırabilirsiniz res/values/red.xml. Daha sonra yapmanız gereken tek şey, istediğiniz widget'larda bu görünümü kullanmaktır, örneğin:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView
    style="@style/MyRedTheme"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="This is red, isn't it?"
    />
</LinearLayout>

Daha fazla referans için şu makaleyi okuyabilirsiniz: Android Temalarını ve Stillerini Anlama

2. Özel sınıfları kullanma

Bu, bunu başarmanın başka bir olası yoludur TextViewve metin rengini her zaman istediğiniz gibi ayarlayan kendinizinkini sağlamak olacaktır ; Örneğin:

import android.content.Context;
import android.graphics.Color;
import android.util.AttributeSet;
import android.widget.TextView;
public class RedTextView extends TextView{
    public RedTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        setTextColor(Color.RED);
    }
}

Ardından, TextViewXML dosyanızda bunu normal bir şekilde ele almanız gerekir :

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<org.example.RedTextView  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="This is red, isn't it?"
    />
</LinearLayout>

Bir veya daha fazla seçeneği kullanmanız, ihtiyaçlarınıza bağlıdır. Yapmak istediğiniz tek şey görünümü değiştirmekse, o zaman en iyi yaklaşım ilk yaklaşımdır. Öte yandan, görünümü değiştirmek ve widget'larınıza bazı yeni işlevler eklemek istiyorsanız, ikincisi gitmenin yoludur.


Daha temiz bir yaklaşım olduğu ve xml dosyasının hafif kalmasına yardımcı olduğu için özel sınıfların kullanılması tercih edilmelidir.
Amit Kumar

@AmitKumar Hayır yapmamalılar! Bu özel durumda bu, her farklı özellik değeri için ayrı bir özel sınıf kullanılması anlamına gelir. Bu, çok fazla bloat kodu üretir ve gerçek düzeni artık okunamaz hale getirir (sadece birkaç xml satırı okumak yerine ne yaptığını görmek için her sınıfı ziyaret etmeniz gerekecektir). Özel sınıflar yalnızca davranışı değiştirirseniz kullanılmalıdır, ancak tek değişiklik görünümün görünümü ise kullanılmamalıdır.
Andre

Xml'den özel bir görünümün stilini ayarlamak mümkün değil mi? Neden onu custom_view_layout.xmlözel bir sınıfı şişirmek için kullanılan dosyada kullanamıyoruz ?
lucidbrot

5

Varsayılan metin rengi için TextViewayarlanmış, android:textColorTertiaryistenen renge senin tema:

<item name="android:textColorTertiary">@color/your_text_color</item>

Diğer birçok Android denetiminin renkleri, çerçeve öznitelikleri kullanılarak denetlenebilir veya destek kitaplığı kullanıyorsanız kitaplık özniteliklerini destekleyebilir.

Ayarlayabileceğiniz öznitelikleri listesi için kontrol Android kaynak kodunu ait styles.xmlve themes.xmlya bu çok yararlı özü Dan Lew tarafından, her bir değeri değiştirmeyi deneyin ve ekranda değiştirmek istediğini anlıyorum.


Teşekkür ederim dostum! TextColorPrimary'nin neden çalışmadığını anlamak için çok zaman harcadım.
pratt

3

Bir stil tanımlayın ve her widget'te kullanın, o widget için android varsayılanını geçersiz kılan bir tema tanımlayın veya bir dize kaynağı tanımlayın ve her widget'ta ona referans verin

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.