Uygulama Erişilebilirliğini İyileştirme Yöntemleri
Bu yazı,
https://developer.android.com/guide/topics/ui/accessibility/principles#accessibility-actions
adresinde yayınlanmış olan erişilebilir uygulama geliştirmeye ilişkin yönergeler içeren yazının Türkçe’ye çevirisidir.
Uygulama Erişilebilirliğini İyileştirme Yöntemleri
Erişilebilirlik gereksinimleri olan kullanıcılara yardımcı olmak için Android çerçevesi, uygulamalardan kullanıcılara içerik sunabilen ve aynı zamanda onların adına uygulamaları çalıştırabilen bir erişilebilirlik hizmeti oluşturmanıza olanak tanır.
Android, aşağıdakiler de dahil olmak üzere çeşitli sistem erişilebilirlik hizmetleri sağlar:
- TalkBack: az gören veya kör olan kişilere yardımcı olur. İçeriği sentezlenmiş bir sesle okur ve kullanıcı hareketlerine yanıt olarak bir uygulamada eylemler gerçekleştirir.
- Anahtar Erişimi: Motor engeli olan kişilere yardımcı olur. Etkileşimli öğeleri vurgular ve kullanıcının bir düğmeye basmasına yanıt olarak eylemler gerçekleştirir. Yalnızca bir veya iki düğme kullanılarak cihazın kontrol edilmesini sağlar.
Erişilebilirlik ihtiyacı olan kişilerin uygulamanızı başarılı bir şekilde kullanmasına yardımcı olmak için uygulamanızın, Uygulamaları daha erişilebilir hale getirme bölümünde açıklanan yönergeleri temel alan ve bu sayfada açıklanan en iyi iyileştirme uygulamalarını takip etmesi gerekir.
Aşağıdaki bölümlerde açıklanan bu en iyi uygulamaların her biri, uygulamanızın erişilebilirliğini daha da iyileştirebilir:
Öğeleri Etiketleyin
Kullanıcılar, uygulamanızdaki her etkileşimli ve anlamlı kullanıcı arabirimi öğesinin içeriğini ve amacını anlayabilmelidir.
Erişilebilirlik İşlemleri Ekleyin
Erişilebilirlik işlemleri ekleyerek, erişilebilirlik hizmetleri kullanıcılarının uygulamanızdaki kritik kullanıcı akışlarını tamamlamasını sağlayabilirsiniz.
Sistem Widget’larını Genişletin
Kendi özel görünümlerinizi oluşturmak yerine, çerçevenin içerdiği görünüm öğelerini temel alın. Çerçevenin görünüm ve pencere öğesi sınıfları, uygulamanızın ihtiyaç duyduğu erişilebilirlik özelliklerinin çoğunu zaten sağlar.
Renklerle Birlikte İpuçları Kullanın
Kullanıcılar, bir kullanıcı arayüzündeki öğe kategorilerini net bir şekilde ayırt edebilmelidir. Bunu yapmak için, renklerle birlikte örnek bağlantıları ve konumu kullanarak bu farklılıkları belirtin.
Medya İçeriğini Daha Erişilebilir Hale Getirin
Bu içeriği görüntüleyen kullanıcıların tamamen görsel veya işitsel ipuçlarına güvenmek zorunda kalmaması için uygulamanızın video veya ses içeriğine açıklamalar ekleyin.
Öğeleri Etiketleyin
Kullanıcılara, uygulamanızdaki her etkileşimli kullanıcı arabirimi öğesi için yararlı ve açıklayıcı etiketler sağlamak önemlidir. Her etiket, belirli bir öğenin anlamını ve amacını açıklamalıdır. TalkBack gibi ekran okuyucular, bu etiketleri kullanıcılar için seslendirebilir.
Çoğu durumda, bir UI öğesinin açıklamasını, öğeyi içeren düzen kaynak dosyasında belirtirsiniz. Etiketleri, uygulamaları daha erişilebilir hale getirme kılavuzunda açıklandığı gibi, genellikle contentDescription özniteliğini kullanarak eklersiniz. Aşağıdaki bölümlerde açıklanan birkaç başka etiketleme tekniği daha vardır.
Düzenlenebilir Öğeler
EditText objects nesneleri gibi düzenlenebilir öğeleri etiketlerken, bu örnek metni ekran okuyucular için kullanılabilir hale getirmenin yanı sıra, öğenin kendisinde geçerli bir girdi örneği veren metni göstermek yararlı olur. Bu durumlarda, aşağıdaki kod parçacığında gösterildiği gibi android:hint özniteliğini kullanabilirsiniz:
<!– tr-Türkiye yerel ayarı için ipucu metni şöyle olur:
“Apartman, suit, veya bina”. –>
<EditText
android:id=”@+id/addressLine2″
android:hint=”@string/aptSuitBina” … />
Bu durumda View nesnesinin android:labelFor özniteliği EditText öğesinin kimliğine ayarlanmış olmalıdır. Daha fazla ayrıntı için aşağıdaki bölüme bakın.
Birinin Diğerini Tanımladığı Öğe Çiftleri
Bir EditText öğesinin, kullanıcıların EditText öğesine girmesi gerekenleri açıklayan ilgili bir View nesnesine sahip olması yaygın bir durumdur. View nesnesinin android:labelFor özniteliğini ayarlayarak bu ilişkiyi belirtebilirsiniz.
Bu tür öğe çiftlerini etiketlemenin bir örneği, aşağıdaki kod parçacığında gösterilmiştir:
<!– tr-Türkiye yerel ayarı için etiket metni “Kullanıcı adı:” olacaktır:” –>
<TextView
android:id=”@+id/usernameLabel” …
android:text=”@string/kullanıcıadı”
android:labelFor=”@+id/usernameEntry” />
<EditText
android:id=”@+id/usernameEntry” … />
<!– tr-Türkiye yerel ayarı için etiket metni “Şifre:” olacaktır:” –>
<TextView
android:id=”@+id/passwordLabel” …
android:text=”@string/şifre
android:labelFor=”@+id/passwordEntry” />
<EditText
android:id=”@+id/passwordEntry”
android:inputType=”textPassword” … />
Öğe Grupları
Bir öğe grubundaki öğelere etiket eklerken her etiketin benzersiz olması gerekir. Bu şekilde, sistemin erişilebilirlik hizmetleri, bir etiket seslendirilirken tam olarak öğe ekranındaki nesneye başvurabilir. Öğe ve etiket bağlantısının sağlanması, kullanıcıların kullanıcı arabiriminde ne zaman dolaştıklarını veya odağı önceden keşfettikleri bir öğeye ne zaman taşıdıklarını bilmelerini sağlar.
Özellikle, her alt öğenin benzersiz bir şekilde tanımlanması için yeniden kullanılan düzenlerdeki öğelere RecyclerView nesneleri gibi) ek metin veya bağlamsal bilgiler ekleyin.
Bunu yapmak için, içerik açıklamasını uyarlayıcı uygulamanızın bir parçası olarak aşağıdaki kod parçacığında gösterildiği gibi ayarlayın:
data class MovieRating(val title: String, val starRating: Integer)
class MyMovieRatingsAdapter(private val myData: Array<MovieRating>):
RecyclerView.Adapter<MyMovieRatingsAdapter.MyRatingViewHolder>() {
class MyRatingViewHolder(val ratingView: ImageView) :
RecyclerView.ViewHolder(ratingView)
override fun onBindViewHolder(holder: MyRatingViewHolder, position: Int) {
val ratingData = myData[position]
holder.ratingView.contentDescription = “Movie ${position}: ” +
“${ratingData.title}, ${ratingData.starRating} stars”
}
}
İlgili İçerik Grupları
Uygulamanız, bir şarkının ayrıntıları veya bir mesajın nitelikleri gibi doğal bir grup oluşturan birkaç kullanıcı arabirimi öğesi gösteriyorsa, bu öğeleri genellikle ViewGroup’un bir alt sınıfı olan bir kapsayıcı içinde düzenleyin. Kapsayıcı nesnenin android:screenReaderFocusable özniteliğini true olarak ve her bir iç nesnenin android:focusable özniteliğini false olarak ayarlayın. Bu sayede erişilebilirlik servisleri, iç elemanların içerik açıklamalarını arka arkaya bir kerede sunabilir. İlgili öğelerin bu şekilde birleştirilmesi, yardımcı teknoloji kullanıcılarının ekrandaki bilgileri daha verimli bir şekilde keşfetmelerine yardımcı olur.
Not: Android 8.1 (API düzeyi 27) ve daha düşük sürümlerde, android:screenReaderFocusable özelliği mevcut değildir, bu nedenle bunun yerine container’s android:focusable özelliğini ayarlayın.
Aşağıdaki kod parçacığı, birbiriyle ilişkili içerik parçaları içerir, dolayısıyla ConstraintLayout’un bir örneği olan kapsayıcı öğesinin android:screenReaderFocusable özniteliği true olarak ve iç TextView öğelerinin her birinin android:focusable özniteliği false olarak ayarlanır:
<!– Erişilebilirlik hizmetleri, tek bir kullanıcı etkileşimine yanıt olarak
şarkının hem adı hem de sanatçısını seslendirir. –>
<ConstraintLayout
android:id=”@+id/song_data_container” …
android:screenReaderFocusable=”true”>
<TextView
android:id=”@+id/song_title” …
android:focusable=”false”
android:text=”@string/my_song_title“ />
<TextView
android:id=”@+id/song_artist”
android:focusable=”false”
android:text=”@string/my_songwriter“ />
</ConstraintLayout>
Erişilebilirlik hizmetleri, iç öğelerin açıklamalarını bir kerede duyurduğu için, öğenin anlamını aktarmaya devam ederken her bir açıklamayı olabildiğince kısa tutmak önemlidir.
Özel Grup Etiketi
İsterseniz, grubun kendisi için bir içerik açıklaması sağlayarak, platformun varsayılan gruplandırmasını ve bir grubun iç öğe açıklamalarının sıralamasını geçersiz kılabilirsiniz.
Aşağıdaki kod parçacığı, özelleştirilmiş grup açıklamasının bir örneğini gösterir:
<!– Tek bir kullanıcı etkileşimine yanıt olarak, erişilebilirlik hizmetleri
grup için özel içerik açıklamasını seslendirir. –>
<ConstraintLayout
android:id=”@+id/song_data_container” …
android:screenReaderFocusable=”true”
android:contentDescription=”@string/title_artist_best_song”>
<TextView
android:id=”@+id/song_title” …
<!– Erişilebilirlik hizmetleri tarafından yok sayılan içerik –>
android:text=”@string/my_song_title” />
<TextView
android:id=”@+id/song_artist”
<!– Erişilebilirlik hizmetleri tarafından yok sayılan içerik –>
android:text=”@string/my_songwriter” />
</ConstraintLayout>
İç İçe Gruplar
Uygulamanızın arabirimi, festival etkinliklerinin günlük listesi gibi çok boyutlu bilgiler sunuyorsa, iç grup kapsayıcılarında android:screenReaderFocusable özniteliğini kullanın. Bu etiketleme şeması, ekran içeriğini keşfetmek için gereken duyuru sayısı ile her duyurunun uzunluğu arasında iyi bir denge sağlar.
Aşağıdaki kod parçacığı, daha büyük grupların içindeki grupları etiketlemenin bir yöntemini gösterir:
<!– Tek bir kullanıcı etkileşimine yanıt olarak, erişilebilirlik hizmetleri
etkinlikleri yalnızca tek bir aşama için seslendirir. –>
<ConstraintLayout
android:id=”@+id/festival_event_table” … >
<ConstraintLayout
android:id=”@+id/stage_a_event_column”
android:screenReaderFocusable=”true”>
<!– A Aşamasındaki olayları açıklayan kullanıcı arabirimi öğeleri. –>
</ConstraintLayout>
<ConstraintLayout
android:id=”@+id/stage_b_event_column”
android:screenReaderFocusable=”true”>
<!– B Aşamasındaki olayları açıklayan kullanıcı arabirimi öğeleri. –>
</ConstraintLayout>
</ConstraintLayout>
Metin İçindeki Başlıklar
Bazı uygulamalar, ekranda görünen metin gruplarını özetlemek için başlıkları kullanır. Belirli bir Görünüm öğesi bir başlığı temsil ediyorsa, öğenin android:accessibilityHeading özniteliğini true olarak ayarlayarak erişilebilirlik hizmetleri için amacını belirtebilirsiniz.
Erişilebilirlik hizmetlerini kullananlar, paragraflar veya kelimeler arasında gezinmek yerine başlıklar arasında gezinmeyi seçebilirler. Bu esneklik, metin gezinme deneyimini artırır.
Erişilebilirlik Ekran Bölümü Başlıkları
Android 9 (API düzeyi 28) ve sonraki sürümlerde, ekran bölümleri için erişilebilirlik dostu başlıklar sağlayabilirsiniz. Erişilebilirlik açısından, bir ekran bölümü, örneğin uygulamadaki bir parçanın içeriği gibi bir pencerenin görsel olarak farklı bir bölümüdür. Erişilebilirlik hizmetlerinin bir ekran bölümünün pencere benzeri davranışını anlaması için uygulamanızın ekran bölümlerine açıklayıcı başlıklar verin. Erişilebilirlik hizmetleri, bu durumda bir ekran bölümünün görünümü veya içeriği değiştiğinde kullanıcılara daha ayrıntılı bilgiler sağlayabilir.
Bir ekran bölümünün başlığını belirtmek için, aşağıdaki kod parçacığında gösterildiği gibi android:accessibilityPaneTitle özniteliğini kullanın:
<!– “alışveriş sepeti görünümü” bölümüne (üstte) veya
“öğelere göz at” bölümü (altta) konumlandırılırsa Erişilebilirlik hizmetleri, içerik değişiklikleriyle ilgili bildirimler alır –>
<MyShoppingCartView
android:id=”@+id/shoppingCartContainer”
android:accessibilityPaneTitle=”@string/shoppingCart” … />
<MyShoppingBrowseView
android:id=”@+id/browseItemsContainer”
android:accessibilityPaneTitle=”@string/browseProducts” … />
Dekoratif Öğeler
Kullanıcı arabiriminizdeki bir öğe yalnızca görsel boşluk veya görsel görünüm amacıyla mevcutsa, bunun android:importantForAccessibility özniteliğini “no” olarak ayarlayın.
Erişilebilirlik İşlemleri Ekleyin
Erişilebilirlik hizmetleri kullanıcılarının, uygulamanızdaki tüm kullanıcı etkileşimlerini kolayca gerçekleştirmelerine izin vermek önemlidir. Örneğin, bir kullanıcı listedeki bir öğeyi hızlıca kaydırabiliyorsa, bu eylem erişilebilirlik hizmetleri ile de gerçekleştirilebilir, böylece kullanıcılar aynı kullanıcı etkileşimini tamamlamak için alternatif bir yola sahip olur.
Tüm Eylemleri Erişilebilir Hale Getirin
Bir TalkBack, Voice Access, veya Anahtar Erişimi kullanıcısı, uygulama içindeki belirli kullanıcı etkileşimlerini tamamlamak için alternatif yollara ihtiyaç duyabilir. Sürükle ve bırak veya hızlıca kaydırma gibi hareketlerle ilişkili eylemler için, uygulamanız eylemleri erişilebilirlik hizmetleri kullanıcılarının erişebileceği bir şekilde sunabilir.
Uygulama, Erişilebilirlik Eylemlerini kullanarak kullanıcıların bir işlemi tamamlaması için alternatif yollar sağlayabilir.
Örneğin, uygulamanız kullanıcıların bir öğeyi kaydırmasına izin veriyorsa, şuna benzer bir özel erişilebilirlik eylemi aracılığıyla da işlevselliği ortaya çıkarabilirsiniz:
ViewCompat.addAccessibilityAction(
// View to add accessibility action
itemView,
// Bir erişilebilirlik hizmeti tarafından kullanıcıya gösterilen etiket
getText(R.id.archive)
) { _, _ ->
// itemView’da kaydırırken aynı yöntem uygulanır
archiveItem()
true
}
Eklenen özel erişilebilirlik eylemi ile kullanıcılar, eylemler menüsünden eyleme erişebilirler.
Mevcut Eylemleri Anlaşılır Hale Getirin
Bir görünüm, dokunup basılı tutma gibi eylemleri desteklediğinde, TalkBack gibi bir erişilebilirlik hizmeti bunu “Uzun basmak için iki kez dokunup basılı tutun” şeklinde duyurur.
Bu genel duyuru, kullanıcıya bir dokun ve basılı tut eyleminin ne yaptığı hakkında herhangi bir bağlam sağlamaz.
Bu duyuruyu daha açıklayıcı hale getirmek için erişilebilirlik işleminin duyurusunu şu şekilde değiştirebilirsiniz:
ViewCompat.replaceAccessibilityAction(
// Dokunma ve basılı tutma eylemini içeren görünüm
itemView,
AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_LONG_CLICK,
// Bu eylemi vurgulamak için TalkBack tarafından seslendirilen duyuru
getText(R.string.favorite),
null
)
Bunun sonucunda TalkBack, kullanıcıların eylemin amacını anlamalarına yardımcı olan “Favorilere çift dokunun ve basılı tutun” duyurusunu yapar.
Sistem Widget’larını Genişletin
Not: Uygulamanızın kullanıcı arayüzünü tasarlarken, sistem tarafından sağlanan ve Android’in sınıf hiyerarşisinin mümkün olduğunca aşağısında yer alan pencere öğelerini kullanın veya genişletin. Hiyerarşinin çok aşağısında yer alan sistem tarafından sağlanan pencere öğeleri, uygulamanızın ihtiyaç duyduğu erişilebilirlik özelliklerinin çoğuna zaten sahiptir. Sistem tarafından sağlanan bu widget’ları genişletmek, daha jenerik View, ViewCompat, Canvas, ve CanvasCompat sınıflarından kendi widget’larınızı oluşturmaktan daha kolaydır.
Son derece özelleştirilmiş bir deneyim veya oyun düzeyi için gerekli olabilecek Görünüm veya Canvas sınıflarını doğrudan genişletmeniz gerekiyorsa Özel görünümleri daha erişilebilir hale getirme bölümüne bakın.
Bu bölüm, sistem widget’larını genişletmeyle ilgili en iyi uygulamaları takip ederken TriSwitch adlı özel bir Anahtar türünün uygulanması örneğini kullanır. TriSwitch nesnesi, Switch nesnesine benzer şekilde çalışır, tek fark, TriSwitch’in her olayının kullanıcının üç olası durum arasında geçiş yapmasına izin vermesidir.
Sınıf Hiyerarşisinin En Altlarından Genişletin
Switch nesnesi, hiyerarşisindeki birkaç çerçeve UI sınıfından özellikler devralır:
View
↳ TextView
↳ Button
↳ CompoundButton
↳ Switch
Yeni TriSwitch sınıfının doğrudan Switch sınıfından genişletilmesi en iyisidir. Bu şekilde, Android accessibility framework TriSwitch sınıfının ihtiyaç duyduğu erişilebilirlik özelliklerinin çoğunu sağlar:
- Erişilebilirlik eylemleri: erişilebilirlik hizmetlerinin bir TriSwitch nesnesi üzerinde gerçekleştirilen olası her kullanıcı girişini nasıl taklit edebileceği hakkında sistem bilgisi. (View’dan devralınan.)
- Erişilebilirlik olayları: ekran yenilendiğinde veya güncellendiğinde bir TriSwitch nesnesinin görünümünün değişebileceği olası her yol hakkında erişilebilirlik hizmetleri için bilgiler. (View’dan devralınan.)
- Özellikler: Görüntülediği herhangi bir metnin içeriği gibi her bir TriSwitch nesnesi hakkındaki ayrıntılar. (TextView’den devralınan.)
- Durum bilgisi: “seçildi” veya “seçili değil” gibi bir TriSwitch nesnesinin mevcut durumunun açıklaması. (CompoundButton’dan devralınan.)
- Durumun metin açıklaması: her bir durumun neyi temsil ettiğinin metin tabanlı açıklaması. (Switch’ten devralınan.)
Switch ve üst sınıflarından gelen bu davranış, TriSwitch nesneleri için neredeyse aynı davranıştır. Bu nedenle uygulamanız olası durumların sayısını ikiden üçe çıkarmaya odaklanabilir.
Özel Olaylar Tanımlayın
Bir sistem widget’ını genişlettiğinizde, büyük olasılıkla kullanıcıların bu widget ile nasıl etkileşime girdiğinin bir yönünü değiştirmiş olursunuz. Erişilebilirlik hizmetlerinin, kullanıcı pencere öğesiyle doğrudan etkileşim kuruyormuş gibi uygulamanızın pencere bileşenini güncelleyebilmesi için bu etkileşim değişikliklerini tanımlamanız önemlidir.
Genel bir ilke olarak, geçersiz kıldığınız her görüntüleme tabanlı geri arama için ayrıca ViewCompat.replaceAccessibilityAction() öğesini geçersiz kılarak karşılık gelen erişilebilirlik eylemini yeniden tanımlamanız gerekir. Uygulamanızın testlerinde, bu yeniden tanımlanmış eylemlerin davranışını ViewCompat.performAccessibilityAction() öğesini çağırarak doğrulayabilirsiniz.
Bu İlke TriSwitch Nesneleri İçin Nasıl Çalışabilir?
Sıradan bir Switch nesnesinin aksine, bir TriSwitch nesnesine dokunmak üç olası durum arasında geçişe izin verir. Bu nedenle, karşılık gelen ACTION_CLICK accessibility action eyleminin güncellenmesi gerekir:
class TriSwitch(context: Context) : Switch(context) {
// 0, 1, or 2
var currentState: Int = 0
private set
init {
updateAccessibilityActions()
}
private fun updateAccessibilityActions() {
ViewCompat.replaceAccessibilityAction(this, ACTION_CLICK,
action-label) {
view, args -> moveToNextState()
})
}
private fun moveToNextState() {
currentState = (currentState + 1) % 3
}
}
Renkler Yerine veya Renklerle Birlikte İpuçları Kullanın
Renk körlüğü olan kullanıcılara yardımcı olmak amacıyla, uygulamanızın ekranlarındaki kullanıcı arabirimi öğelerini ayırt etmek için renkler yerine veya renklerle birlikte ipuçları kullanın. Bu teknikler, öğelerin farklılıklarını işaretlemek için farklı şekiller veya boyutlar kullanmayı, metin veya görsel bilgiler sağlamayı ya da sesli veya dokunmaya dayalı (dokunsal) geri bildirim eklemeyi içerebilir.
Şekil 1, bir aktivitenin iki versiyonunu göstermektedir. Bir sürüm, bir iş akışındaki iki olası eylemi birbirinden ayırmak için yalnızca renk kullanır. Diğer sürüm, iki seçenek arasındaki farkları vurgulamak için renge ek olarak şekiller ve metin dahil etme uygulamasını kullanır:
Şekil 1. Yalnızca renk kullanarak oluşturulan Uİ öğesi örnekleri (solda) ve renk, şekiller ve metin kullanarak oluşturulan UI öğesi örnekleri(sağda).
Medya İçeriğini Daha Erişilebilir Hale Getirin
Video klip veya ses kaydı gibi medya içeriği içeren bir uygulama geliştiriyorsanız, farklı erişilebilirlik ihtiyaçları olan kullanıcıları bu materyali anlama konusunda desteklemeye çalışın. Özellikle, aşağıdakileri yapmanızı öneririz:
- Kullanıcıların medyayı duraklatmasına veya durdurmasına, ses düzeyini değiştirmesine ve altyazıları (resim yazılarını) değiştirmesine izin veren denetimleri dahil edin.
- Bir video, bir iş akışını tamamlamak için hayati önem taşıyan bilgiler sunuyorsa, aynı içeriği transkript gibi alternatif bir biçimde sağlayın.
Kaynak:
Android Developers: Principles for improving app accessibility
Eline emeğine sağlık abi. Erişilebilir olmayan uygulamalara bu yazıyı göndermeliyiz