Özel görünümleri daha erişilebilir yapın

Uygulamanız için bir özel görünüm bileşeni görünümü daha erişilebilir hale getirmelisiniz. Aşağıdaki adımlar, özel görünümünüzün erişilebilirlik özellikleri:

  • Yönlü kumanda tıklamalarını işleme.
  • Erişilebilirlik API'si yöntemlerini uygulayın.
  • AccessibilityEvent gönder özel görünümünüze özgü nesneleri içerir.
  • AccessibilityEvent alanını doldur ve AccessibilityNodeInfo görüntüleme sayısını artırır.

Yönlü kumanda tıklamalarını işleme

Çoğu cihazda, yönlü kumanda kullanarak bir görünümü tıkladığınızda KeyEvent KEYCODE_DPAD_CENTER şu anda odakta olan görünümü seçin. Tüm standart Android görünümleri tutma yeri KEYCODE_DPAD_CENTER uygun bir şekilde belirleyin. Özel bir kitle oluştururken View. Bu etkinliğin, dokunmatik ekrandaki görünüme dokunmayla aynı etkiye sahip olduğundan emin olun.

Özel denetiminiz KEYCODE_ENTER. etkinlik KEYCODE_DPAD_CENTER ile aynı. Bu şekilde, tam bir klavyeyle etkileşimler kurulur. hale getirmiştir.

Accessibility API yöntemlerini uygulayın

Erişilebilirlik etkinlikleri, kullanıcıların Uygulamanızın görsel arayüzüyle etkileşimler bileşenlerine ayıralım. Bu iletiler, mevcut erişilebilirlik hizmetleri olan erişilebilirlik hizmetleri tarafından işlenir. bu etkinliklerdeki bilgileri kullanarak tamamlayıcı geri bildirim ve istem üretebileceksiniz. Erişilebilirlik yöntemleri View kapsamındadır View.AccessibilityDelegate sınıflar. Yöntemler şu şekildedir:

dispatchPopulateAccessibilityEvent()
Özel görünümünüz bir erişilebilirlik etkinliği oluşturduğunda sistem bu yöntemi çağırır. Varsayılan bu yöntemin uygulanması, bu görünüm için onPopulateAccessibilityEvent() çağrısı yapar ve ardından bunun her bir alt öğesi için dispatchPopulateAccessibilityEvent() yöntemi görünüm.
onInitializeAccessibilityEvent()
Sistem bu yöntemi, yalnızca görüntü alanının dışındaki görüntülerin durumu hakkında ek bilgi almak için metin içeriği. Özel görünümünüz, basit bir yapılandırmanın ötesinde etkileşimli kontrol sağlıyorsa TextView veya Button, bu yöntemi geçersiz kıl ve görünümünüzle ilgili ek bilgileri (şifre alanı türü, onay kutusu gibi) ayarlayın etkinliği sağlayan kullanıcı etkileşimi veya geri bildirimi sağlayan, tür, yöntemidir. Bu yöntemi geçersiz kılarsanız süper uygulamasını çağırın ve yalnızca özellikleri değiştirin üst sınıf tarafından ayarlanmaz.
onInitializeAccessibilityNodeInfo()
Bu yöntem, erişilebilirlik hizmetlerine görünümün durumuyla ilgili bilgi sağlar. İlgili içeriği oluşturmak için kullanılan varsayılan View uygulamasının standart bir görünüm özellikleri grubu vardır ancak özel görünüm, basit bir TextView veya Button, bu yöntemi geçersiz kılıp görünümünüzle ilgili ek bilgileri ayarlayın bu yöntemle işlenen AccessibilityNodeInfo nesnesine eklenir.
onPopulateAccessibilityEvent()
Bu yöntem, AccessibilityEvent cihazının sözlü metin istemini görünüm. Görünüm, erişilebilirlik oluşturan bir görünümün alt öğesi olduğunda da kullanılır unutmayın.
onRequestSendAccessibilityEvent()
Görünümünüzün alt öğelerinden biri AccessibilityEvent. Bu adım, ebeveyn görünümünün erişilebilirliği değiştirmesine olanak tanır. ek bilgi içeren bir etkinliktir. Bu yöntemi yalnızca özel görünümünüzde ve ebeveyn görünümünün, erişilebilirlikle ilgili bağlam bilgileri sağlayıp sağlayamayacağı erişilebilirlik hizmetleri için yararlı bir etkinliktir.
sendAccessibilityEvent()
Kullanıcı bir görüntülemeyle ilgili işlem yaptığında sistem bu yöntemi çağırır. Etkinlik şununla sınıflandırılır: TYPE_VIEW_CLICKED gibi bir kullanıcı işlemi türü. Genel olarak, Özel görünümünüzün içeriği her değiştiğinde AccessibilityEvent.
sendAccessibilityEventUnchecked()
Bu yöntem, çağrı kodunun doğrudan cihazda erişilebilirlik özelliğinin etkinleştirilmesi (AccessibilityManager.isEnabled()). Bu yöntemi uygularsanız çağrıyı, sistem ayarı var. Genellikle bu yöntemi özel bir görünüm için uygulamanız gerekmez.

