Giriş etkinliklerine genel bakış

Oluşturma yöntemini deneyin
Jetpack Compose, Android için önerilen kullanıcı arayüzü araç setidir. Oluşturma'da dokunma ve giriş işlevini nasıl kullanacağınızı öğrenin.

Android'de, kullanıcıların uygulamanızla etkileşiminden olayları engellemenin birden fazla yolu vardır. Kullanıcı arayüzünüzde etkinlikleri değerlendirirken yaklaşım, etkinlikleri kullanıcının etkileşimde bulunduğu belirli View nesnesinden yakalamaktır. View sınıfı bunun için gereken araçları sağlar.

Düzeninizi oluşturmak için kullanacağınız çeşitli View sınıflarında, kullanıcı arayüzü etkinlikleri için faydalı görünen birkaç genel geri çağırma yöntemi fark edebilirsiniz. Bu yöntemler, ilgili nesnede işlem gerçekleştiğinde Android çerçevesi tarafından çağrılır. Örneğin, bir Görünüm'e (düğme gibi) dokunulduğunda söz konusu nesnede onTouchEvent() yöntemi çağrılır. Ancak buna müdahale etmek için sınıfı genişletmeniz ve yöntemi geçersiz kılmanız gerekir. Ancak, her View nesnesinin bu tür bir etkinliği işlemek üzere genişletilmesi pratik olmaz. Bu nedenle View sınıfı, çok daha kolay bir şekilde tanımlayabileceğiniz geri çağırma işlevlerine sahip iç içe geçmiş arayüzler koleksiyonunu da içerir. Etkinlik işleyiciler adı verilen bu arayüzler, kullanıcı arayüzünüzle olan kullanıcı etkileşimini yakalamanıza olanak tanır.

Kullanıcı etkileşimini dinlemek için etkinlik işleyicileri yaygın olarak kullanıyor olsanız da, özel bileşen oluşturmak için bir Görünüm sınıfını genişletmek istediğiniz bir zaman olabilir. Belki daha gösterişli bir şeyler yapmak için Button dersinin süresini uzatmak istersiniz. Bu durumda, sınıf etkinlik işleyicilerini kullanarak sınıfınız için varsayılan etkinlik davranışlarını tanımlayabilirsiniz.

Etkinlik işleyiciler

Etkinlik işleyici, View sınıfında yer alan ve tek bir geri çağırma yöntemi içeren arayüzdür. Bu yöntemler, işleyicinin kaydedildiği Görünüm, kullanıcı arayüzündeki öğeyle kullanıcı etkileşimi tarafından tetiklendiğinde Android çerçevesi tarafından çağrılır.

Etkinlik işleyici arayüzlerine aşağıdaki geri çağırma yöntemleri dahildir:

onClick()
Gönderen: View.OnClickListener. Bu, kullanıcı öğeye dokunduğunda (dokunma modundayken) veya gezinme tuşları ya da iztopu olan öğeye odaklanıp uygun "enter" tuşuna bastığında veya iztopuna bastığında çağrılır.
onLongClick()
Gönderen: View.OnLongClickListener. Bu, kullanıcı öğeye dokunup basılı tuttuğunda (dokunma modundayken) veya gezinme tuşları ya da iztopu olan öğeye odaklanıp uygun "enter" tuşuna basıp basılı tuttuğunda veya iztopuna basıp basılı tuttuğunda (bir saniye için) çağrılır.
onFocusChange()
Gönderen: View.OnFocusChangeListener. Bu, kullanıcı gezinme tuşlarını veya iztopunu kullanarak öğeye gittiğinde veya öğeden ayrıldığında çağrılır.
onKey()
Gönderen: View.OnKeyListener. Kullanıcı öğeye odaklandığında ve cihazdaki bir donanım anahtarına bastığında veya serbest bıraktığında çağrılır.
onTouch()
Gönderen: View.OnTouchListener. Kullanıcı, basma, serbest bırakma veya ekranda (öğenin sınırları içinde) herhangi bir hareket hareketi de dahil olmak üzere, dokunma etkinliği olarak nitelendirilen bir işlem gerçekleştirdiğinde bu çağrılır.
onCreateContextMenu()
Gönderen: View.OnCreateContextMenuListener. Buna, İçerik Menüsü oluşturulurken (sürekli "uzun tıklamanın" sonucu olarak) denir. Menüler geliştirici kılavuzundaki içerik menüleriyle ilgili tartışmaya bakın.

