⌨️
【Android】setSoftInputMode について
DialogFragment#setupDialog
でsetSoftInputMode
を使っていたので、これが何なのか調べてみました。
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