입력 방법의 공개 상태 처리

입력 포커스가 수정 가능한 텍스트 필드 안팎으로 이동하면 Android는 는 터치 키보드와 같은 입력을 숨깁니다. 있습니다. UI와 텍스트 필드가 위에 표시되는 방식도 시스템에서 결정합니다. 입력 방법에 따라 달라집니다. 예를 들어 화면의 세로 공간이 제한된 경우 텍스트 필드가 입력 방법 위의 모든 공간을 채울 수 있습니다.

대부분의 앱에 이러한 기본 동작만 있으면 됩니다. 어떤 경우에는 하지만 입력 방법의 공개 상태를 더 세부적으로 제어하고 싶을 수도 있습니다. 레이아웃에 미치는 영향 이 강의에서는 볼 수 있습니다

활동이 시작될 때 소프트 키보드 표시

비록 입력 값이 렌더링될 때 Android는 소프트 키보드가 표시되지 않습니다. 이 동작은 텍스트 입력이 활동에서 주요 작업이 아닐 수 있기 때문입니다. 그러나 텍스트 입력이 실제로 기본 작업인 경우(예: 로그인 화면에서) 소프트 키보드를 기본적으로 표시하고자 할 것입니다.

활동이 시작될 때 입력 방법을 표시하려면 android:windowSoftInputMode 속성을 "stateVisible" 값이 있는 <activity> 요소. 예를 들면 다음과 같습니다.

<application ... >
    <activity
        android:windowSoftInputMode="stateVisible" ... >
        ...
    </activity>
   ...
</application>

UI 응답 방식 지정

소프트 키보드가 화면에 나타나면 공간이 줄어듭니다. 사용할 수 있습니다. 시스템은 화면에 보이는 제대로 작동하지 않을 수 있습니다. 최상의 동작이 UI를 표시하려면 시스템에서 UI를 표시할 방식을 여유 공간이 확보됩니다.

활동에서 선호하는 취급 방식을 선언하려면 매니페스트의 <activity> 요소에 있는 android:windowSoftInputMode 속성 "조정" 중 하나와 함께 값으로 사용됩니다.

예를 들어 시스템에서 레이아웃의 크기를 사용 가능한 같은 공간에 배치되어 있더라도 모든 레이아웃 콘텐츠에 액세스할 수 스크롤이 필요합니다. "adjustResize" 사용:

<application ... >
   <activity
       android:windowSoftInputMode="adjustResize" ... >
       ...
   </activity>
   ...
</application>

조정 사양을 초기 소프트 키보드와 결합할 수 있습니다. 공개 상태 사양을 참조하세요.

<activity
    android:windowSoftInputMode="stateVisible|adjustResize" ... >
    ...
</activity>

UI에 포함된 컨트롤의 경우 "adjustResize"를 지정하는 것이 중요합니다. 사용자는 텍스트를 입력한 직후나 입력 중에 액세스해야 할 수 있습니다. 대상 예를 들어 상대적 레이아웃을 사용하여 화면: "adjustResize"를 사용하여 레이아웃 크기를 조절하여 버튼 모음이 표시되도록 합니다. 을 누릅니다.

요청 시 소프트 키보드 표시

액티비티의 수명 주기에서 입력 방법이 보이면 InputMethodManager 드림 표시합니다.

예를 들어, 다음 메서드는 View에서 사용자가 해야 하는 작업 무언가를 입력, 전화 보내기: requestFocus() 포커스를 받은 다음 showSoftInput()를 호출하여 입력 방법을 엽니다.

Kotlin

fun showSoftKeyboard(view: View) {
   if (view.requestFocus()) {
       val imm = getSystemService(InputMethodManager::class.java)
       imm.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT)
   }
}

자바

public void showSoftKeyboard(View view) {
   if (view.requestFocus()) {
       InputMethodManager imm = getSystemService(InputMethodManager.class);
       imm.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT);
   }
}

소프트 키보드를 안정적으로 표시

활동이 시작되는 등 특정 상황에서 InputMethodManager.showSoftInput()를 사용하여 소프트 키보드 표시 소프트웨어 키보드가 사용자에게 표시되지 않을 수 있습니다.

