# Android의 6개의 부동 창:키보드 입력

Facebook Heads와 다른 앱에서 사용하는 부동 창을 어떻게 만드는지 생각해 보셨나요?너는 너의 응용 프로그램에서 같은 기술을 사용할 생각을 했니?이것은 매우 간단하다. 나는 너에게 전체 과정을 완성하도록 지도할 것이다.
나는 Floating Apps의 저자이다.구글플레이에서 동종 앱 최초로 다운로드 800만 뷰를 넘긴 가장 인기 있는 앱이다.6년간의 응용 개발을 거쳐 나는 그것에 대해 어느 정도 알고 있다.때때로 나는 몇 달 동안 문서와 안드로이드 소스 코드를 읽고 실험을 했다.나는 수만 명의 사용자의 피드백을 받았고, 서로 다른 버전의 안드로이드 휴대전화에서 각양각색의 문제를 보았다.
다음은 내가 가는 길에 배운 것이다.
본문을 읽기 전에 먼저 읽는 것을 권장합니다Floating Windows on Android 5: Moving Window.
본문에서, 부동 창에서 키보드 입력을 허용하는 방법을 가르쳐 드리겠습니다.

거의 다 왔다
이전 글에서 메인 프로그램, 프론트 데스크톱 서비스, 부동 창을 만들었습니다.우리는 심지어 화면에서 창을 이동할 수 있다.그러나 소프트 키보드가 트리거되지 않았기 때문에 사용할 수 없기 때문에 주석을 쓸 수 없습니다.
마지막 문제를 해결합시다. 그러면 다음 글에서 기능이 완비된 응용 프로그램을 얻을 수 있도록 모든 내용을 한데 묶을 수 있습니다.

무슨 문제라도 있습니까?
부동 창에 대한 네 번째 글에서 창LayoutParams에 특정한 로고를 추가한 것을 기억할 수 있습니다.
  • FLAG_NOT_FOCUSABLE - 이 창은 키 입력 초점을 영원히 받지 못하기 때문에 사용자는 키나 다른 단추 이벤트를 보낼 수 없습니다.이 창들은 초점을 맞출 수 있는 뒤로 옮겨집니다.
  • 묘사가 매우 명확하다.이 플래그를 설정하면 창에 키보드 입력이 수신되지 않습니다.그러나 이 플래그를 설정하지 않으면 부동 창이 뒤에 있는 프로그램을 방해해서 키보드를 사용할 수 없습니다.

    솔루션
    분명히 해결 방안은 결코 찾기 어렵지 않다.우리는 정확한 시간에 이 표지를 사용하거나 사용하지 않기만 하면 된다.
    로고를 바꾸는 것은 매우 간단한 작업이다.다음은 다음과 같습니다.
    private fun enableKeyboard() {  
      if (windowParams.flags and WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE != 0) {  
        windowParams.flags = windowParams.flags and WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE.inv()  
        update()  
      }  
    }  
    
    private fun disableKeyboard() {  
      if (windowParams.flags and WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE == 0) {  
        windowParams.flags = windowParams.flags or WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE  
        update()  
      }  
    }
    

    언제 사용/사용 안 함으로 설정됩니까?
    논리는 매우 간단하다.창이 활성화되었을 때, 사용자가 그것을 눌렀을 때, 키보드 입력을 사용해야 합니다.사용자가 창 밖에서 눌렀을 때, 우리는 그것을 비활성화해야 한다.이렇게

    공통 솔루션
    서로 다른 창 레이아웃에 대한 일반적인 해결 방안에 대해 우리는 하위 클래스 LinearLayout 를 사용하여 창에 용기를 만듭니다.
    다행히도 우리는 다른 로고를 LayoutParams로 설정했다.
  • FLAG_WATCH_OUTSIDE_TOUCH - 창 밖에서 발생한 터치 이벤트를 수신합니다.
  • 따라서 맞춤형 제작ViewContainer을 통해 우리는 창 안팎의 클릭을 감시할 수 있다.이러한 컨테이너의 전체 소스 코드는 다음과 같습니다.
    class WindowContentLayout : LinearLayout {  
    
      constructor(context: Context) : super(context)  
      constructor(context: Context, attrs: AttributeSet) : super(context, attrs)  
      constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr)  
    
      private var listener: ((activate: Boolean) -> Unit)? = null  
    
      fun setListener(listener: (activate: Boolean) -> Unit) {  
        this.listener = listener  
      }  
    
      override fun onTouchEvent(event: MotionEvent): Boolean {  
        if (event.action == MotionEvent.ACTION_DOWN) listener?.invoke(true)  
        if (event.action == MotionEvent.ACTION_OUTSIDE) listener?.invoke(false)  
        return super.onTouchEvent(event)  
      }  
    
      override fun onInterceptTouchEvent(event: MotionEvent): Boolean  {  
        if (event.action == MotionEvent.ACTION_DOWN) listener?.invoke(true)  
        if (event.action == MotionEvent.ACTION_OUTSIDE) listener?.invoke(false)  
        return super.onInterceptTouchEvent(event)  
      }  
    
    }
    
    현재 우리는 LinearLayout의 하위 클래스window.xml를 사용해야 한다. 창 레이아웃:
    <com.localazy.quicknote.windows.WindowContentLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:weightSum="1">
    
        <!-- The content of the window omitted for brevity. -->
    
    </com.localazy.quicknote.windows.WindowContentLayout>
    
    우리가 알고 있는 바와 같이 뿌리 원소는 시종 우리의 것이다WindowContentLayout. 우리는 rootView의 팽창선을 다음과 같이 바꿀 수 있다.
    private val rootView = layoutInflater.inflate(R.layout.window, null) as WindowContentLayout
    
    rootViewWindowContentLayout인 경우 이벤트에 반응하고 필요에 따라 소프트 키보드 지원을 활성화/비활성화할 수 있습니다.
    rootView.setListener {  
      if (it) {  
        enableKeyboard()  
      } else {  
        disableKeyboard()  
      }  
    }
    
    이 창으로 보내는 모든 이벤트가 캡처되기 때문에 모든 내용을 포함하는 창에 공통된 해결 방안입니다.

    결실
    평온하다우리는 창 뒤에서 일반 프로그램을 실행할 수도 있고, 부동 노트에서 키보드를 사용할 수도 있다.

    소스 코드
    본문의 모든 소스 코드는 available on Github입니다.

    기대 많이 해주세요.
    안드로이드 개발에 대한 더 많은 정보를 원하십니까?트위터에서 나()와 로컬레이지(Localazy), 혹은 유사한Localazy on Facebook을 팔로우한다.

    시리즈
    이 문서는 Android 시리즈 부동 창의 일부입니다.
  • Floating Windows on Android 1: Jetpack Compose & Room
  • Floating Windows on Android 2: Foreground Service
  • Floating Windows on Android 3: Permissions
  • Floating Windows on Android 4: Floating Window
  • Floating Windows on Android 5: Moving Window
  • Floating Windows on Android 6: Keyboard Input
  • Floating Windows on Android 7: Boot Receiver
  • Floating Windows on Android 8: The Final App
  • Floating Windows on Android 9: Shortcomings
  • Floating Windows on Android 10: Tips & Tricks
  • 좋은 웹페이지 즐겨찾기