Android'de, kullanıcının uygulamanızla etkileşiminden gelen etkinlikleri yakalamanın birden fazla yolu vardır. Kullanıcı arayüzünüzdeki etkinlikleri değerlendirirken, kullanıcının etkileşimde bulunduğu belirli View nesnesindeki etkinlikleri yakalamak gerekir. View sınıfı, bunu yapmanın yolunu sunar.
Düzeninizi oluşturmak için kullanacağınız çeşitli View sınıflarında, kullanıcı arayüzü etkinlikleri için yararlı görünebilecek birkaç genel geri çağırma yöntemi görebilirsiniz. Bu yöntemler, ilgili işlem nesnede gerçekleştiğinde Android çerçevesi tarafından çağrılır. Örneğin, bir Görünüm'e (ör. Düğme) dokunulduğunda söz konusu nesnede onTouchEvent() yöntemi çağrılır. Ancak bunu yakalamak için sınıfı genişletip 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ğırma işlevlerine sahip iç içe yerleştirilmiş arayüzlerden oluşan bir koleksiyon da içerir. Etkinlik dinleyicileri olarak adlandırılan bu arayüzler, kullanıcıların kullanıcı arayüzünüzle etkileşimini yakalamanızı sağlar.
Kullanıcı etkileşimini dinlemek için genellikle etkinlik dinleyicilerini kullanırsınız ancak özel bir bileşen oluşturmak amacıyla bir View sınıfını genişletmek isteyebileceğiniz zamanlar olabilir.
Belki de Button
sınıfını genişleterek daha şık bir şey yapmak istiyorsunuz. Bu durumda, sınıf event handler'larını kullanarak sınıfınızın varsayılan etkinlik davranışlarını tanımlayabilirsiniz.
Etkinlik işleyicileri
Etkinlik işleyici, View sınıfında tek bir geri çağırma yöntemi içeren bir arayüzdür. Bu yöntemler, işleyicinin kaydedildiği Görünüm, kullanıcı arayüzündeki öğeyle kullanıcı etkileşiminde bulunulduğunda Android çerçevesi tarafından çağrılır.
Etkinlik işleyici arayüzlerinde aşağıdaki geri arama yöntemleri bulunur:
onClick()- Başlangıç fiyatı:
View.OnClickListener. Bu, kullanıcı öğeye dokunduğunda (dokunma modundayken) veya öğeye gezinme tuşları ya da trackball ile odaklanıp uygun "enter" tuşuna bastığında ya da trackball'a bastığında çağrılır. onLongClick()- Başlangıç fiyatı:
View.OnLongClickListener. Bu yöntem, kullanıcı öğeye dokunup basılı tuttuğunda (dokunma modundayken) veya gezinme tuşları ya da trackball ile öğeye odaklanıp uygun "enter" tuşuna ya da trackball'a bir saniye boyunca bastığında çağrılır. onFocusChange()- Başlangıç fiyatı:
View.OnFocusChangeListener. Bu işlev, kullanıcı öğeye veya öğeden uzaklaşırken gezinme tuşlarını ya da trackball'u kullandığında çağrılır. onKey()- Başlangıç fiyatı:
View.OnKeyListener. Bu yöntem, kullanıcı öğeye odaklandığında ve cihazdaki bir donanım anahtarına bastığında veya anahtarı bıraktığında çağrılır. onTouch()- Başlangıç fiyatı:
View.OnTouchListener. Bu yöntem, kullanıcı ekranda dokunma etkinliği olarak nitelendirilen bir işlem (ör. basma, bırakma veya öğenin sınırları içinde herhangi bir hareket hareketi) gerçekleştirdiğinde çağrılır. onCreateContextMenu()- Başlangıç fiyatı:
View.OnCreateContextMenuListener. Bu işlev, bir bağlam menüsü oluşturulurken (uzun tıklama sonucunda) çağrılır. Menüler geliştirici kılavuzundaki bağlam menüleriyle ilgili tartışmaya bakın.
Bu yöntemler, ilgili arayüzün tek öğeleridir. Bu yöntemlerden birini tanımlamak ve etkinliklerinizi işlemek için iç içe yerleştirilmiş arayüzü Etkinliğinizde uygulayın veya anonim sınıf olarak tanımlayın.
Ardından, uygulamanızın bir örneğini ilgili View.set...Listener() yöntemine iletin. (Örneğin, işlevini çağırın
setOnClickListener()
ve setOnClickListener()OnClickListener işlevinin uygulamanızı iletin.)
Aşağıdaki örnekte, bir düğme için tıklama işleyicisinin 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 uygun olabilir. Bu sayede, ek sınıf yükleme ve nesne ayırma işlemlerinden kaçınılabilir. Örneğin:
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 onClick() geri çağırma işlevinin dönüş değeri olmadığını, ancak diğer bazı etkinlik işleyicisi yöntemlerinin bir Boole değeri döndürmesi gerektiğini unutmayın. Nedeni etkinliğe bağlıdır. Bunu yapan birkaç kullanıcı için nedenleri aşağıda açıklanmıştır:
- Bu, etkinliği kullanıp kullanmadığınızı ve daha fazla işlenmemesi gerektiğini belirten bir boole değeri 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 dinleyicilerinde devam etmesi gerekiyorsa false değerini döndürün.onLongClick()- Bu, etkinliği kullanıp kullanmadığınızı ve daha fazla işlenmemesi gerektiğini belirten bir boole değeri 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üm tuş dinleyicilerinde devam etmesi gerekiyorsa false değerini döndürün.onKey()- Bu, dinleyicinizin bu etkinliği kullanıp kullanmadığını belirten bir boole değeri döndürür. Önemli olan nokta, bu etkinliğin birbirini takip eden birden fazla işleme sahip olabilmesidir. Bu nedenle, aşağı işlem etkinliği alındığında yanlış değerini döndürürseniz etkinliği kullanmadığınızı ve bu etkinlikten sonraki işlemlerle de ilgilenmediğinizi belirtmiş olursunuz. Bu nedenle, etkinlik içinde başka bir işlem (ör. parmak hareketi) veya nihai yukarı kaydırma işlemi için çağrılmazsınız.onTouch()
Donanım önemli etkinliklerinin her zaman odaklanılan görünüme iletildiğini unutmayın. Bu etkinlikler, görünüm hiyerarşisinin en üstünden başlayarak uygun hedefe ulaşana kadar aşağı doğru gönderilir. Görünümünüz (veya Görünümünüzün bir alt öğesi) şu anda odaklanmış durumdaysa etkinliğin yöntemiyle ilerlediğini görebilirsiniz. Önemli etkinlikleri Görünümünüz üzerinden yakalamak yerine, dispatchKeyEvent() ve onKeyDown() ile Etkinliğinizdeki tüm etkinlikleri de alabilirsiniz.onKeyUp()
Ayrıca, uygulamanız için metin girişi hakkında düşünürken birçok cihazda yalnızca yazılım giriş yöntemleri olduğunu unutmayın. Bu tür yöntemlerin anahtar tabanlı olması gerekmez. Bazıları ses girişi, el yazısı vb. kullanabilir. Bir giriş yöntemi klavye benzeri bir arayüz sunsa bile genellikle etkinlik ailesini tetiklemez. Uygulamanızı donanım klavyesi olan cihazlarla sınırlamak istemiyorsanız kontrol için belirli tuşlara basılmasını gerektiren bir kullanıcı arayüzü oluşturmamalısınız. Özellikle, kullanıcı Enter tuşuna bastığında girişi doğrulamak için bu yöntemlere güvenmeyin. Bunun yerine, giriş yöntemine uygulamanızın nasıl tepki vermesini beklediğinizi bildirmek için onKeyDown()IME_ACTION_DONE gibi işlemler kullanın. Böylece giriş yöntemi, kullanıcı arayüzünü anlamlı bir şekilde değiştirebilir. Yazılım giriş yönteminin nasıl çalışması gerektiğiyle ilgili varsayımlarda bulunmayın. Uygulamanıza önceden biçimlendirilmiş metin sağlaması için yazılım giriş yöntemine güvenin.
Not: Android, önce etkinlik işleyicilerini, ardından sınıf tanımındaki uygun varsayılan işleyicileri çağırır. Bu nedenle, bu etkinlik işleyicilerinden true döndürülmesi, etkinliğin diğer etkinlik işleyicilere yayılmasını durdurur ve görünümdeki varsayılan etkinlik işleyicisine 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şleyicileri
View'dan özel bir bileşen oluşturuyorsanız varsayılan etkinlik işleyicileri olarak kullanılan çeşitli geri çağırma yöntemleri tanımlayabilirsiniz. Özel Görünüm Bileşenleri hakkındaki dokümanda, etkinlik işleme için kullanılan bazı yaygın geri çağırmalar hakkında bilgi edinebilirsiniz. Örneğin:
- Yeni bir önemli etkinlik gerçekleştiğinde çağrılır.onKeyDown(int, KeyEvent)- Bir tuşu bırakma etkinliği gerçekleştiğinde çağrılır.onKeyUp(int, KeyEvent): İz topu hareket etkinliği gerçekleştiğinde çağrılır.onTrackballEvent(MotionEvent): Dokunmatik ekran hareket etkinliği gerçekleştiğinde çağrılır.onTouchEvent(MotionEvent)- Görünüm odak kazandığında veya odağı kaybettiğinde çağrılır.onFocusChanged(boolean, int, Rect)
Görünüm sınıfına dahil olmayan ancak etkinlikleri işleme şeklinizi doğrudan etkileyebilecek başka yöntemler de vardır. Bu nedenle, bir düzende daha karmaşık etkinlikleri yönetirken şu diğer yöntemleri göz önünde bulundurun:
: Bu,Activity.dispatchTouchEvent(MotionEvent)Activityöğenizin, pencereye gönderilmeden önce tüm dokunma etkinliklerini yakalamasına olanak tanır.: Bu,ViewGroup.onInterceptTouchEvent(MotionEvent)ViewGroupöğesinin, etkinlikler alt görünümlere gönderilirken izlemesine olanak tanır.- Dokunma etkinlikleriniViewParent.requestDisallowInterceptTouchEvent(boolean)ile engellememesi gerektiğini belirtmek için bunu üst görünümde çağırın.onInterceptTouchEvent(MotionEvent)
Dokunma modu
Kullanıcı, yön tuşları veya trackball ile kullanıcı arayüzünde gezinirken, kullanıcının girişi kabul edecek öğeleri görebilmesi için işlem yapılabilir öğelere (ör. düğmeler) odaklanılması gerekir. Ancak cihazda dokunma özelliği varsa ve kullanıcı arayüzüne dokunarak etkileşimde bulunmaya başlarsa öğeleri vurgulamak veya belirli bir Görünüm'e odaklanmak artık gerekli değildir. Bu nedenle, "dokunma modu" adlı bir etkileşim modu vardır.
Dokunmatik özellikli bir cihazda, kullanıcı ekrana dokunduğunda cihaz dokunma moduna girer. Bu noktadan itibaren yalnızca isFocusableInTouchMode() doğru olan görünümler (ör. metin düzenleme widget'ları) odaklanılabilir.
Düğmeler gibi dokunulabilir diğer görünümler, dokunulduğunda odaklanmaz. Bunlar, yalnızca basıldığında tıklama dinleyicilerini tetikler.
Kullanıcı bir yön tuşuna her bastığında veya trackball ile her 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şime devam edebilir.
Dokunma modu durumu, tüm sistem boyunca (tüm pencereler ve etkinlikler) korunur.
Mevcut durumu sorgulamak için isInTouchMode() numaralı telefonu arayarak cihazın şu anda dokunma modunda olup olmadığını öğrenebilirsiniz.
Odaklanmayı yönetme
Çerçeve, kullanıcı girişine yanıt olarak rutin odak hareketini yönetir.
Bu kapsamda, Görünümler kaldırıldığında veya gizlendiğinde ya da yeni Görünümler kullanıma sunulduğunda odağın değiştirilmesi yer alır. Görünümler, odaklanma isteğini yöntemiyle gösterir. Bir görünümün odaklanıp odaklanamayacağını değiştirmek için isFocusable() işlevini çağırın. Dokunma modundayken, setFocusable() ile bir Görünüm'ün odaklanmaya izin verip vermediğini sorgulayabilirsiniz.
Bu ayarı isFocusableInTouchMode() ile değiştirebilirsiniz.
setFocusableInTouchMode()
Android 9 (API düzeyi 28) veya sonraki sürümleri çalıştıran cihazlarda etkinlikler başlangıç odağı atamaz. Bunun yerine, istenirse ilk odaklanmayı açıkça istemeniz gerekir.
Odak hareketi, belirli bir yönde en yakın komşuyu bulan bir algoritmaya dayanır. Nadiren de olsa varsayılan algoritma, geliştiricinin amaçladığı davranışla eşleşmeyebilir. Bu gibi durumlarda, düzen dosyasındaki aşağıdaki XML özellikleriyle açık geçersiz kılmalar sağlayabilirsiniz: nextFocusDown, nextFocusLeft, nextFocusRight ve nextFocusUp. Odaklanmanın ayrıldığı kaynak görünümüne bu özelliklerden birini ekleyin. Odaklanılacak görünümün kimliği olacak şekilde özelliğin değerini tanımlayın. Örneğin:
<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ıya veya ikinci düğmeden aşağıya gitmek mümkün olmaz. Üstteki düğme alttakini nextFocusUp olarak tanımladığına göre (veya tam tersi), gezinme odağı yukarıdan aşağıya ve aşağıdan yukarıya doğru dönecektir.
Görünümü kullanıcı arayüzünüzde odaklanılabilir olarak tanımlamak istiyorsanız (geleneksel olarak odaklanılabilir olmasa bile) düzen bildiriminize Görünüm için android:focusable XML özelliğini ekleyin.
Değeri true olarak ayarlayın. android:focusableInTouchMode ile dokunma modundayken bir View'ı odaklanılabilir olarak da bildirebilirsiniz.
Belirli bir görünümün odaklanmasını istemek için işlevini çağırın.requestFocus()
Odaklanma etkinliklerini dinlemek (bir Görünüm odaklandığında veya odağı kaybettiğinde bildirim almak) için Etkinlik dinleyicileri bölümünde açıklandığı gibi
kullanın.onFocusChange()