Giriş etkinliklerine genel bakış

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

Android'de, bir kullanıcının uygulamanızla etkileşiminden gelen etkinliklere müdahale etmenin 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 spesifik View nesnesinden yakalamaktır. View sınıfı bu işlemi yapmaya yönelik araçları sağlar.

Düzeninizi oluşturmak için kullanacağınız çeşitli Görünüm sınıflarında, kullanıcı arayüzü etkinlikleri için yararlı olan çeşitli genel geri çağırma yöntemleriyle karşılaşabilirsiniz. Bu yöntemler, ilgili nesnede gerçekleştiğinde Android çerçevesi tarafından çağrılır. Örneğin, bir Görünüme (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 böyle bir etkinliği işlemek için her View nesnesini genişletmek pratik olmaz. Bu nedenle, View sınıfı çok daha kolay tanımlayabileceğiniz geri çağırmalara sahip iç içe yerleştirilmiş arayüzler koleksiyonunu da içerir. Etkinlik işleyiciler olarak adlandırılan bu arayüzler, kullanıcı arayüzünüzle kurulan etkileşimi yakalamanız için kullanılır.

Kullanıcı etkileşimini dinlemek için etkinlik işleyicileri daha yaygın olarak kullanacaksınız ancak özel bir bileşen oluşturmak amacıyla bir View sınıfını genişletmek isteyebileceğiniz durumlar da olabilir. Belki daha da güzel bir şey yapmak için Button sınıfını genişletmek isteyebilirsiniz. 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, tek bir geri çağırma yöntemi içeren bir arayüzdür. Bu yöntemler, dinleyicinin kaydedildiği Görünüm, kullanıcı arayüzündeki öğeyle etkileşimiyle tetiklendiğinde Android çerçevesi tarafından çağrılır.

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

onClick()
View.OnClickListener tarafından. Bu, kullanıcı öğeye dokunduğunda (dokunma modunda) veya gezinme tuşları ya da iztopuyla öğeye odaklanıp uygun "Enter" tuşuna bastığında veya iztopuna bastığında çağrılır.
onLongClick()
View.OnLongClickListener tarafından. Bu, kullanıcı öğeye dokunduğunda ve öğeyi tuttuğunda (dokunma modunda) veya gezinme tuşları ya da izleme topuyla öğeye odaklandığında ve uygun "Enter" tuşuna basıp basılı tuttuğunda veya iztopunu (bir saniye süreyle) basılı tuttuğunda çağrılır.
onFocusChange()
View.OnFocusChangeListener tarafından. Bu, kullanıcı gezinme tuşlarını veya izleme topunu kullanarak bir öğenin içine geçtiğinde veya öğeden ayrıldığında çağrılır.
onKey()
View.OnKeyListener tarafından. Bu, kullanıcı öğeye odaklandığında ve cihazdaki bir donanım tuşuna bastığında veya tuşu bıraktığında çağrılır.
onTouch()
View.OnTouchListener tarafından. Bu, kullanıcı basın, serbest bırakma veya ekranda herhangi bir hareket hareketi (öğenin sınırları içinde) dahil olmak üzere, dokunma etkinliği olarak nitelendirilebilecek bir işlem gerçekleştirdiğinde çağrılır.
onCreateContextMenu()
View.OnCreateContextMenuListener tarafından. Bu, bir İçerik Menüsü oluşturulurken (sürekli "uzun tıklama" sonucunda) çağrılır. Menüler geliştirici kılavuzunda içerik menüleriyle ilgili tartışmaya bakın.

Bu yöntemler, ilgili arayüzleri yalnızca bu yöntemlerde kullanabilir. Bu yöntemlerden birini tanımlamak ve etkinliklerinizi işlemek için iç içe yerleştirilmiş arayüzü Etkinliğinize uygulayın veya anonim bir sınıf olarak tanımlayın. Ardından uygulamanızın bir örneğini ilgili View.set...Listener() yöntemine iletin. (Ör. setOnClickListener() işlevini çağırı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);
    ...
}