showSoftInput() 사용 시 소프트 키보드의 공개 상태가 유지되어야 합니다. 다음 조건에서:

  • 뷰가 소프트웨어 키보드에 이미 연결되어 있어야 합니다. 이는 결과적으로 창에 포커스를 지정하고 편집기가 필요함 뷰 포커스를 요청하는 뷰 View.requestFocus())을 클릭합니다.

  • 공개 상태는 android:windowSoftInputMode의 영향을 받을 수도 있습니다. showSoftInput()에서 사용하는 속성 및 플래그입니다.

활동이 시작될 때와 같은 특정 사용 사례에서 필수 조건이 충족되지 않은 경우 시스템은 뷰를 소프트웨어 키보드에 연결된 경우 showSoftInput() 호출을 무시함 소프트 키보드가 사용자에게 표시되지 않습니다.

소프트웨어 키보드가 안정적으로 표시되도록 하려면 다음을 사용하세요. 대안:

  • (권장) WindowInsetsControllerCompat을 사용합니다. 이 객체 는 다음과 같이 Activity.onCreate() 중에 소프트 키보드를 표시합니다. 다음 코드 스니펫을 사용하세요. 통화는 해당 기간 이후에 예약됩니다. 초점을 맞추고 있습니다.

Kotlin

editText.requestFocus()
WindowCompat.getInsetsController(window, editText)!!.show(WindowInsetsCompat.Type.ime())

자바

editText.requestFocus();
WindowCompat.getInsetsController(getWindow(), editText).show(WindowInsetsCompat.Type.ime());

Kotlin

class MyEditText : EditText() {
  ...
  override fun onWindowFocusChanged(hasWindowFocus: Boolean) {
    if (hasWindowFocus) {
      requestFocus()
      post {
        val imm: InputMethodManager = getSystemService(InputMethodManager::class.java)
        imm.showSoftInput(this, 0)
      }
    }
  }
}

자바

public class MyEditText extends EditText {
  ...
  @Override
  public void onWindowFocusChanged(boolean hasWindowFocus) {
    if (hasWindowFocus) {
      requestFocus();
      post(() -> {
        InputMethodManager imm = getSystemService(InputMethodManager.class);
        imm.showSoftInput(this, 0);
      });
    }
  }
}

런타임 공개 상태 플래그를 신중하게 처리

런타임에 소프트 키보드 공개 상태를 전환할 때 특정 플래그 값을 이 메서드에 전달합니다. 예를 들어 애플리케이션이 전화를 걸 때 소프트 키보드가 표시됨 Activity.onCreate() 동안 View.getWindowInsetsController().show(ime()) 동안 애플리케이션 개발자는 SOFT_INPUT_STATE_HIDDEN 또는 SOFT_INPUT_STATE_ALWAYS_HIDDEN 플래그 를 사용합니다.

시스템에서 일반적으로 소프트 키보드를 자동으로 숨깁니다.

대부분의 경우 시스템에서 소프트 키보드 숨기기를 처리합니다. 이 다음 사례 중 하나일 수 있습니다.

  • 사용자가 텍스트 필드에서 작업을 완료합니다.
  • 사용자가 뒤로 탐색과 함께 뒤로 키를 누르거나 스와이프 동작을 합니다.
  • 사용자가 다른 앱으로 이동할 때 다른 앱에서 설정한 경우 SOFT_INPUT_STATE_HIDDEN 또는 SOFT_INPUT_STATE_ALWAYS_HIDDEN 플래그 확인할 수 있습니다.
를 통해 개인정보처리방침을 정의할 수 있습니다.

이전 시스템 동작에 따라 소프트 키보드를 수동으로 숨기기

일부 상황에서는 앱이 소프트 키보드를 수동으로 숨겨야 합니다. 예를 들어 텍스트 필드가 View.OnFocusChangeListener.onFocusChange 이 기법을 신중하게 사용 , 소프트 키보드를 예기치 않게 닫으면 사용자 환경이 저하됩니다.