Bu yöntemler, kendi ilgili arayüzlerinde yalnızca bu yöntemleri kullanabilir. Bu yöntemlerden birini tanımlamak ve etkinliklerinizi işlemek için Etkinliğinize iç içe yerleştirilmiş arayüzü uygulayın ya da anonim bir sınıf olarak tanımlayın. Daha sonra, uygulamanızın bir örneğini ilgili View.set...Listener() yöntemine iletin. (Örneğin, setOnClickListener() çağrısı yapın ve OnClickListener uygulamanızı iletin.)

Aşağıdaki örnekte, bir düğme için tıklama işleyicinin nasıl kaydedileceği gösterilmektedir.

Kotlin

protected void onCreate(savedValues: Bundle) {
    ...
    val button: Button = findViewById(R.id.corky)
    // Register the onClick listener with the implementation above
    button.setOnClickListener { view ->
        // do something when the button is clicked
    }
    ...
}

Java

// Create an anonymous implementation of OnClickListener
private OnClickListener corkyListener = new OnClickListener() {
    public void onClick(View v) {
      // do something when the button is clicked
    }
};

protected void onCreate(Bundle savedValues) {
    ...
    // Capture our button from layout
    Button button = (Button)findViewById(R.id.corky);
    // Register the onClick listener with the implementation above
    button.setOnClickListener(corkyListener);
    ...
}

OnClickListener'ı Etkinliğinizin bir parçası olarak uygulamak da daha kullanışlı olabilir. Bu sayede ekstra sınıf yükünden ve nesne tahsisinden kurtulmuş olursunuz. Örnek:

Kotlin

class ExampleActivity : Activity(), OnClickListener {
  
    protected fun onCreate(savedValues: Bundle) {
        val button: Button = findViewById(R.id.corky)
        button.setOnClickListener(this)
    }

    // Implement the OnClickListener callback
    fun onClick(v: View) {
        // do something when the button is clicked
    }
}

Java

public class ExampleActivity extends Activity implements OnClickListener {
    protected void onCreate(Bundle savedValues) {
        ...
        Button button = (Button)findViewById(R.id.corky);
        button.setOnClickListener(this);
    }

    // Implement the OnClickListener callback
    public void onClick(View v) {
      // do something when the button is clicked
    }
    ...
}

Yukarıdaki örnekte yer alan onClick() geri çağırma işlevinin hiçbir dönüş değeri olmadığına, ancak diğer bazı etkinlik işleyici yöntemlerinin bir boole döndürmesi gerektiğine dikkat edin. Bunun nedeni etkinliğe bağlıdır. Bunu yapan çok azının ise nedeni şudur:

  • onLongClick() - Bu, etkinliği tüketip tüketmediğinizi ve daha fazla taşınmaması gerektiğini belirten bir boole döndürür. Yani, etkinliği işlediğinizi ve burada durması gerektiğini belirtmek için true değerini döndürün; etkinliği işlemediyseniz false değerini ve/veya etkinliğin diğer herhangi bir tıklama dinleyicisine devam etmesi gerekiyorsa bu değeri döndürün.
  • onKey() - Bu, etkinliği tüketip tüketmediğinizi ve daha fazla taşınmaması gerektiğini belirten bir boole döndürür. Yani, etkinliği işlediğinizi ve burada durması gerektiğini belirtmek için true değerini döndürün; etkinliği işlemediyseniz false değerini ve/veya etkinliğin diğer anahtar işleyicilere devam etmesi gerektiğini belirtin.
  • onTouch() - Bu işlev, işleyicinizin bu etkinliği kullanıp kullanmadığını belirtmek için bir boole döndürür. Önemli olan, bu etkinlikte birbirini takip eden birden fazla işlemin olabilmesidir. Yani, "down" işlemi etkinliği alındığında false (yanlış) değerini döndürürseniz, etkinliği tüketmediğinizi ve bu etkinlikten sonraki işlemlerle de ilgilenmediğinizi belirtmiş olursunuz. Dolayısıyla, etkinlik içinde parmak hareketi veya nihai yukarı işlemi etkinliği gibi başka işlemler için çağrılmazsınız.

