İyi tasarlanmış özel bir görünüm, iyi tasarlanmış diğer sınıflar gibidir. Basit bir arayüze sahip belirli bir işlev kümesini kapsar, CPU ve belleği verimli bir şekilde kullanır ve bu böyle devam eder. Özel bir görünüm, iyi tasarlanmış bir sınıf olmanın yanı sıra aşağıdakileri de yapmalıdır:
- Android standartlarına uygundur.
- Android XML düzenleri ile çalışan özel stil özellikleri sağlayın.
- Erişilebilirlik etkinliklerini gönder.
- Birden fazla Android platformuyla uyumlu olmalıdır.
Android çerçevesi, bu gereksinimlerin tümünü karşılayan bir görünüm oluşturmanıza yardımcı olmak için bir dizi temel sınıf ve XML etiketi sağlar. Bu derste, bir görünüm sınıfının temel işlevini oluşturmak için Android çerçevesinin nasıl kullanılacağı anlatılmaktadır.
Ek bilgileri Özel görünüm bileşenleri bölümünde bulabilirsiniz.
Bir görünümü alt sınıflandırma
Android çerçevesinde tanımlanan tüm görünüm sınıfları View
kapsamını genişletir. Özel görünümünüz, View
öğesini doğrudan da genişletebilir veya Button
gibi mevcut görünüm alt sınıflarından birini genişleterek zaman kazanabilirsiniz.
Android Studio'nun görünümünüzle etkileşim kurmasına izin vermek için en azından, bir Context
ve AttributeSet
nesnesini parametre olarak alan bir kurucu sağlamanız gerekir.
Bu oluşturucu, düzen düzenleyicisinin görünümünüzün bir örneğini oluşturmasına ve düzenlemesine olanak tanır.
Kotlin
class PieChart(context: Context, attrs: AttributeSet) : View(context, attrs)
Java
class PieChart extends View { public PieChart(Context context, AttributeSet attrs) { super(context, attrs); } }
Özel özellikleri tanımlama
Kullanıcı arayüzünüze yerleşik View
eklemek için bunu bir XML öğesinde belirtip görünümünü ve davranışını öğe özellikleriyle kontrol edin. Ayrıca, XML kullanarak özel görünümler
ekleyebilir ve stilini belirleyebilirsiniz. Bu davranışı özel görünümünüzde etkinleştirmek için aşağıdakileri yapın:
- Bir
<declare-styleable>
kaynak öğesinde görünümünüz için özel özellikler tanımlayın. - XML düzeninizdeki özelliklerin değerlerini belirtin.
- Çalışma zamanında özellik değerlerini alın.
- Alınan özellik değerlerini görünümünüze uygulayın.
Bu bölümde, özel özelliklerin nasıl tanımlanacağı ve değerlerinin nasıl belirtileceği açıklanmaktadır. Sonraki bölümde, çalışma zamanında değerleri alma ve uygulama ele alınmaktadır.
Özel özellikleri tanımlamak için projenize <declare-styleable>
kaynakları ekleyin. Bu kaynaklar res/values/attrs.xml
dosyasına yerleştirilir. Örnek bir attrs.xml
dosyası:
<resources> <declare-styleable name="PieChart"> <attr name="showText" format="boolean" /> <attr name="labelPosition" format="enum"> <enum name="left" value="0"/> <enum name="right" value="1"/> </attr> </declare-styleable> </resources>
Bu kod, PieChart
adlı stile uygun varlığa ait iki özel özellik (showText
ve labelPosition
) tanımlar. Stile sahip varlığın adı, kural gereği, özel görünümü tanımlayan sınıfın adıyla aynıdır. Bu kurala uymak gerekli olmasa da birçok popüler kod düzenleyicisi, ifade tamamlamayı sağlamak için bu adlandırma kuralına güvenir.
Özel özellikleri tanımladıktan sonra, bunları yerleşik özellikler gibi düzen XML dosyalarında kullanabilirsiniz. Aradaki tek fark, özel özelliklerinizin farklı bir ad alanına ait olmasıdır. Bunlar http://schemas.android.com/apk/res/android
ad alanına ait olmak yerine http://schemas.android.com/apk/res/[your package name]
ad alanına aittir. Örneğin, PieChart
için tanımlanan özelliklerin nasıl kullanılacağı aşağıda açıklanmıştır:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:custom="http://schemas.android.com/apk/res-auto"> <com.example.customviews.charting.PieChart custom:showText="true" custom:labelPosition="left" /> </LinearLayout>
Örnek, uzun ad alanı URI'sını tekrarlamak zorunda kalmamak için xmlns
yönergesini kullanır. Bu yönerge, custom
takma adını http://schemas.android.com/apk/res/com.example.customviews
ad alanına atar.
Ad alanınız için istediğiniz herhangi bir takma adı seçebilirsiniz.
Düzene özel görünüm ekleyen XML etiketinin adına dikkat edin. Bu, özel görünüm sınıfının tam adıdır. Görüntüleme sınıfınız bir iç sınıfsa görünümün dış sınıfının adıyla ayrıca nitelendirin.
Örneğin, PieChart
sınıfının PieView
adında bir iç sınıfı vardır. Bu sınıftaki özel özellikleri kullanmak için com.example.customviews.charting.PieChart$PieView
etiketini kullanın.
Özel özellikleri uygulama
XML düzeninden bir görünüm oluşturulduğunda, XML etiketindeki tüm özellikler kaynak paketinden okunur ve görünümün oluşturucusuna bir AttributeSet
olarak aktarılır.
Değerler doğrudan AttributeSet
öğesinden okunabilir olsa da bu işlemin bazı dezavantajları vardır:
- Özellik değerlerindeki kaynak referansları çözümlenmez.
- Stiller uygulanmadı.
Bunun yerine, AttributeSet
öğesini obtainStyledAttributes()
adresine iletin.
Bu yöntem, zaten referansı kaldırılmış ve stili kaldırılmış bir TypedArray
değer dizisini geri gönderir.
Android kaynak derleyicisi, obtainStyledAttributes()
çağrısını kolaylaştırmak için birçok işlem gerçekleştirir. Oluşturulan R.java
, res/
dizinindeki her bir <declare-styleable>
kaynağı için hem özellik kimlikleri dizisi hem de dizideki her özelliğin dizinini tanımlayan bir sabit değer grubu tanımlar. TypedArray
öğesinden özellikleri okumak için önceden tanımlanmış sabit değerleri kullanırsınız. PieChart
sınıfı, özelliklerini şu şekilde okur:
Kotlin
init { context.theme.obtainStyledAttributes( attrs, R.styleable.PieChart, 0, 0).apply { try { mShowText = getBoolean(R.styleable.PieChart_showText, false) textPos = getInteger(R.styleable.PieChart_labelPosition, 0) } finally { recycle() } } }
Java
public PieChart(Context context, AttributeSet attrs) { super(context, attrs); TypedArray a = context.getTheme().obtainStyledAttributes( attrs, R.styleable.PieChart, 0, 0); try { mShowText = a.getBoolean(R.styleable.PieChart_showText, false); textPos = a.getInteger(R.styleable.PieChart_labelPosition, 0); } finally { a.recycle(); } }
TypedArray
nesnelerinin paylaşılan bir kaynak olduğunu ve kullanımdan sonra geri dönüştürülmeleri gerektiğini unutmayın.
Mülk ve etkinlik ekleme
Özellikler, görünümlerin davranışını ve görünümünü kontrol etmenin etkili bir yoludur ancak yalnızca görünüm başlatıldığında okunabilir. Dinamik davranış sağlamak amacıyla her bir özel özellik için bir özellik alıcı ve ayarlayıcı çifti gösterin. Aşağıdaki snippet'te PieChart
öğesinin, showText
adlı bir özelliği nasıl açığa çıkardığı gösterilmektedir:
Kotlin
fun isShowText(): Boolean { return mShowText } fun setShowText(showText: Boolean) { mShowText = showText invalidate() requestLayout() }
Java
public boolean isShowText() { return mShowText; } public void setShowText(boolean showText) { mShowText = showText; invalidate(); requestLayout(); }
setShowText
işlevinin invalidate()
ve requestLayout()
çağırdığına dikkat edin. Bu çağrılar, görünümün güvenilir şekilde
çalıştığından emin olmak açısından çok önemlidir. Sistemin görünümü
yeniden çizmesi gerektiğini bilebilmesi için, özelliklerinde yapılan
herhangi bir değişiklikten sonra görünümü
geçersiz kılmanız gerekir. Benzer şekilde, bir özellik görünümün boyutunu veya şeklini etkileyebilecek bir şekilde değişirse yeni bir düzen istemeniz gerekir. Bu yöntem çağrılarının unutulması, bulunması zor hatalara neden olabilir.
Özel görünümler, önemli etkinliklerin iletilmesi için etkinlik işleyicileri de desteklemelidir. Örneğin PieChart
, OnCurrentItemChanged
adlı özel etkinliği göstererek kullanıcının yeni bir pasta dilimine odaklanmak için pasta grafiği döndürdüğünü dinleyicilere bildirir.
Özellikle özel görünümün tek kullanıcısı siz olduğunuzda özellikleri ve etkinlikleri göstermeyi kolayca unutabilirsiniz. Görünümünüzün arayüzünü dikkatlice tanımlamak için zaman ayırmak, gelecekteki bakım maliyetlerini azaltır. Uyulması gereken bir kural da özel görünümünüzün görünür görünümünü veya davranışını etkileyen özellikleri her zaman göstermektir.
Erişilebilirliğe önem veren tasarım
Özel görünümünüz çok çeşitli kullanıcıları desteklemelidir. Dokunmatik ekranı görmelerini veya kullanmalarını engelleyen engelli kullanıcılar da buna dahildir. Engelli kullanıcıları desteklemek için şunları yapın:
- Giriş alanlarınızı
android:contentDescription
özelliğini kullanarak etiketleyin. - Uygun olduğunda
sendAccessibilityEvent()
numaralı telefonu arayarak erişilebilirlik etkinliklerini gönderin. - D-pad veya iztopu gibi alternatif kumandaları destekleyin.
Erişilebilir görünümler oluşturma hakkında daha fazla bilgi için Uygulamaları daha erişilebilir hale getirme başlıklı makaleyi inceleyin.