⌨️

【Android】setSoftInputMode について

2021/03/04に公開

DialogFragment#setupDialogsetSoftInputModeを使っていたので、これが何なのか調べてみました。

setSoftInputMode

setSoftInputModeを使うことで、ソフトキーボードの入力モードを指定など、キーボードの表示を制御することが出来ます。

入力モードに「未指定」以外の値を指定すると、ソフトキーボードのテーマが上書きされるとのことです。

入力モードの種類

SOFT_INPUT_STATE_UNSPECIFIED

soft input area の状態を指定していない

SOFT_INPUT_STATE_UNCHANGED

soft input area の状態を変更しない

SOFT_INPUT_STATE_HIDDEN

通常適切なとき(ウィンドウを前面に持ってきたとき)soft input area を隠す

SOFT_INPUT_STATE_ALWAYS_HIDDEN

ウィンドウがフォーカスされたとき、常に soft input area を隠す

SOFT_INPUT_STATE_VISIBLE

通常適切なとき(ウィンドウを前面に持ってきたとき)soft input area を表示する

SOFT_INPUT_STATE_ALWAYS_VISIBLE

ウィンドウがフォーカスされたとき、常に soft input area を表示する

ちなみに、キーボードを表示するときは、スクリーンショットのようになります。
キーボード表示

実装例 : ダイアログとキーボードを表示する

MyDialogFragment.kt

class MyDialogFragment : DialogFragment() {

    private lateinit var binding: FragmentMyDialogBinding

    override fun setupDialog(dialog: Dialog, style: Int) {
        val contentView = View.inflate(context, R.layout.fragment_my_dialog, null)
        dialog.apply {
            setContentView(contentView)
            // ここでキーボードの入力モードを指定
	    window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE)
        }
        binding = FragmentMyDialogBinding.bind(contentView)
        setupClickListener()
    }

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        dialog?.window?.attributes?.let { layoutParames ->
            layoutParames.apply {
                width = WindowManager.LayoutParams.MATCH_PARENT
                height = WindowManager.LayoutParams.MATCH_PARENT
            }
        }
    }

    private fun setupClickListener() {
        // 右上の閉じるボタンをクリックしたら、ダイアログを閉じる。
        binding.close.setOnClickListener { dismiss() }
    }
}

MainActivity.kt

class MainActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
        setupClickListener()
    }

    private fun setupClickListener() {
        binding.button.setOnClickListener {
            MyDialogFragment().show(supportFragmentManager, this::class.java.simpleName)
        }
    }
}

fragment_my_dialog.xml

<?xml version="1.0" encoding="utf-8"?>
<layout>
    <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:text="MyDialog"
            android:textSize="30sp"
            android:textStyle="bold"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <ImageView
            android:id="@+id/close"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="10dp"
            android:src="@android:drawable/ic_menu_close_clear_cancel"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

app / build.gradle

plugins {
    id 'com.android.application'
    id 'kotlin-android'
    id 'kotlin-kapt'
}

android {
    compileSdkVersion 30
    buildToolsVersion "30.0.2"

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    kotlinOptions {
        jvmTarget = '1.8'
    }
    // DataBinding に必要
    buildFeatures {
        dataBinding = true
    }
}

Discussion