Android 15からedge-to-edgeが強制されるようになります。
現在、Android Studioで新規プロジェクトを作成するとedge to edge対応のサンプルが作られるように、ひとまず従来と同等の表示をさせるの難しくありません。
しかし、以下のように、テキスト入力がある画面で、画面下部に送信などのボタンがある画面において、ソフトウェアキーボードが表示されたときは、それに合わせてボタン部分もせり上がらないと一度キーボードを非表示にしないとボタンが押せないという状態になってしまいます。
従来であれば、AndroidManifest.xmlでandroid:windowSoftInputMode="adjustResize"
を指定するだけで対応できました。
<activity
android:name=".MainActivity"
android:windowSoftInputMode="adjustResize"
android:exported="true"
>
標準的なedge to edge対応のActivityの場合
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
val binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
ViewCompat.setOnApplyWindowInsetsListener(binding.main) { v, insets ->
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
v.setPadding(
systemBars.left,
systemBars.top,
systemBars.right,
systemBars.bottom,
)
insets
}
}
android:windowSoftInputMode="adjustResize"
を設定していても以下のように、キーボードに隠れてしまいます。
OnApplyWindowInsetsListener
にてimeのinsetsを含める
ほとんどの場合はこちらの対応で十分かと思います、テンプレート通りだと、OnApplyWindowInsetsListener
にて、systemBarsのinsetsをpaddingに設定していますが、ここでimeのinsetsも含めて設定するようにします。
imeのinsetsはsystemBarsのinsetsを除外したものではないので、maxOfで大きな方の値を設定するようにします。
本来であれば上下左右の設定をすべきかもしれませんが、bottomだけ変更しています。
ViewCompat.setOnApplyWindowInsetsListener(binding.main) { v, insets ->
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
val ime = insets.getInsets(WindowInsetsCompat.Type.ime())
v.setPadding(
systemBars.left,
systemBars.top,
systemBars.right,
maxOf(systemBars.bottom, ime.bottom),
)
insets
}
WindowInsetsAnimationCallback
を利用する
もう一つの方法、API 30からWindowInsetsAnimationCallback
が使えるようになっており、これを使うことで、IMEが表示されるアニメーションに合わせて処理ができるようになっています。ViewCompatを使うことで過去のバージョンでも利用できます。
以下のように、追加のpaddingを設定することで、ソフトキーボードの上にボタンがくるようにレイアウトを変更することができます。
ViewCompat.setWindowInsetsAnimationCallback(
binding.main,
object : WindowInsetsAnimationCompat.Callback(DISPATCH_MODE_STOP) {
override fun onProgress(
insets: WindowInsetsCompat,
runningAnimations: MutableList<WindowInsetsAnimationCompat>,
): WindowInsetsCompat {
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
val ime = insets.getInsets(WindowInsetsCompat.Type.ime())
binding.buttonArea.updatePadding(
bottom = (ime.bottom - systemBars.bottom).coerceAtLeast(0)
)
return insets
}
})
以上です