Ayrıca, Etkinliğinizin bir parçası olarak OnClickListener'ı uygulamak daha kullanışlı olabilir. Böylece fazladan sınıf yükü ve nesne tahsisi önlenir. Ö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ğırmasının herhangi bir dönüş değeri olmadığına ancak diğer bazı etkinlik işleyici yöntemlerinin boole döndürmesi gerektiğine dikkat edin. Sebep, etkinliğe göre değişir. Bunu başaran birkaç sorunun nedeni şu şekildedir:

  • onLongClick() - Bu komut, etkinliği kullanıp kullanmadığınızı ve etkinliğin daha fazla taşınmaması gerektiğini belirtmek için 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 ve/veya etkinliğin diğer tıklama işleyicilere devam etmesi gerekiyorsa false (yanlış) değerini döndürün.
  • onKey() - Bu komut, etkinliği kullanıp kullanmadığınızı ve etkinliğin daha fazla taşınmaması gerektiğini belirtmek için 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 ve/veya etkinliğin diğer anahtar işleyicilere devam etmesi gerekiyorsa false (yanlış) değerini döndürün.
  • onTouch() - Bu komut, dinleyicinizin 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. Dolayısıyla, aşağı işlem etkinliği alındığında false (yanlış) değerini döndürürseniz etkinliği kullanmadığınızı ve bu etkinlikten sonraki işlemlerle ilgilenmediğinizi belirtirsiniz. Dolayısıyla, etkinlik içinde parmak hareketi veya nihai yukarı işlemi gibi başka herhangi bir işlem için çağrılmaz.

Donanım önemli etkinliklerinin her zaman o anda odakta olan görünüme dağıtıldığını unutmayın. Görünüm hiyerarşisinin en üstünden başlayıp uygun hedefe ulaşıncaya kadar aşağıya 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 etkinliğin dispatchKeyEvent() yöntemini kullanarak gezindiğini görebilirsiniz. Önemli etkinlikleri Görünümünüz üzerinden kaydetmeye alternatif olarak, onKeyDown() ve onKeyUp() ile Etkinliğinizdeki tüm etkinlikleri de alabilirsiniz.

Ayrıca, uygulamanız için metin girişi düşünürken birçok cihazın yalnızca yazılım giriş yöntemleri olduğunu unutmayın. Bu tür yöntemlerin tuş tabanlı olması gerekmez; bazı yöntemler ses girişi, el yazısı ve benzeri özellikleri kullanabilir. Giriş yöntemi, klavye benzeri bir arayüz sunsa bile genellikle onKeyDown() etkinlik ailesini tetiklemez. Uygulamanızı, donanım klavyesi olan cihazlarla sınırlandırmak istemediğiniz sürece hiçbir zaman belirli tuşa basma işlemlerinin kontrol edilmesini gerektiren bir kullanıcı arayüzü oluşturmamalısınız. Özellikle, kullanıcı Return tuşuna bastığında girişi doğrulamak için bu yöntemlere güvenmeyin. Bunun yerine, giriş yöntemine nasıl tepki vermeyi beklediğini belirtmek için IME_ACTION_DONE gibi işlemler kullanın, böylece kullanıcı arayüzünü anlamlı bir şekilde değiştirebilir. Bir yazılım giriş yönteminin nasıl çalışması gerektiğine dair varsayımlardan kaçının ve uygulamanıza halihazırda biçimlendirilmiş metin sağlayacağına güvenin.

Not: Android önce etkinlik işleyicileri, ardından da sınıf tanımındaki uygun varsayılan işleyicileri çağırır. Bu nedenle, bu etkinlik işleyicilerden true değeri 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

Görünüm'den özel bileşen oluşturuyorsanız varsayılan etkinlik işleyici olarak kullanılan çeşitli geri çağırma yöntemleri tanımlayabilirsiniz. Özel Görünüm Bileşenleri ile ilgili dokümanda, olay işleme için kullanılan yaygın geri çağırmalardan bazılarını öğreneceksiniz. Bu geri çağırmalara şunlar dahildir:

Görünüm sınıfının parçası olmayan ancak etkinlikleri ele alma şeklinizi doğrudan etkileyebilecek diğer bazı yöntemler hakkında bilgi sahibi olmanız gerekir. Dolayısıyla, bir düzen içindeki daha karmaşık etkinlikleri yönetirken aşağıdaki diğer yöntemleri göz önünde bulundurun:

