I want to make bottom sheet dialog and keyboard synchronized movement in android, kotlin. I start bottom sheet dialog fragment from another fragment by navController:
private fun listeners(){
binding.btnBottomSheetDialog.setOnClickListener {
findNavController().navigate(HomeFragmentDirections.actionBlankFragmentToBottomSheetDialogFragment())
}
}
it's layout of bottom sheet dialog:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.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:layout_width="match_parent"
android:layout_height="wrap_content"
tools:context=".fragments.bottom_sheet.BottomSheetDialogFragment">
<androidx.appcompat.widget.AppCompatEditText
android:id="@+id/input"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="20dp"
android:layout_marginVertical="20dp"
android:textSize="18sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView"
android:hint="Enter your name" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="30dp"
android:layout_marginTop="28dp"
android:gravity="center"
android:text="Bottom sheet dialog fragment"
android:textColor="@color/black"
android:textSize="18sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/textView2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginVertical="30dp"
android:layout_marginTop="40dp"
android:gravity="center"
android:text="random text"
android:textColor="@color/black"
android:textSize="18sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="@+id/input"
app:layout_constraintStart_toStartOf="@+id/input"
app:layout_constraintTop_toBottomOf="@+id/input" />
<View
android:id="@+id/line"
android:layout_width="match_parent"
android:layout_height="1dp"
android:visibility="invisible"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
it's dialog fragment code:
import android.app.Dialog
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.WindowManager
import com.example.keyboardevent.R
import com.example.keyboardevent.databinding.FragmentBottomSheetDialogBinding
import com.google.android.material.bottomsheet.BottomSheetBehavior
import com.google.android.material.bottomsheet.BottomSheetDialog
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
class BottomSheetDialogFragment : BottomSheetDialogFragment() {
private var _binding: FragmentBottomSheetDialogBinding? = null
private val binding get() = _binding!!
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setStyle(STYLE_NORMAL, R.style.AppBottomSheetDialogTheme)
}
override fun onStart() {
super.onStart()
binding.input.requestFocus()
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
_binding = FragmentBottomSheetDialogBinding.inflate(inflater, container, false)
return binding.root
}
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val bottomSheetDialog =
super.onCreateDialog(savedInstanceState)
bottomSheetDialog.window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE)
if (bottomSheetDialog is BottomSheetDialog) {
bottomSheetDialog.behavior.skipCollapsed = true
bottomSheetDialog.behavior.state = BottomSheetBehavior.STATE_EXPANDED
}
return bottomSheetDialog
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
}
My navigation:
<?xml version="1.0" encoding="utf-8"?>
<navigation 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/navigation_graph"
app:startDestination="@id/blankFragment">
<fragment
android:id="@+id/blankFragment"
android:name="com.example.keyboardevent.fragments.home.HomeFragment"
android:label="fragment_blank"
tools:layout="@layout/fragment_blank" >
<action
android:id="@+id/action_blankFragment_to_bottomSheetDialogFragment"
app:destination="@id/bottomSheetDialogFragment" />
</fragment>
<dialog
android:id="@+id/bottomSheetDialogFragment"
android:name="com.example.keyboardevent.fragments.bottom_sheet.BottomSheetDialogFragment"
android:label="BottomSheetDialogFragment"
tools:layout="@layout/fragment_bottom_sheet_dialog"/>
</navigation>
This's bottom sheet style:
<style name="AppBottomSheetDialogTheme" parent="Theme.Design.Light.BottomSheetDialog">
<item name="bottomSheetStyle">@style/AppModalStyle</item>
<item name="android:windowIsFloating">false</item>
<item name="android:windowSoftInputMode">adjustResize</item>
</style>
<style name="AppModalStyle" parent="Widget.Design.BottomSheet.Modal">
<item name="android:background">@drawable/rounded_dialog</item>
</style>
I wrote this in manifest also for activity:
android:windowSoftInputMode="adjustResize"
bottom sheet fragment moves up firstly and after that keyboard moves up. I want they move at the same time.
I try to use WindowInsetsAnimationCompat Callback for keyboard animation but it was working only for fragment's views and keyboard, not for dialog fragment and keyboard.
How can I make animation that moves bottom sheet dialog up to keyboard with synchronized movement? or is there other way?