Erişilebilirliği desteklemek için önceki erişilebilirlik yöntemlerini doğrudan özel görünüm sınıfınızı seçin.

En azından, özel görünüm sınıfınız için aşağıdaki erişilebilirlik yöntemlerini uygulayın:

  • dispatchPopulateAccessibilityEvent()
  • onInitializeAccessibilityEvent()
  • onInitializeAccessibilityNodeInfo()
  • onPopulateAccessibilityEvent()

Bu yöntemlerin uygulanmasıyla ilgili daha fazla bilgi için erişilebilirlik etkinliklerini doldurma.

Erişilebilirlik etkinlikleri gönder

Özel görünümünüzün ayrıntılarına bağlı olarak, Farklı zamanlarda veya varsayılan olarak işlenmeyen etkinlikler için AccessibilityEvent nesne hakkında bilgi edindiniz. View sınıfı, bu etkinlikler için varsayılan bir uygulama sağlar. türler:

ziyaret edin.

Genel olarak, özel içeriğinizin içeriği her zaman bir AccessibilityEvent görüntülemenizi sağlar. Örneğin, kullanıcının bir metin seçmesine izin veren özel bir kaydırma çubuğu sayısal değer için sol veya sağ ok tuşuna bastığınızda, özel görünümünüz TYPE_VIEW_TEXT_CHANGED. her zaman kaydırma çubuğu değeri değişir. Aşağıdaki kod örneğinde, Bu etkinliği bildirmek için sendAccessibilityEvent() yöntemini kullanın.

Kotlin

override fun onKeyUp(keyCode: Int, event: KeyEvent): Boolean {
    return when(keyCode) {
        KeyEvent.KEYCODE_DPAD_LEFT -> {
            currentValue--
            sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED)
            true
        }
        ...
    }
}

Java

@Override
public boolean onKeyUp (int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT) {
        currentValue--;
        sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED);
        return true;
    }
    ...
}

Erişilebilirlik etkinliklerini doldur

Her AccessibilityEvent, geçerli etiketi açıklayan bir dizi zorunlu özelliğe sahiptir. görünümünün durumudur. Bu özellikler görünümün sınıf adı ve içeriği gibi bilgileri içerir. ve işaretli durumda gösterilir. Her etkinlik türü için gereken belirli özellikler aşağıda açıklanmıştır AccessibilityEvent. referans belgeler.

View uygulaması, bunlar için varsayılan değerler sağlar zorunlu özellikler. Sınıf adı ve etkinlik zaman damgası da dahil olmak üzere bu değerlerin çoğu otomatik olarak sağlanır. Özel görünüm bileşeni oluşturuyorsanız o görünümün içeriği ve özellikleri hakkında. Bu bilgiler bir düğme kadar basit olabilir etiketi içerir ve etkinliğe eklemek istediğiniz ek durum bilgilerini içerebilir.

