İyi tasarlanmış bir özel görünüm, iyi tasarlanmış diğer sınıflar gibidir. Basit bir arayüzle belirli bir işlevsellik grubunu kapsar, CPU ve belleği verimli bir şekilde kullanır vb. İyi tasarlanmış bir sınıf olmasının yanı sıra özel görünümün aşağıdakileri yapması gerekir:
- Android standartlarına uygun olmalıdır.
- Android XML düzenleriyle çalışan, özelleştirilebilir stil özellikleri sağlayın.
- Erişilebilirlik etkinlikleri gönderme
- Birden fazla Android platformuyla uyumlu olmalıdır.
Android çerçevesi, tüm bu koşulları 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ğı ele alınmaktadır.
Ek bilgileri Özel görünüm bileşenleri başlıklı makalede bulabilirsiniz.
Görünümü alt sınıfa ayırma
Android çerçevesinde tanımlanan tüm görünüm sınıfları View ile genişletilir. Özel görünümünüzü de View doğrudan genişletebilir veya Button gibi mevcut görünüm alt sınıflarından birini genişleterek zamandan tasarruf edebilirsiniz.
Android Studio'nun görünümünüzle etkileşime girmesine izin vermek için en azından parametre olarak Context ve AttributeSet nesnesi alan bir oluşturucu sağlamanız gerekir.
Bu oluşturucu, düzen düzenleyicinin 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 özellikler tanımlama
Kullanıcı arayüzünüze yerleşik bir View eklemek için bunu bir XML öğesinde belirtin ve öğe özellikleriyle görünümünü ve davranışını kontrol edin. XML kullanarak özel görünümler de ekleyip stil verebilirsiniz. Bu davranışı özel görünümünüzde etkinleştirmek için aşağıdakileri yapın:
- Görünümünüz için özel özellikleri bir
<declare-styleable>kaynak öğesinde tanımlayın. - XML düzeninizdeki özellikler için değerler 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. Bir sonraki bölümde, değerlerin çalışma zamanında alınması ve uygulanması ele alınmaktadır.
Özel özellikleri tanımlamak için projenize <declare-styleable>
kaynak ekleyin. Bu kaynakları bir res/values/attrs.xml dosyasına yerleştirmek geleneksel bir uygulamadır. attrs.xml dosyası örneğini aşağıda görebilirsiniz:
<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ı stil verilebilir bir öğeye ait olan showText ve labelPosition adlı iki özel özelliği bildirir. Stil verilebilen öğenin adı, geleneksel olarak özel görünümü tanımlayan sınıfın adıyla aynıdır. Bu kurala uymak zorunlu olmasa da birçok popüler kod düzenleyici, ifade tamamlama özelliği için bu adlandırma kuralını kullanır.
Özel özellikleri tanımladıktan sonra bunları yerleşik özellikler gibi düzen XML dosyalarında kullanabilirsiniz. Tek fark, özel özelliklerinizin farklı bir ad alanına ait olmasıdır. Bu veriler 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 özellikleri kullanma şekli aşağıda verilmiştir:
<?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>
Uzun ad alanı URI'sinin tekrar edilmesini önlemek için örnekte xmlns yönergesi kullanılıyor. 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 takma adı seçebilirsiniz.
Özel görünümü düzene ekleyen XML etiketinin adını not edin. Özel görünüm sınıfının tam nitelikli adıdır. Görünüm sınıfınız bir iç sınıftaysa görünümün dış sınıfının adıyla daha fazla nitelendirin.
Örneğin, PieChart sınıfının PieView adlı bir iç sınıfı vardır. Bu sınıftaki özel özellikleri kullanmak için com.example.customviews.charting.PieChart$PieView etiketini kullanırsınız.
Özel özellikleri uygulama
Bir görünüm XML düzeninden oluşturulduğunda, XML etiketindeki tüm özellikler kaynak paketinden okunur ve görünümün oluşturucusuna AttributeSet olarak iletilir.
Değerleri doğrudan AttributeSet'dan okumak mümkün olsa da bunun bazı dezavantajları vardır:
- Özellik değerlerindeki kaynak referansları çözümlenmez.
- Stiller uygulanmıyor.
Bunun yerine, AttributeSet öğesini obtainStyledAttributes() öğesine iletin.
Bu yöntem, referansı kaldırılmış ve stil verilmiş değerlerden oluşan bir TypedArray dizisi döndürür.
Android kaynak derleyicisi, obtainStyledAttributes()
çağrısını kolaylaştırmak için sizin adınıza birçok işlem yapar. <declare-styleable>
dizindeki her res/ kaynağı için oluşturulan R.java, hem bir özellik kimlikleri dizisini hem de dizideki her özelliğin dizinini tanımlayan bir sabitler kümesini tanımlar. TypedArray özelliklerini okumak için önceden tanımlanmış sabitleri kullanırsınız. PieChart sınıfının özelliklerini nasıl okuduğu aşağıda açıklanmıştır:
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ülmesi gerektiğini unutmayın.
Mülk ve etkinlik ekleme
Özellikler, görünümlerin davranışını ve görünümünü kontrol etmenin güçlü bir yoludur ancak yalnızca görünüm başlatıldığında okunabilir. Dinamik davranış sağlamak için her özel özellik için bir özellik alıcı ve belirleyici çifti kullanıma sunun. Aşağıdaki snippet'te PieChart öğesinin showText adlı bir özelliği nasıl kullanıma sunduğu 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, invalidate() ve requestLayout()'ı arıyor. Bu çağrılar, görünümün güvenilir şekilde çalışmasını sağlamak için çok önemlidir. Görünümün özelliklerinde görünümünü değiştirebilecek herhangi bir değişiklik yaptıktan sonra görünümü geçersiz kılmanız gerekir. Böylece sistem, görünümün yeniden çizilmesi gerektiğini anlar. Aynı şekilde, bir mülk görünümün boyutunu veya şeklini etkileyebilecek şekilde değişirse yeni bir düzen isteğinde bulunmanız gerekir. Bu yöntem çağrılarını unutmak, bulunması zor hatalara neden olabilir.
Özel görünümlerin, önemli etkinlikleri iletmek için etkinlik dinleyicilerini de desteklemesi gerekir. Örneğin, PieChart
dinleyicileri kullanıcının pasta grafiği yeni bir dilime odaklanmak için döndürdüğü konusunda bilgilendirmek üzere OnCurrentItemChanged adlı özel bir etkinliği kullanıma sunar.
Özellikle özel görünümün tek kullanıcısı sizseniz özellikleri ve etkinlikleri kullanıma sunmayı unutabilirsiniz. Görünümünüzün arayüzünü dikkatli bir şekilde tanımlamak için zaman ayırmak, gelecekteki bakım maliyetlerini azaltır. İzlenecek iyi bir kural, özel görünümünüzün görünür görünümünü veya davranışını etkileyen tüm özellikleri her zaman kullanıma sunmaktır.
Erişilebilirliğe göz önünde bulundurarak tasarım yapma
Özel görünümünüz geniş bir kullanıcı kitlesini desteklemelidir. Bu kapsamda, dokunmatik ekranı görmelerini veya kullanmalarını engelleyen engelleri olan kullanıcılar da yer alır. Engelli kullanıcılara destek olmak için: aşağıdakileri yapın:
- Giriş alanlarınızı
android:contentDescriptionözelliğini kullanarak etiketleyin. - Uygun olduğunda
sendAccessibilityEvent()numaralı telefonu arayarak erişilebilirlik etkinlikleri gönderin. - D-pad veya trackball gibi alternatif denetleyicileri destekleme
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.