Giriş odağı, düzenlenebilir bir metin alanının içine veya dışına taşındığında, Android girişi (ekran klavyesi gibi) uygun olmalıdır. Sistem ayrıca, kullanıcı arayüzünüzün ve metin alanının yukarıda nasıl görüneceğine de karar verir giriş yöntemini seçin. Örneğin, ekrandaki dikey alan metin alanı, giriş yönteminin üzerindeki tüm alanı doldurabilir.
Çoğu uygulama için gereken tek şey bu varsayılan davranışlardır. Bazı durumlarda, yine de giriş yönteminin görünürlüğü üzerinde daha fazla kontrol sahibi olmak düzeni nasıl etkilediğine bakalım. Bu derste, iş görüşmelerinde giriş yönteminin görünürlüğü.
Etkinlik başladığında klavyeyi göster
Android, etkinlik başladığında sanal klavye gösterilmez. Bu davranış uygun çünkü metin girmek etkinlikteki birincil görev olmayabilir. Ancak, birincil görev olduğunu düşünüyorsanız (örneğin, giriş ekranında metin girerek) büyük olasılıkla ekran klavyesinin varsayılan olarak görünmesini istersiniz.
Etkinliğiniz başladığında giriş yöntemini göstermek için
android:windowSoftInputMode
özelliğini
"stateVisible"
değerine sahip <activity>
öğesi. Örnek:
<application ... >
<activity
android:windowSoftInputMode="stateVisible" ... >
...
</activity>
...
</application>
Kullanıcı arayüzünüzün nasıl yanıt vermesi gerektiğini belirtin
Yumuşak klavye ekranda göründüğünde alan miktarını azaltır için kullanılabilir. Sistem, gösterilen reklamların nasıl ayarlanacağına bir kısmı oluşturur, ama doğru şekilde çalışmayabilir. En iyi davranışın sağlanması için kullanıyorsanız, sistemin kalan alan.
Bir etkinlikte tercih ettiğiniz tedaviyi beyan etmek için
Manifest'inizin <activity>
öğesinde android:windowSoftInputMode
özelliği
“düzenle” etiketinden biriyle değerler.
Örneğin, sistemin düzeninizi mevcut ekran düzenine
alan sağlar. Bu şekilde, düzensiz olsa bile
tüm düzen içeriğinizi erişilebilir durumda
sayfa kaydırma işlemi gerektirir — "adjustResize"
kullanın:
<application ... >
<activity
android:windowSoftInputMode="adjustResize" ... >
...
</activity>
...
</application>
Ayarlama spesifikasyonunu başlangıçtaki sanal klavyeyle birleştirebilirsiniz görünürlük spesifikasyonunu lütfen unutmayın:
<activity
android:windowSoftInputMode="stateVisible|adjustResize" ... >
...
</activity>
Kullanıcı arayüzünüz"adjustResize"
kullanıcının metin girişinden hemen sonra veya bu işlem sırasında erişmesi gerekebilir. Örneğin,
Örneğin, düğmenin alt kısmına bir düğme çubuğu
yerleştirmek için göreli bir düzen
ekranda, "adjustResize"
kullanılması düzenin yeniden boyutlandırılmasını ve düğme çubuğunun görünmesini sağlar.
üzerine gelin.
İsteğe bağlı olarak sanal klavyeyi göster
Etkinliğinizin yaşam döngüsünde şunu yapmak istediğiniz bir yöntem varsa:
giriş yöntemi görünür olduğunda,
InputMethodManager
bir şablondur.
Örneğin, aşağıdaki yöntem
Kullanıcının yapması beklenen View
bir şeyler yazın, arar
İzin vermek için requestFocus()
odaklanıp ardından giriş yöntemini açmak için showSoftInput()
komutunu çağırır:
Kotlin
fun showSoftKeyboard(view: View) { if (view.requestFocus()) { val imm = getSystemService(InputMethodManager::class.java) imm.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT) } }
Java
public void showSoftKeyboard(View view) { if (view.requestFocus()) { InputMethodManager imm = getSystemService(InputMethodManager.class); imm.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT); } }
Yumuşak klavyeyi güvenilir şekilde gösterin
Bir etkinliğin başlaması gibi, zaman içinde gelişen
Yumuşak klavyeyi görüntülemek için InputMethodManager.showSoftInput()
kullanılıyor
yazılım klavyesinin kullanıcı tarafından görülmemesine neden olabilir.
showSoftInput()
kullanılırken yazılım klavyesinin görünürlüğü güvenilir
şu koşullarda:
Görünüm, yazılım klavyesine bağlı olmalıdır. (Bu da sonuçta pencerenin odaklanması gerekir. görünüm odağını isteyebilirsiniz.
View.requestFocus()
) seçin.Görünürlük
android:windowSoftInputMode
nedeniyle de etkilenebilirshowSoftInput()
tarafından kullanılan özellik ve işaretler.
Bir etkinliğin başlaması gibi belirli kullanım alanlarında,
istenen koşullar karşılanmadığında Sistem, bu görüntülemeyi
yazılım klavyesine bağlandığında showSoftInput()
çağrısını yoksayar,
ve ekran klavyesi kullanıcı tarafından görülemez.
Yazılım klavyesinin güvenilir şekilde görüntülendiğinden emin olmak için aşağıdakini kullanabilirsiniz: alternatifler:
- (Önerilen)
WindowInsetsControllerCompat
kullanın. Bu nesne şurada gösterildiği gibiActivity.onCreate()
sırasında sanal klavyeyi görüntüler: kod snippet'ini eklemeniz gerekir. Aramanın bu süreden sonra planlanacağı garanti edilir emin olmaktır.
Kotlin
editText.requestFocus() WindowCompat.getInsetsController(window, editText)!!.show(WindowInsetsCompat.Type.ime())
Java
editText.requestFocus(); WindowCompat.getInsetsController(getWindow(), editText).show(WindowInsetsCompat.Type.ime());
- Çalıştırılabilir bir reklam yayınlayın. Bu, uygulamanızın şu bilgileri alana kadar beklemesini sağlar:
aramadan önce
View.onWindowFocusChanged()
adlı kişiden pencere odaklama etkinliğishowSoftInput()
.
Kotlin
class MyEditText : EditText() { ... override fun onWindowFocusChanged(hasWindowFocus: Boolean) { if (hasWindowFocus) { requestFocus() post { val imm: InputMethodManager = getSystemService(InputMethodManager::class.java) imm.showSoftInput(this, 0) } } } }
Java
public class MyEditText extends EditText { ... @Override public void onWindowFocusChanged(boolean hasWindowFocus) { if (hasWindowFocus) { requestFocus(); post(() -> { InputMethodManager imm = getSystemService(InputMethodManager.class); imm.showSoftInput(this, 0); }); } } }
Çalışma zamanı görünürlük işaretlerini dikkatli bir şekilde ele alın
Çalışma zamanında sanal klavye görünürlüğünü açıp kapatırken bazı
değerleri işaretleyin. Örneğin, uygulama
arama sırasında sanal klavye gösteriliyor
View.getWindowInsetsController().show(ime())
tarihinde Activity.onCreate()
ayında
başlarsa, uygulama geliştiricilerinin bunu yaparken
SOFT_INPUT_STATE_HIDDEN
veya SOFT_INPUT_STATE_ALWAYS_HIDDEN
flag'leri
ilk başlatma sırasında, yazılımın klavyenin beklenmedik bir şekilde gizlenmesine karşı korumayı etkinleştirmeniz gerekir.
Sistem genellikle ekran klavyesini otomatik olarak gizler
Çoğu durumda sistem, ekran klavyesini gizlemeyi başarır. Bu aşağıdaki durumlardan herhangi biri olabilir:
- Kullanıcı, metin alanındaki görevi tamamlar.
- Kullanıcı geri tuşuna basar veya geri gezinme ile hareketleri kaydırır.
- Kullanıcı başka bir uygulamaya gider ve bu uygulama,
SOFT_INPUT_STATE_HIDDEN
veyaSOFT_INPUT_STATE_ALWAYS_HIDDEN
flag'leri odaklandığımızdan emin olun.
Önceki sistem davranışına göre ekran klavyesini manuel olarak gizleyin
Uygulamanızın bazı durumlarda sanal klavyeyi manuel olarak gizlemesi
metin alanının odağı kaybolduğunda
View.OnFocusChangeListener.onFocusChange
. Bu tekniği akıllıca kullanın
; sanal klavyenin kapatılması kullanıcı deneyimini beklenmedik şekilde bozuyor.
Uygulamanız dokunmatik klavyeyi manuel olarak gizlerse sanal klavye açıkça veya dolaylı olarak gösterildi:
Yazılım klavyesinin, sonrasında açıkça gösterildiği kabul edilir
showSoftInput()
çağrısı.Öte yandan, yazılım klavyesinin bu programda dolaylı olarak aşağıdaki koşullardan herhangi biri:
- Sistem, uygulanırken yazılım klavyesini gösterdi.
android:windowSoftInputMode
- Uygulamanız
SHOW_IMPLICIT
sürümünü geçtishowSoftInput()
.
- Sistem, uygulanırken yazılım klavyesini gösterdi.
Normalde hideSoftInputFromWindow()
,
nasıl istendi, ancak HIDE_IMPLICIT_ONLY
ile
yalnızca dolaylı olarak istenen yazılım klavyesinin kapatılmasıyla sınırlı olabilir.
Yazılım klavyesinin üstünde iletişim kutusu veya yer paylaşımlı görünüm göster
Bazı durumlarda, düzenleyici etkinliğinin düzenlenebilir olmayan bir iletişim kutusu veya yer paylaşımlı pencere açın.
Uygulamanızda, aşağıdaki bölümlerde açıklanan birkaç seçenek vardır.
Özet olarak, ekran klavyesinin pencere işaretlerini doğru bir şekilde kullandığınızdan emin olun aralığı aşağıdaki beklentileri karşılayacak şekilde hedefleyerek dikey (z katmanı) sıralamayla ilgili:
- İşaret yok (normal büyük/küçük harf): Yazılım klavye katmanının arkasındadır ve metin alabilir.
FLAG_NOT_FOCUSABLE
: Yumuşak klavye katmanının üstündedir, ancak metni alamaz.FLAG_ALT_FOCUSABLE_IM
: Yumuşak klavye katmanının üstünde, odaklanılabilir, ancak klavyeyi kullanın. Ayrıca altındaki tüm görünümlerin klavyeyi kullanın. Bu, metin içermeyen bir uygulama iletişim kutusu gösterilmesi açısından yararlıdır klavye katmanının üzerine yerleştirin.FLAG_NOT_FOCUSABLE
veFLAG_ALT_FOCUSABLE_IM
: Yumuşak klavye katmanının arkasındadır, ancak metin alınamaz.FLAG_NOT_FOCUSABLE
veFLAG_NOT_TOUCH_MODAL
: Yumuşak klavyenin üzerindedir ve dokunma etkinliklerinin "geçmesine" izin verir pencereyi klavyeye basmanız yeterlidir.
İletişim kutusu oluştur
FLAG_ALT_FOCUSABLE_IM
'ı kullanma
iletişim kutusunu ekran klavyesinin üzerinde tutmak ve
klavyenin odaklanmasını önleyin:
Kotlin
val content = TextView(this) content.text = "Non-editable dialog on top of soft keyboard" content.gravity = Gravity.CENTER val builder = AlertDialog.Builder(this) .setTitle("Soft keyboard layering demo") .setView(content) mDialog = builder.create() mDialog!!.window!! .addFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM) mDialog!!.show()
Java
TextView content = new TextView(this); content.setText("Non-editable dialog on top of soft keyboard"); content.setGravity(Gravity.CENTER); final AlertDialog.Builder builder = new AlertDialog.Builder(this) .setTitle("Soft keyboard layering demo") .setView(content); mDialog = builder.create(); mDialog.getWindow().addFlags(FLAG_ALT_FOCUSABLE_IM); mDialog.show();
Yer paylaşımı görünümü oluşturma
TYPE_APPLICATION_OVERLAY
belirten bir yer paylaşımı görünümü oluşturun
pencere türü ve FLAG_ALT_FOCUSABLE_IM
klavye tarafından hedeflenen işlem
Kotlin
val params = WindowManager.LayoutParams( width, /* Overlay window width */ height, /* Overlay window height */ WindowManager.LayoutParams.TYPE_APPLICATION, /* Overlay window type */ WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM /* No need to allow for text input on top of the soft keyboard */ or WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, /* Allow touch event send to soft keyboard behind the overlay */ PixelFormat.TRANSLUCENT ) params.title = "Overlay window" mOverlayView!!.layoutParams = params windowManager.addView(mOverlayView, params)
Java
WindowManager.LayoutParams params = new WindowManager.LayoutParams( width, /* Overlay window width */ height, /* Overlay window height */ TYPE_APPLICATION, /* Overlay window type */ FLAG_ALT_FOCUSABLE_IM /* No need to allow for text input on top of the soft keyboard */ | FLAG_NOT_TOUCH_MODAL, /* Allow touch event send to soft keyboard behind the overlay */ PixelFormat.TRANSLUCENT); params.setTitle("Overlay window"); mOverlayView.setLayoutParams(params); getWindowManager().addView(mOverlayView, params);
Yazılım klavyesinin altında iletişim kutusu veya görünüm göster
Uygulamanızın, şu özellikleri kullanın:
- Bir düzenleyici etkinliği tarafından istenen yazılım klavyesinin altında görünür Böylece metin girişinden etkilenmez.
- Yazılım klavyesinin ek boyutundaki değişikliklerin farkında kalır. iletişim kutusunun veya pencerenin düzenini ayarlayın.
Bu durumda, uygulamanızın birkaç seçeneği vardır. Aşağıdaki bölümler bu seçenekleri açıklayın.
İletişim kutusu oluştur
Hem FLAG_NOT_FOCUSABLE
hem de
pencere işareti ve FLAG_ALT_FOCUSABLE_IM
pencere bayrağı:
Kotlin
val content = TextView(this) content.text = "Non-editable dialog behind soft keyboard" content.gravity = Gravity.CENTER val builder = AlertDialog.Builder(this) .setTitle("Soft keyboard layering demo") .setView(content) mDialog = builder.create() mDialog!!.window!! .addFlags(FLAG_NOT_FOCUSABLE or FLAG_ALT_FOCUSABLE_IM) mDialog!!.show()
Java
TextView content = new TextView(this); content.setText("Non-editable dialog behind soft keyboard"); content.setGravity(Gravity.CENTER); final AlertDialog.Builder builder = new AlertDialog.Builder(this) .setTitle("Soft keyboard layering demo") .setView(content); mDialog = builder.create(); mDialog.getWindow() .addFlags(FLAG_NOT_FOCUSABLE | FLAG_ALT_FOCUSABLE_IM); mDialog.show();
Yer paylaşımı görünümü oluşturma
Hem FLAG_NOT_FOCUSABLE
hem de konumu ayarlayarak yer paylaşımlı bir görünüm oluşturun
pencere işareti ve FLAG_ALT_FOCUSABLE_IM
pencere bayrağı:
Kotlin
val params = WindowManager.LayoutParams( width, /* Overlay window width */ height, /* Overlay window height */ WindowManager.LayoutParams.TYPE_APPLICATION, /* Overlay window type */ WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM, PixelFormat.TRANSLUCENT ) params.title = "Overlay window" mOverlayView!!.layoutParams = params windowManager.addView(mOverlayView, params)
Java
WindowManager.LayoutParams params = new WindowManager.LayoutParams( width, /* Overlay window width */ height, /* Overlay window height */ TYPE_APPLICATION, /* Overlay window type */ FLAG_NOT_FOCUSABLE | FLAG_ALT_FOCUSABLE_IM, PixelFormat.TRANSLUCENT); params.setTitle("Overlay window"); mOverlayView.setLayoutParams(params); getWindowManager().addView(mOverlayView, params);