Модальный BottomSheetDialog с полноэкранной панелью инструментов и Softkeyboard

Как можно создать модальный BottomSheetDialog(Fragment) который переключается в полноэкранный режим с помощью панели инструментов, как показано в спецификации дизайна материала?

enter image description here

Я мог бы добавить BottomSheetBehavior.BottomSheetCallback вручную, добавив BottomSheetBehavior.BottomSheetCallback и установив альфа BottomSheetBehavior.BottomSheetCallback в зависимости от slideOffset. Это немного глупо, но, кажется, работает, когда перемещаете Нижний лист. Однако это не работает, когда мой нижний лист содержит EditText и отображается клавиатура. Я попробовал обе версии: BottomSheetDialogFragment и вручную добавил поведение в новый фрагмент.

  • Есть ли более простой способ добиться этого?
  • Могу ли я вызвать панель инструментов, когда отображается клавиатура, а нижний лист занимает все пространство?

Ответ 1

Вы можете использовать эту библиотеку с открытым исходным кодом и посмотреть на лист меню, который делает то же самое или посмотреть, как это делается, и сделать ваш

Ответ 3

Я совершенно новый для Android, но все еще проверить это. Надеюсь, это поможет вам:

// The View with the BottomSheetBehavior  
 View bottomSheet = coordinatorLayout.findViewById(R.id.bottom_sheet);  
 BottomSheetBehavior behavior = BottomSheetBehavior.from(bottomSheet);  
 behavior.setBottomSheetCallback(new BottomSheetCallback() {  
    @Override  
    public void onStateChanged(@NonNull View bottomSheet, int newState) {  
      // React to state change  
    }  
      @Override  
      public void onSlide(@NonNull View bottomSheet, float slideOffset) {  
       // React to dragging events  
   }  
 });

Вы можете прочитать больше об этом здесь: Ссылка на приведенный выше код

Ответ 4

Я сталкиваюсь с той же проблемой. Это то, что я решил. Поведение скрыто в BottomSheetDialog, который доступен для определения поведения. Если вы не хотите менять свой родительский макет на CooridateLayout, вы можете попробовать это.

ШАГ 1: настроить BottomSheetDialogFragment

open class CBottomSheetDialogFragment : BottomSheetDialogFragment() {
   //wanna get the bottomSheetDialog
   protected lateinit var dialog : BottomSheetDialog 
   override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
      dialog = super.onCreateDialog(savedInstanceState) as BottomSheetDialog
      return dialog
   }

   //set the behavior here
   fun setFullScreen(){
      dialog.behavior.state = STATE_EXPANDED
   }
}

ШАГ 2: заставьте свой фрагмент расширить этот фрагмент

class YourBottomSheetFragment : CBottomSheetDialogFragment(){

   //make sure invoke this method after view is built
   //such as after OnActivityCreated(savedInstanceState: Bundle?)
   override fun onStart() {
      super.onStart()
      setFullScreen()//initiated at onActivityCreated(), onStart()
   }
}