Şunu kullanın: onPopulateAccessibilityEvent(). ve onInitializeAccessibilityEvent() yöntemlerine göz atın.AccessibilityEvent Şunu kullanın: Özellikle metin eklemek veya değiştirmek için kullanılan onPopulateAccessibilityEvent() yöntemi gibi erişilebilirlik hizmetleri tarafından sesli istemlere dönüştürülür. TalkBack'e gidin. Ek doldurma için onInitializeAccessibilityEvent() yöntemini kullanın görünümün seçim durumu gibi etkinlikle ilgili bilgileri sağlar.

Ayrıca, onInitializeAccessibilityNodeInfo(). yöntemidir. Erişilebilirlik hizmetleri, bu tarafından doldurulan AccessibilityNodeInfo nesnelerini kullanır bir erişilebilirlik etkinliği alındıktan sonra oluşturan görünüm hiyerarşisini inceleme yöntemidir. ve kullanıcılara uygun geri bildirimler sağlayın.

Aşağıdaki kod örneğinde, bu üç yöntemin görünümünüzde nasıl geçersiz kılınacağı gösterilmektedir:

Kotlin

override fun onPopulateAccessibilityEvent(event: AccessibilityEvent?) {
    super.onPopulateAccessibilityEvent(event)
    // Call the super implementation to populate its text for the
    // event. Then, add text not present in a super class.
    // You typically only need to add the text for the custom view.
    if (text?.isNotEmpty() == true) {
        event?.text?.add(text)
    }
}

override fun onInitializeAccessibilityEvent(event: AccessibilityEvent?) {
    super.onInitializeAccessibilityEvent(event)
    // Call the super implementation to let super classes
    // set appropriate event properties. Then, add the new checked
    // property that is not supported by a super class.
    event?.isChecked = isChecked()
}

override fun onInitializeAccessibilityNodeInfo(info: AccessibilityNodeInfo?) {
    super.onInitializeAccessibilityNodeInfo(info)
    // Call the super implementation to let super classes set
    // appropriate info properties. Then, add the checkable and checked
    // properties that are not supported by a super class.
    info?.isCheckable = true
    info?.isChecked = isChecked()
    // You typically only need to add the text for the custom view.
    if (text?.isNotEmpty() == true) {
        info?.text = text
    }
}

Java

@Override
public void onPopulateAccessibilityEvent(AccessibilityEvent event) {
    super.onPopulateAccessibilityEvent(event);
    // Call the super implementation to populate its text for the
    // event. Then, add the text not present in a super class.
    // You typically only need to add the text for the custom view.
    CharSequence text = getText();
    if (!TextUtils.isEmpty(text)) {
        event.getText().add(text);
    }
}

@Override
public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
    super.onInitializeAccessibilityEvent(event);
    // Call the super implementation to let super classes
    // set appropriate event properties. Then, add the new checked
    // property that is not supported by a super class.
    event.setChecked(isChecked());
}

@Override
public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
    super.onInitializeAccessibilityNodeInfo(info);
    // Call the super implementation to let super classes set
    // appropriate info properties. Then, add the checkable and checked
    // properties that are not supported by a super class.
    info.setCheckable(true);
    info.setChecked(isChecked());
    // You typically only need to add the text for the custom view.
    CharSequence text = getText();
    if (!TextUtils.isEmpty(text)) {
        info.setText(text);
    }
}

Bu yöntemleri doğrudan özel görünüm sınıfınızda uygulayabilirsiniz.

Özelleştirilmiş bir erişilebilirlik bağlamı sağlayın

Erişilebilirlik hizmetleri, bir kullanıcı arayüzü bileşeninin kapsayıcı görünüm hiyerarşisini inceleyebilir erişilebilirlik etkinliği oluşturur. Bu sayede erişilebilirlik hizmetleri, bağlam açısından daha zengin içerikler sunabilir e-posta alırsınız.

Erişilebilirlik hizmetlerinin görünümden yeterli bilgi alamadığı durumlar hiyerarşik olarak düzenlenmiştir. Buna örnek olarak, iki veya daha fazla ayrı ayar içeren özel bir arayüz denetimi verilebilir. tıklanabilir alanları (örneğin, takvim denetimi gibi) tıklayın. Bu durumda, hizmetler Tıklanabilir alt bölümler görünüm hiyerarşisinin bir parçası olmadığı için görüntülenebilir.

