# Android의 6개의 부동 창:키보드 입력
나는 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
rootView
가 WindowContentLayout
인 경우 이벤트에 반응하고 필요에 따라 소프트 키보드 지원을 활성화/비활성화할 수 있습니다.rootView.setListener {
if (it) {
enableKeyboard()
} else {
disableKeyboard()
}
}
이 창으로 보내는 모든 이벤트가 캡처되기 때문에 모든 내용을 포함하는 창에 공통된 해결 방안입니다.결실
평온하다우리는 창 뒤에서 일반 프로그램을 실행할 수도 있고, 부동 노트에서 키보드를 사용할 수도 있다.
소스 코드
본문의 모든 소스 코드는 available on Github입니다.
기대 많이 해주세요.
안드로이드 개발에 대한 더 많은 정보를 원하십니까?트위터에서 나()와 로컬레이지(Localazy), 혹은 유사한Localazy on Facebook을 팔로우한다.
시리즈
이 문서는 Android 시리즈 부동 창의 일부입니다.
Reference
이 문제에 관하여(# Android의 6개의 부동 창:키보드 입력), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/localazy/6-floating-windows-on-android-keyboard-input-phd텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)