Giriş yöntemi görünürlüğünü işleme

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 etkilenebilir showSoftInput() 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 gibi Activity.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ği showSoftInput().

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 veya SOFT_INPUT_STATE_ALWAYS_HIDDEN flag'leri odaklandığımızdan emin olun.
ziyaret edin.

Ö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çti showSoftInput().

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 ve FLAG_ALT_FOCUSABLE_IM : Yumuşak klavye katmanının arkasındadır, ancak metin alınamaz.
  • FLAG_NOT_FOCUSABLE ve FLAG_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);