Donanımla ilgili önemli etkinliklerin her zaman o sırada odakta olan Görünüm'e iletildiğini unutmayın. Görünüm hiyerarşisinin en tepesinden başlayıp daha sonra uygun hedefe ulaşana kadar aşağı doğru dağıtılırlar. Görünümünüz (veya Görünümünüzün bir alt öğesi) şu anda odaktaysa etkinlik seyahatini dispatchKeyEvent() yöntemiyle görebilirsiniz. Görünümünüz aracılığıyla önemli etkinlikleri kaydetmeye alternatif olarak onKeyDown() ve onKeyUp() ile Etkinliğinizdeki tüm etkinlikleri de alabilirsiniz.

Ayrıca, uygulamanızda metin girişi yapmayı düşünürken çoğu cihazın yalnızca yazılım giriş yöntemlerine sahip olduğunu unutmayın. Bu tür yöntemlerin tuş tabanlı olması gerekmez. Bazılarında ses girişi, el yazısı vb. kullanılabilir. Bir giriş yöntemi klavye benzeri bir arayüz sunsa bile genellikle onKeyDown() etkinlik ailesini tetiklemez. Uygulamanızı donanım klavyesi olan cihazlarla sınırlamak istemediğiniz sürece, kontrol edilmesi için belirli tuşlara basmayı gerektiren bir kullanıcı arayüzü geliştirmemelisiniz. Özellikle kullanıcı Return tuşuna bastığında girişi doğrulamak için bu yöntemleri kullanmayın. Bunun yerine, giriş yöntemine uygulamanızın nasıl tepki vermesini beklediğini bildirmek için IME_ACTION_DONE gibi işlemler kullanın. Bu sayede uygulama, kullanıcı arayüzünü anlamlı bir şekilde değiştirebilir. Bir yazılım giriş yönteminin nasıl çalışması gerektiği konusunda varsayımlardan kaçının ve uygulamanıza önceden biçimlendirilmiş metin sağlayacağına güvenin.

Not: Android, önce etkinlik işleyicileri, ardından ikinci sınıf tanımından uygun varsayılan işleyicileri çağırır. Dolayısıyla bu etkinlik işleyicilerden true döndürülmesi, etkinliğin diğer etkinlik işleyicilere yayılmasını durdurur ve Görünüm'de varsayılan etkinlik işleyiciye geri çağırmayı da engeller. Bu nedenle, true değerini döndürdüğünüzde etkinliği sonlandırmak istediğinizden emin olun.

Etkinlik işleyiciler

View'dan özel bileşen oluşturuyorsanız varsayılan etkinlik işleyiciler olarak kullanılan birkaç geri çağırma yöntemi tanımlayabilirsiniz. Özel Görünüm Bileşenleri hakkındaki belgede, etkinlik işleme için kullanılan yaygın geri çağırmalardan bazılarını öğreneceksiniz. Örneğin:

Bilmeniz gereken bazı başka yöntemler de View sınıfının bir parçası olmasa da etkinlikleri yönetme şeklinizi doğrudan etkileyebilir. Bu nedenle, bir düzen içindeki daha karmaşık etkinlikleri yönetirken şu diğer yöntemleri göz önünde bulundurun:

Dokunma modu

Kullanıcı, yön tuşları veya iztopuyla kullanıcı arayüzünde gezinirken, giriş kabul edilecek öğelerin neler olduğunu görebilmesi için işlem yapılabilir öğelere (ör. düğmeler) odaklanılmalıdır. Bununla birlikte, cihazda dokunma işlevi varsa ve kullanıcı arayüze dokunarak etkileşim kurmaya başlarsa, öğeleri vurgulamak veya belirli bir Görünüme odaklanmak artık gerekli değildir. Dolayısıyla, etkileşim için "dokunma modu" adlı bir mod vardır.

