[초구어] adjust Nothing. 그런데 Software Keyboard는 뭘 하고 싶어요!때로 하는 일

16753 단어 Android

개시하다


망했다
빠르지만 Software Input Mode가 있지 않나요?
adjustPan이야, adjust Resize야.
키보드가 갑자기 나오면 갑자기 줄어들잖아요.키보드 뒷면에 숨기지 않습니다!너무 좋아요!

편하긴 한데.


나는 배경을 축소하고 싶지 않아!근데 키보드 위치가 위로 이동하고 싶어요!
이런 느낌이야.인스타그램 실시간으로 중계되는 댓글창 같은 거!나 그거 하고 싶어!
adjustnone 좋아요!
하지만 키보드가 나오지 않아서 뺄 수가 없어요.그리고 이 점을 감지하려면 View의 크기를 감시해야 한다. 사이즈가 바뀌면 키보드가 나온다!이렇게 판단하는 거 아니에요?
adjustnone에서 이런 사이즈 조정 이벤트를 해주시나요?그렇게 생각해요.

팝업 윈도 있잖아!


https://developer.android.com/reference/android/widget/PopupWindow.html
이 녀석은 Software Input Mode를 설정할 수 있어!
그러니까 액티비티와 다른 Software Input Mode를 설정할 수 있다는 거죠?그쵸?


이런 느낌.
KeyboardHeightProvider.kt
/**
 * ソフトウェアキーボードの高さを計算するやつ
 */
typealias KeyBoardHeightChangedListener = (keyboardHeight: Int) -> Unit

@SuppressLint("InflateParams")
class KeyboardHeightProvider(private val activity: Activity) : PopupWindow() {

    private val measurementView: View by lazy {
        LayoutInflater.from(activity).inflate(R.layout.view_mesurement, null, false)
    }
    private val parentView: View by lazy {
        activity.findViewById<View>(android.R.id.content)
    }

    private var listener: KeyBoardHeightChangedListener? = null

    init {
        softInputMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE or
                WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE
        inputMethodMode = INPUT_METHOD_NEEDED
        contentView = measurementView
        width = 0
        height = WindowManager.LayoutParams.MATCH_PARENT
        measurementView.viewTreeObserver.addOnGlobalLayoutListener {
            calcHeight()
        }
    }

    fun listen(listener: KeyBoardHeightChangedListener) {
        this.listener = listener
    }

    fun start() {
        if (!isShowing && parentView.windowToken != null) {
            showAtLocation(parentView, Gravity.NO_GRAVITY, 0, 0)
        }
    }

    fun stop() {
        dismiss()
        listener = null
    }

    private fun calcHeight() {
        val point = Point()
        activity.windowManager.defaultDisplay.getSize(point)
        val rect = Rect()
        measurementView.getWindowVisibleDisplayFrame(rect)
        listener?.invoke(point.y - rect.bottom)
    }

}
view_mesurement.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="0dp"
    android:layout_height="match_parent" />
이렇게 BA☆
MainActivity.kt
import android.os.Bundle
import android.support.constraint.ConstraintSet
import android.support.v7.app.AppCompatActivity
import com.example.self.edu.firestorechatsample.KeyboardHeightProvider
import com.example.self.edu.firestorechatsample.R
import kotlinx.android.synthetic.main.activity_entory.*

class MainActivity : AppCompatActivity() {

    private val keyboardHeightProvider: KeyboardHeightProvider by lazy {
        KeyboardHeightProvider(this)
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        root_container.post {
            keyboardHeightProvider.start()
        }
    }

    override fun onResume() {
        super.onResume()
        keyboardHeightProvider.listen {
            // EditTextをズラしてる
            ConstraintSet().run {
                clone(root_container)
                setMargin(R.id.message, ConstraintSet.BOTTOM, it)
                applyTo(root_container)
            }
        }
    }

    override fun onPause() {
        keyboardHeightProvider.stop()
        super.onPause()
    }

}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/root_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.self.edu.firestorechatsample.view.EntryActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="わーい"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"/>

    <EditText
        android:id="@+id/message"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:hint="メッセージ"
        android:lines="1"
        android:maxLines="1"
        android:layout_marginStart="8dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toStartOf="@+id/send"
        app:layout_constraintHorizontal_chainStyle="spread_inside"/>

    <Button
        android:id="@+id/send"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginEnd="8dp"
        android:text="送信"
        app:layout_constraintTop_toTopOf="@+id/message"
        app:layout_constraintStart_toEndOf="@+id/message"
        app:layout_constraintBottom_toBottomOf="@+id/message"
        app:layout_constraintEnd_toEndOf="parent" />

</android.support.constraint.ConstraintLayout>
manifest.xml
<activity android:name=".view.MainActivity"
    android:windowSoftInputMode="adjustNothing">

아 맞다 맞다 맞다 난 Kotlin Android Extension 썼어.

좋은 웹페이지 즐겨찾기