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, olayların gerçek zamanlı olarak kullanıcının etkileşimde bulunduğu Görünüm nesnesi. 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ı içinde, birden fazla genel geri çağırma dikkatinizi
yöntemlerinden birini devreye sokmaktır. Bu yöntemler,
ilgili işlem bu nesnede gerçekleşir. Örneğin, bir Görünüme (Düğme gibi) dokunulduğunda,
bu nesnede onTouchEvent()
yöntemi çağrılır. Ancak buna müdahale etmek için
yöntemi geçersiz kılar. Ancak her View nesnesini genişletmek
bu tür bir olayın düzenlenmesi pek olası değildir. View sınıfının bu nedenle
daha kolay tanımlayabileceğiniz geri çağırma işlevlerine sahip iç içe yerleştirilmiş arayüz koleksiyonu. Bu arayüzler,
etkinlik işleyiciler gibi özellikler, kullanıcı arayüzünüzle kullanıcı etkileşimini yakalamak için kullanabileceğiniz bir araçtır.
Kullanıcı etkileşimini dinlemek için etkinlik işleyicileri yaygın olarak kullanacaksınız ancak
bir görünüm sınıfını özel bileşen oluşturmak üzere genişletmek isteyebilirsiniz.
Button
süresini uzatmak istiyor olabilirsiniz
bir şeyler yazacağım. Bu durumda, etkinlik verileriniz için varsayılan etkinlik davranışlarını tanımlayabilir ve
sınıf etkinlik işleyicilerini kullanarak oluşturun.
Etkinlik işleyiciler
Etkinlik işleyici, View
sınıfında bulunan ve tek bir etkinlik
geri çağırma yöntemini kullanın. Bu yöntemler, dinleyicinin sahip olduğu Görünüm'de Android çerçevesi
kaydedildiğini, kullanıcı arayüzündeki öğeyle etkileşimi tarafından tetiklenir.
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 çağrılır (dokunma modundayken) veya gezinme tuşları ya da iztopu ve uygun "Enter" tuşuna basar. tuşuna basar veya iztopuna basar.onLongClick()
View.OnLongClickListener
tarafından. Bu, kullanıcı öğeye dokunup basılı tuttuğunda (dokunma modunda) veya öğeye dokunduğunda çağrılır veya iztopu içeren öğeye odaklanır ve uygun "Enter" tuşuna basmak ve basılı tutmak için tuşuna basın veya iztopunu basılı tutun (bir saniye süreyle).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 uzaklaştığı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ı dokunma etkinliği olarak nitelenen bir işlem gerçekleştirdiğinde çağrılır. ekrandaki herhangi bir hareket hareketini (öğenin sınırları içinde) tıklayın.onCreateContextMenu()
View.OnCreateContextMenuListener
tarafından. Bu, bir İçerik Menüsü oluşturulurken (sürekli "uzun tıklama" sonucunda) çağrılır. Tartışmayı görüntüle Menüler'deki içerik menülerinde geliştirici kılavuzuna.
Bu yöntemler, ilgili arayüzleri yalnızca bu yöntemlerde kullanabilir. Bu yöntemlerden birini
ve etkinliklerinizi işlemesine, iç içe yerleştirilmiş arayüzü Etkinliğinize uygulayabilir veya anonim bir sınıf olarak tanımlayabilirsiniz.
Ardından uygulamanızın bir örneğini iletin
ilgili View.set...Listener()
yöntemine. (ör.
.
ve setOnClickListener()
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 onClick()
geri çağırmasının
döndürme değeri yok ancak diğer bazı etkinlik işleyici yöntemlerinin boole döndürmesi gerekir. Neden
olaya göre değişir. Bunu başaran birkaç sorunun nedeni şu şekildedir:
- 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 etkinliğin burada durması gerektiğini belirtmek için true değerini döndürün; etkinliği işlemediyseniz false döndürür ve/veya etkinliğin başka bir tıklama işleyicileridir.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 etkinliğin burada durması gerektiğini belirtmek için true değerini döndürün; etkinliği işlemediyseniz false döndürür ve/veya etkinliğin başka bir doğrudan dinleyicilere ulaşabilirsiniz.onKey()
- 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şlem olabilir. Bu nedenle, etkinliği almadığınızı, etkinliği henüz tamamlamadığınızı ve etkinliğin bu etkinlikten sonra yapılacak işlemlerle ilgilenmiyorum. Bu nedenle, başka bir işlem için çağrılmaz (ör. parmak hareketi veya nihai yukarı işlem etkinliği)onTouch()
Donanım önemli etkinliklerinin her zaman o anda odakta olan görünüme dağıtıldığını unutmayın. Bunlar en üstten başlayarak dağıtılır
önce görünüm hiyerarşisini, ardından uygun hedefe ulaşıncaya kadar aşağıya iner. Görünümünüz (veya Görünümünüzün bir alt öğesi)
varsa, etkinliğin
yöntemiyle seyahat ettiğini görebilirsiniz. Önemli etkinlikleri Görünümünüzden kaydetmeye alternatif olarak
dispatchKeyEvent()
ile Etkinliğinizdeki tüm etkinlikler
ve onKeyDown()
.onKeyUp()
Ayrıca, uygulamanız için metin girişi düşünürken birçok cihazda yalnızca yazılım girişi olduğunu unutmayın.
yöntemlerine göz atın. Bu tür yöntemlerin anahtar tabanlı olması gerekmez; bazıları ses girişi, el yazısı vb. kullanabilir. Hatta
giriş yöntemi klavye benzeri bir arayüz sunduğunda, genelde
etkinlik ailesi. Hiçbir zaman
Uygulamanızı cihazlarla sınırlamak istemiyorsanız belirli tuşlara basmanın kontrol edilmesini gerektiren bir kullanıcı arayüzü derler
donanım klavyesi kullanarak. Özellikle, kullanıcı şuraya bastığında girişi doğrulamak için bu yöntemlere güvenmeyin:
dönüş anahtarı; Bunun yerine, onKeyDown()
IME_ACTION_DONE
gibi işlemleri kullanarak
giriş yöntemini kullanarak, uygulamanızın nasıl tepki vermeyi beklediğini belirler. Bu nedenle, kullanıcı arayüzünü anlamlı bir şekilde değiştirebilir. Varsayımlardan kaçının
daha önce biçimlendirilmiş metinlerin uygulamanıza sağlanması konusunda bu yönteme güvenin.
Not: Android önce etkinlik işleyicileri, daha sonra uygun varsayılanı arar işleyicilerini ekleyin. Dolayısıyla, bu etkinlik işleyicilerden true değeri döndürülmesi durdurulur etkinliğin diğer etkinlik işleyicilere yayılmasını sağlar ve ayrıca etkinlik işleyiciyi etkinleştiriyorum. 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 bir bileşen oluşturuyorsanız çeşitli geri çağırma yöntemleri tanımlayabilirsiniz. varsayılan etkinlik işleyici olarak kullanılır. Özel Bileşenleri Görüntüle'ye göz atarak olay işleme için kullanılan bazı yaygın geri çağırma işlevlerinden şunları içerir:
- Yeni bir önemli etkinlik gerçekleştiğinde çağrılır.onKeyDown(int, KeyEvent)
- Bir önemli etkinlik gerçekleştiğinde çağrılır.onKeyUp(int, KeyEvent)
- Bir iztopu hareket etkinliği gerçekleştiğinde çağrılır.onTrackballEvent(MotionEvent)
- Dokunmatik ekran hareketi etkinliği gerçekleştiğinde çağrılır.onTouchEvent(MotionEvent)
- Görüntünün odağı kaybolduğunda veya kaybolduğunda çağrılır.onFocusChanged(boolean, int, Rect)
Görünüm sınıfının parçası olmayan, bilmeniz gereken başka yöntemler de mevcuttur. ancak etkinlikleri yönetme şeklinizi de doğrudan etkileyebilir. Daha karmaşık etkinlikleri yönetirken kullanıyorsanız şu diğer yöntemleri göz önünde bulundurun:
- Bu,Activity.dispatchTouchEvent(MotionEvent)
Activity
cihazınızın tüm dokunma etkinliklerine, pencereye gönderilmeden önce müdahale etmesine olanak tanır.
: Bu,ViewGroup.onInterceptTouchEvent(MotionEvent)
ViewGroup
adlı kullanıcının, alt Görünümler'e gönderilen etkinlikleri izleyebilmesini sağlar.
- Bunu ara öğesini,ViewParent.requestDisallowInterceptTouchEvent(boolean)
ile dokunma etkinliklerine müdahale etmemesi gerektiğini belirtmek için kullanın.onInterceptTouchEvent(MotionEvent)
Dokunma modu
Bir kullanıcı, yön tuşları veya iztopu ile kullanıcı arayüzünde gezindiğinde kullanıcıların görebileceği şekilde işlem yapmak için gerekli öğelere (düğmeler gibi) giriş kabul eder. Bununla birlikte, cihazın dokunma özellikleri varsa ve kullanıcı kullanıcı arayüzüne dokunarak arayüzle etkileşime girmeye başladığında, öğeleri vurgulayın veya belirli bir Görünüme odaklanın. Dolayısıyla, "dokunma modu" adlı etkileşim için.
Dokunma özellikli cihazlarda, kullanıcı ekrana dokunduğunda cihaz
dokunma moduna girer. Bundan sonra yalnızca hangi görüntülemeler için
isFocusableInTouchMode()
doğru değerine ayarlandığında metin düzenleme widget'ları gibi öğelere odaklanılabilir.
Düğmeler gibi dokunulabilir olan diğer Görünümler dokunulduğunda odaklanmaz; onlar
tıklama işleyicilerini tetiklemeleri yeterlidir.
Bir kullanıcı yön tuşuna bastığında veya iztopuyla kaydırdığında cihaz dokunma modundan çıkın ve odaklanmak için bir görünüm bulun. Artık kullanıcı etkileşimde bulunmaya devam edebilir kullanıcı arayüzüyle uyumlu olduğunu unutmayın.
Dokunma modu durumu, tüm sistemde (tüm pencereler ve etkinlikler) korunur.
Mevcut durumu sorgulamak için şunu çağırabilirsiniz:
Cihazın şu anda dokunma modunda olup olmadığını görmek için isInTouchMode()
tuşlarına basın.
Odaklanma
Çerçeve, kullanıcı girişine yanıt olarak rutin odak hareketlerini yönetir.
Buna, Görünümler kaldırılırken veya gizlenirken odağın değiştirilmesi de dahildir.
Görüntülemeler kullanılabilir hale gelir. Görüntülemeler, odaklanma konusunda istekli olduklarını gösterir
yöntemiyle işlem yapabilirsiniz. Bir Görünümün şu anda izin verilen
odaklan, isFocusable()
numaralı telefonu ara. Dokunma modundayken
bir Görünümün setFocusable()
ile odaklanmaya izin verip vermediğini sorgulayabilirsiniz.
isFocusableInTouchMode()
ile bu ayarı değiştirebilirsiniz.
setFocusableInTouchMode()
Android 9 (API düzeyi 28) veya sonraki sürümleri çalıştıran cihazlarda etkinliklere odaklanmanız gerekir. Bunun yerine, isterseniz açıkça ilk odaklama isteğinde bulunmanız gerekir.
Odaklanma hareketi, her bir konumdaki en yakın komşuyu bulan bir algoritmaya yardımcı olur. Nadir durumlarda, varsayılan algoritma Geliştiricinin hedeflenen davranışı. Bu tür durumlarda düzen dosyasında aşağıdaki XML özelliklerine sahip açık geçersiz kılma işlemleri: nextFocusDown, nextFocusLeft, nextFocusRight ve nextFocusUp. Bu özelliklerden birini aşağıdaki Görünüm'e ekleyin: ayrıldığını gösterir. Özelliğin değerini View'ın kimliği olacak şekilde tanımlayın belirlemeniz gerekir. Ö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ıya doğru gitmek veya ikinci Düğmeden aşağı doğru gidilmez. Artık üst Düğme için en alttaki nextFocusUp olarak tanımlanırsa (bunun tersi de geçerlidir) gezinme odağı yukarıdan aşağıya ve aşağıdan yukarıya doğru inceleyebilirsiniz.
Bir Görünümü kullanıcı arayüzünüzde odaklanılabilir olarak tanımlamak istiyorsanız (geleneksel olarak olmadığında),
android:focusable
XML özelliğini, düzen bildiriminizde Görünüme ekleyin.
true değerini ayarlayın. Ayrıca bir Görünüm de bildirebilirsiniz
android:focusableInTouchMode
ile Dokunma Modu'ndayken odaklanılabilir.
Belirli bir görünümün odaklanmasını istemek için
numaralı telefonu arayın.requestFocus()
Odaklanılan etkinlikleri dinlemek (bir Görünüm odağa alındığında veya odağı kaybettiğinde bildirim almak için)
,
(Etkinlik işleyiciler bölümünde açıklandığı gibi).onFocusChange()