Dokunma modu

Kullanıcı, yön tuşları veya iztopu olan bir kullanıcı arayüzünde gezinirken, kullanıcının girişi kabul edeceklerini görebilmesi için, işlem yapılabilir öğelere (ör. düğmeler) odaklanılmalıdır. Bununla birlikte, cihazın dokunma özellikleri varsa ve kullanıcı, arayüze dokunarak arayüzle etkileşimde bulunmaya başlarsa, öğelerin öne çıkarılması veya belirli bir Görünüme odaklanması gerekmez. Böylece, "dokunma modu" adlı bir etkileşim modu vardır.

Dokunma özellikli cihazlarda, kullanıcı ekrana dokunduğunda cihaz dokunmatik moda girer. Bu noktadan itibaren, metin düzenleme widget'ları gibi yalnızca isFocusableInTouchMode() için doğru değerine sahip Görünümlere odaklanılabilir. Düğmeler gibi dokunulabilir olan diğer Görünümler ise dokunulduğunda odaklanmaz, basıldığında tıklama dinleyicilerini etkinleştirir.

Kullanıcı bir yön tuşuna dokunduğunda veya iztopuyla kaydırdığında cihaz dokunma modundan çıkar ve odaklanacak 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. Mevcut durumu sorgulamak için isInTouchMode() numaralı telefonu arayarak cihazın dokunma modunda olup olmadığını öğrenebilirsiniz.

Odaklanma

Çerçeve, kullanıcı girişine yanıt olarak rutin odak hareketlerini yönetir. Bu, Görünümler kaldırılırken veya gizlendikçe ya da yeni Görünümler kullanılabilir olduğunda odağın değiştirilmesini içerir. Görüntüleme sayısı, isFocusable() yöntemi aracılığıyla odaklanmaya istekli olduklarını gösterir. Bir Görünümün odaklanma durumunu değiştirmek için setFocusable() numaralı telefonu arayın. Dokunma modunda, bir Görünümün isFocusableInTouchMode() ile odaklanmaya izin verip vermediğini sorgulayabilirsiniz. setFocusableInTouchMode() ile bu ayarı değiştirebilirsiniz.

Android 9 (API düzeyi 28) veya sonraki sürümleri çalıştıran cihazlarda, etkinliklere başlangıç odağı atanmaz. Bunun yerine, isterseniz açıkça ilk odaklama isteğinde bulunmanız gerekir.

Odak hareketi, belirli bir yönde en yakın komşuyu bulan bir algoritmaya dayanır. Nadir durumlarda, varsayılan algoritma geliştiricinin istenen davranışıyla eşleşmeyebilir. Bu durumlarda, düzen dosyasında şu XML özellikleriyle açık geçersiz kılma işlemleri sağlayabilirsiniz: nextFocusDown, nextFocusLeft, nextFocusRight ve nextFocusUp. Bu özelliklerden birini, odağın ayrıldığı Görünüm görünümüne ekleyin. Özelliğin değerini, odaklanılacak Görünümün 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ı gitmek hiçbir yere gitmez ya da ikinci Düğmeden aşağı doğru gidilmez. Üstteki Düğme alttaki düğmeyi nextFocusUp olarak tanımladığından (tam tersi de geçerlidir) gezinme odağı yukarıdan aşağıya ve aşağıdan yukarıya doğru geçiş yapar.

Bir Görünümü kullanıcı arayüzünüzde odaklanılabilir olarak tanımlamak isterseniz (geleneksel olarak öyle değilken) düzen bildiriminize, Görünüme android:focusable XML özelliğini ekleyin. true değerini ayarlayın. Ayrıca, android:focusableInTouchMode kullanarak Dokunma Modu'ndayken bir görünümü odaklanılabilir olarak tanımlayabilirsiniz.

Belirli bir görünümün odaklanmasını istemek için requestFocus() numaralı telefonu arayın.

Odaklanılan etkinlikleri dinlemek (bir Görünüm odağı aldığında veya kaybettiğinde bildirim alın) Etkinlik işleyiciler bölümünde açıklandığı gibi onFocusChange() kullanın.