Dokunma özellikli cihazlarda, kullanıcı ekrana dokunduğunda cihaz dokunma moduna girer. Bu aşamadan sonra, metin düzenleme widget'ları gibi yalnızca isFocusableInTouchMode() değerinin doğru olduğu Görünümler'e odaklanılabilir. Düğmeler gibi dokunulabilir olan diğer Görünümler dokunulduğunda odaklamaz; sadece basıldığında tıklama dinleyicilerini etkinleştirirler.

Bir kullanıcı yön tuşuna bastığında veya iztopu ile ekranı kaydırdığında, cihaz dokunma modundan çıkar ve odaklanılacak bir görünüm bulur. Artık kullanıcı ekrana dokunmadan kullanıcı arayüzüyle etkileşimde bulunmaya devam edebilir.

Dokunma modu durumu tüm sistemde (tüm pencereler ve etkinlikler) korunur. Geçerli durumu sorgulamak için cihazın şu anda dokunma modunda olup olmadığını öğrenmek amacıyla isInTouchMode() yöntemini çağırabilirsiniz.

Odağı işleme

Çerçeve, kullanıcı girişlerine yanıt olarak rutin odak hareketini yönetir. Buna, Görünümler kaldırılırken veya gizlenirken ya da yeni Görünümler kullanılabilir hale geldikçe odağı değiştirmek de dahildir. Görüntülemeler, isFocusable() yöntemiyle odaklanmaya istekli olduklarını gösterir. Bir Görünümün odağı alıp veremeyeceğini değiştirmek için setFocusable() numaralı telefonu arayın. Dokunma modundayken bir Görünümün isFocusableInTouchMode() ile odaklanmaya izin verip vermediğini sorgulayabilirsiniz. Bu ayarı setFocusableInTouchMode() ile değiştirebilirsiniz.

Android 9 (API düzeyi 28) veya sonraki sürümleri çalıştıran cihazlarda etkinliklere ilk odak atanmaz. Bunun yerine, isterseniz ilk odağı açıkça istemeniz gerekir.

Odak hareketi, belirli bir yönde en yakın komşuyu bulan bir algoritmaya dayanır. Nadir durumlarda varsayılan algoritma, geliştiricinin istediği davranışla eşleşmeyebilir. Bu durumlarda, düzen dosyasında şu XML özellikleriyle açık geçersiz kılmalar sağlayabilirsiniz: nextFocusDown, nextFocusLeft, nextFocusRight ve nextFocusUp. Bu özelliklerden birini, odağın ayrıldığı Görünüm'e ekleyin. Özelliğin değerini, odağın verilmesi gereken Görüntüleme hedefinin kimliği olacak şekilde tanımlayın. Örnek:

<LinearLayout
    android:orientation="vertical"
    ... >
  <Button android:id="@+id/top"
          android:nextFocusUp="@+id/bottom"
          ... />
  <Button android:id="@+id/bottom"
          android:nextFocusDown="@+id/top"
          ... />
</LinearLayout>

Normalde, bu dikey düzende ilk Düğmeden yukarı doğru gidilmez veya ikinci Düğmeden aşağı doğru gider olmazdı. Üst düğme artık alttakini nextFocusUp olarak tanımladığından (veya tam tersi) gezinme odağı yukarıdan aşağıya ve alttan üste doğru değişir.

Kullanıcı arayüzünüzde bir Görünümün odaklanılabilir olduğunu belirtmek istiyorsanız (normalde kullanılmıyorken), düzen bildiriminizde Görünüm'e android:focusable XML özelliğini ekleyin. true değerini ayarlayın. Ayrıca, android:focusableInTouchMode ile Dokunma Modu'ndayken bir Görünümün odaklanılabilir olduğunu bildirebilirsiniz.

Belirli bir Görünüme odaklanılmasını istemek için requestFocus() numaralı telefonu arayın.

Odak etkinliklerini dinlemek için (Bir Görünüme odaklanıldığında veya odağı kaybettiğinde bildirim alırsınız) için Etkinlik işleyiciler bölümünde açıklandığı gibi onFocusChange() kullanın.