앱에서 소프트 키보드를 수동으로 숨기는 경우 소프트 키보드가 명시적 또는 암시적으로 표시됩니다.

  • 소프트 키보드는 다음 이후에 명시적으로 표시된 것으로 간주됩니다. showSoftInput() 호출

  • 반대로 소프트 키보드는 다음 조건 중 하나여야 합니다.

    • 시스템에 소프트 키보드를 표시하는 동안 android:windowSoftInputMode
    • 앱이 SHOW_IMPLICIT을(를) 다음 사용자에게 전달했습니다. showSoftInput()

일반적으로 hideSoftInputFromWindow()는 입력과 상관없이 소프트 키보드를 숨깁니다. HIDE_IMPLICIT_ONLY를 사용하여 암시적으로 요청된 소프트 키보드만 해제하도록 제한될 수 있습니다.

소프트 키보드 위에 대화상자 또는 오버레이 뷰 표시

경우에 따라 편집기 활동이 수정 불가능한 소프트 키보드 위에 있는 대화상자 또는 오버레이 창입니다.

앱에는 다음 섹션에서 설명하는 몇 가지 옵션이 있습니다.

요약하면 소프트 키보드의 창 플래그를 올바르게 처리해야 합니다. 다음 기대치를 충족하도록 기간을 타겟팅 다음과 같습니다.

  • 플래그 없음 (일반 사례): 소프트 키보드 레이어 뒤에 있으며 텍스트를 수신할 수 있습니다.
  • FLAG_NOT_FOCUSABLE 드림 : 소프트 키보드 레이어 위에 위치하지만 텍스트를 수신할 수 없습니다.
  • FLAG_ALT_FOCUSABLE_IM 드림 : 소프트 키보드 레이어 위에서 포커스를 둘 수 있지만 키보드에 연결되어 있지는 않습니다. 제공합니다. 또한 그 아래에 있는 모든 뷰가 제공합니다. 텍스트를 사용하지 않는 앱 대화상자를 표시하는 데 유용합니다. 소프트 키보드 레이어 위의 입력을 사용합니다.
  • FLAG_NOT_FOCUSABLE 드림 및 FLAG_ALT_FOCUSABLE_IM : 소프트 키보드 레이어 뒤에 위치하지만 텍스트를 수신할 수 없습니다.
  • FLAG_NOT_FOCUSABLE 드림 및 FLAG_NOT_TOUCH_MODAL : 소프트 키보드 위에 있으며 터치 이벤트가 '통과'될 수 있도록 합니다. 소프트 키보드로 이동합니다.

대화상자 만들기

FLAG_ALT_FOCUSABLE_IM 사용 대화상자 창 플래그를 사용하여 소프트 키보드 위에 대화상자를 유지하고, 소프트 키보드가 포커스를 얻지 못하게 합니다.

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()

자바

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();

오버레이 뷰 만들기

TYPE_APPLICATION_OVERLAY를 지정하는 오버레이 뷰 만들기 창 유형 및 FLAG_ALT_FOCUSABLE_IM 창 플래그를 지정합니다.

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)

자바

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);

소프트 키보드 아래에 대화상자 또는 뷰 표시

앱이 기본 레이어가 있는 대화상자나 창을 다음 속성이 포함됩니다.

  • 편집기 활동에서 요청한 소프트 키보드 아래에 표시됩니다. 텍스트 입력의 영향을 받지 않도록 합니다.
  • 소프트 키보드의 인셋 크기 변경을 인식 대화상자나 창의 레이아웃을 조정할 수 있습니다.

이 경우 앱에는 몇 가지 옵션이 있습니다. 다음 섹션 옵션을 설명합니다.

대화상자 만들기

FLAG_NOT_FOCUSABLE를 모두 설정하여 대화상자를 만듭니다. 창 플래그 및 FLAG_ALT_FOCUSABLE_IM window 플래그:

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()

자바

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();

오버레이 뷰 만들기

FLAG_NOT_FOCUSABLE를 모두 설정하여 오버레이 뷰를 만듭니다. 창 플래그 및 FLAG_ALT_FOCUSABLE_IM window 플래그:

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);