Şekil 1. Seçilebilir gün öğeleri içeren özel bir takvim görünümü.

Şekil 1'deki örnekte, takvimin tamamı tek bir görünüm olarak uygulanmıştır. Dolayısıyla, görünümün içeriği ve kullanıcının seçimi hakkında yeterli bilgi almadığında veya geliştirici ek bilgi sağlamadığı sürece görünümün içinde yer alır. Örneğin, bir kullanıcı 17 tarihinde erişilebilirlik çerçevesi yalnızca açıklama bilgilerini alır. sahip olacaksınız. Bu durumda, TalkBack erişilebilirlik hizmeti "Takvim" veya "Nisan Takvimi" gibi ve kullanıcı hangi günün seçildiğini bilmez.

Bu gibi durumlarda erişilebilirlik hizmetleri için yeterli bağlam bilgisi sağlamak amacıyla çerçeve, sanal görünüm hiyerarşisini belirtmenin bir yolunu sunar. Sanal görünüm hiyerarşisi, erişilebilirlik hizmetleri için tamamlayıcı bir görünüm hiyerarşisi sağlamalarına olanak tanır. ekrandaki bilgilerle yakından eşleşiyor. Bu yaklaşım sayesinde erişilebilirlik hizmetleri, bağlam bilgisi sunar.

Sanal görünüm hiyerarşisinin gerekli olabileceği bir diğer durum, yakından alakalı işlevlere sahip View kontrolü grubu (bir öğedeki işlem kontrolü, bir veya daha fazla öğenin içeriğini etkiler. örneğin, ayrı öğeler içeren bir sayı seçici ve aşağı düğmelerini kullanın. Bu durumda erişilebilirlik hizmetleri, bir kontrol üzerindeki işlem, diğerindeki içeriği değiştirirken bu denetimlerin ilişkisi hizmeti açıklığa kavuşturmaktır.

Bu durumu ele almak için, ilgili denetimleri içeren bir görünümle gruplandırın ve sanal bir tarafından sağlanan bilgileri ve davranışları açıkça temsil edecek şekilde, bu kapsayıcıdan bir hiyerarşiye kontrol eder.

Bir görünüme sanal görünüm hiyerarşisi sağlamak için getAccessibilityNodeProvider(). yöntemini çağırın ve şunu döndürür: AccessibilityNodeProvider. Destek Kitaplığı'nı ViewCompat.getAccessibilityNodeProvider(). yöntemini kullanarak AccessibilityNodeProviderCompat.

Erişilebilirlik hizmetlerine bilgi sağlama ve erişilebilirlik odağı olarak ExploreByTouchHelper Bir AccessibilityNodeProviderCompat sağlar ve bir görünüme Telefon ederek AccessibilityDelegateCompat setAccessibilityDelegate. Örnek için bkz. ExploreByTouchHelperActivity ExploreByTouchHelper, şunun gibi çerçeve widget'ları tarafından da kullanılır: CalendarView, kendi çocuk ekranı SimpleMonthView.

Özel dokunma etkinliklerini yönet

Özel görünüm kontrolleri, örneklere göz atın.

Tıklamaya dayalı işlemleri tanımlayın

Widget'ınız OnClickListener veya OnLongClickListener arayüz üzerinde, sistem ACTION_CLICK ve ACTION_LONG_CLICK işlem olarak görebilirsiniz. Uygulamanız aşağıdakileri temel alan daha özelleştirilmiş bir widget kullanıyorsa OnTouchListener arayüzü, Tıklamaya dayalı erişilebilirlik işlemleri için özel işleyiciler tanımlayabilirsiniz. Bunu yapmak için replaceAccessibilityAction() yöntemini çağırın.

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
    ...

    // Assumes that the widget is designed to select text when tapped, and selects
    // all text when tapped and held. In its strings.xml file, this app sets
    // "select" to "Select" and "select_all" to "Select all".
    ViewCompat.replaceAccessibilityAction(
        binding.textSelectWidget,
        ACTION_CLICK,
        getString(R.string.select)
    ) { view, commandArguments ->
        selectText()
    }

    ViewCompat.replaceAccessibilityAction(
        binding.textSelectWidget,
        ACTION_LONG_CLICK,
        getString(R.string.select_all)
    ) { view, commandArguments ->
        selectAllText()
    }
}

Java

@Override
protected void onCreate(Bundle savedInstanceState) {
    ...

    // Assumes that the widget is designed to select text when tapped, and select
    // all text when tapped and held. In its strings.xml file, this app sets
    // "select" to "Select" and "select_all" to "Select all".
    ViewCompat.replaceAccessibilityAction(
            binding.textSelectWidget,
            ACTION_CLICK,
            getString(R.string.select),
            (view, commandArguments) -> selectText());

    ViewCompat.replaceAccessibilityAction(
            binding.textSelectWidget,
            ACTION_LONG_CLICK,
            getString(R.string.select_all),
            (view, commandArguments) -> selectAllText());
}

Özel tıklama etkinlikleri oluşturun

Özel bir kontrol, onTouchEvent(MotionEvent) öğesini kullanabilir dinleyici yöntemini kullanarak ACTION_DOWN ve ACTION_UP etkinlik ve özel bir tıklama etkinliği tetikleyin. Erişilebilirlik hizmetleriyle uyumluluğu sürdürmek için işleyicilerin aşağıdakileri yapması gerekir:

  1. Yorumlanan tıklama işlemi için uygun bir AccessibilityEvent oluşturun.
  2. Yapamayan kullanıcılar için özel tıklama işlemini gerçekleştirmek üzere erişilebilirlik hizmetlerini etkinleştirin dokunmatik ekran kullanın.

Bu gereksinimlerin verimli şekilde yerine getirilmesi için kodunuz, performClick() yöntem, Bunlar, bu yöntemin süper uygulamasını çağırır ve ardından istediğiniz işlemleri tıklama etkinliği için gereklidir. Özel tıklama işlemi algılandığında, bu kod daha sonra performClick() yöntemini çağırın. Aşağıdaki kod örneğinde bu kalıp gösterilmektedir.

Kotlin

class CustomTouchView(context: Context) : View(context) {

    var downTouch = false

    override fun onTouchEvent(event: MotionEvent): Boolean {
        super.onTouchEvent(event)

        // Listening for the down and up touch events.
        return when (event.action) {
            MotionEvent.ACTION_DOWN -> {
                downTouch = true
                true
            }

            MotionEvent.ACTION_UP -> if (downTouch) {
                downTouch = false
                performClick() // Call this method to handle the response and
                // enable accessibility services to
                // perform this action for a user who can't
                // tap the touchscreen.
                true
            } else {
                false
            }

            else -> false  // Return false for other touch events.
        }
    }

    override fun performClick(): Boolean {
        // Calls the super implementation, which generates an AccessibilityEvent
        // and calls the onClick() listener on the view, if any.
        super.performClick()

        // Handle the action for the custom click here.

        return true
    }
}

Java

class CustomTouchView extends View {

    public CustomTouchView(Context context) {
        super(context);
    }

    boolean downTouch = false;

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        super.onTouchEvent(event);

        // Listening for the down and up touch events
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                downTouch = true;
                return true;

            case MotionEvent.ACTION_UP:
                if (downTouch) {
                    downTouch = false;
                    performClick(); // Call this method to handle the response and
                                    // enable accessibility services to
                                    // perform this action for a user who can't
                                    // tap the touchscreen.
                    return true;
                }
        }
        return false; // Return false for other touch events.
    }

    @Override
    public boolean performClick() {
        // Calls the super implementation, which generates an AccessibilityEvent
        // and calls the onClick() listener on the view, if any.
        super.performClick();

        // Handle the action for the custom click here.

        return true;
    }
}

Önceki kalıp, özel tıklama etkinliğinin erişilebilirlikle uyumlu olmasını sağlamaya yardımcı olur erişilebilirlik etkinliği oluşturmak için performClick() yöntemini kullanarak Erişilebilirlik hizmetlerinin, özel işlemi gerçekleştiren kullanıcı adına işlem yapması için bir giriş noktası sağlaması tıklama etkinliği.