Делаем окно DialogFragment прокручиваемым

У меня проблема, когда диалоги не прокручиваются, когда их содержимое слишком велико для экрана. Я предполагаю, что это связано с тем, что Dialogs не отображаются в контейнерах с возможностью прокрутки.

введите здесь описание изображения

Снимок экрана содержит содержимое, завернутое в ScrollView — видно, что прокручивается только содержимое

Добавлены дополнительные поля для искусственного увеличения размера диалогового окна в этом примере

Из Документации для разработчиков Android видно, что диалоги должны быть заключены в DialogFragments (это дает преимущество в том, что ваши диалоги переживают изменение ориентации и реакцию на события жизненного цикла), и это настройка, которую я пытаюсь заставить работать.

Многие другие ответы, которые я нашел, похожи друг на друга и вращаются вокруг того, чтобы для окна было установлено значение «adjustResize». Однако это только уменьшит размер родительского представления при открытии клавиатуры и не сделает представление прокручиваемым, если оно не находится в контейнере с возможностью прокрутки.

Если бы кто-нибудь мог сообщить мне, есть ли у них информация, чтобы сделать диалог прокручиваемым или подтвердить, что вы не можете сделать диалог прокручиваемым, я был бы признателен.


person Graeme    schedule 17.03.2016    source источник


Ответы (3)


Я добился прокрутки в фрагменте диалога,

Дизайн макета диалога

<LinearLayout>
 <NestedScrollView>
   <ConstrainLayout>
   </ConstrainLayout>
 </NestedScrollView>
</LinearLayout>

В классе DialogFrament,

override fun onStart() {
  super.onStart()
       dialog.window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZ)
    }
person Saravanan    schedule 07.08.2018
comment
Обертывание всего в NestedScrollView работало без внешнего LinearLayout - person Jeffrey; 04.02.2019
comment
@Jeffrey Но разве LinearLayout не необходим и не является хорошей практикой его добавления? - person carloswm85; 06.11.2020

Это, возможно, самое грязное и наиболее вероятное решение этой проблемы:

После создания диалогового окна в onCreateDialog(), но перед его возвратом вы можете добиться прокрутки, добавив этот код:

    final ViewGroup content = (ViewGroup) dialog.findViewById(android.R.id.content);
    content.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            content.getViewTreeObserver().removeGlobalOnLayoutListener(this);
            View inner = content.getChildAt(0);
            content.removeViewAt(0);
            ScrollView scrollView = new ScrollView(getContext());
            scrollView.addView(inner);
            content.addView(scrollView);
        }
    });
person Graeme    schedule 18.03.2016

У меня была такая же проблема с DialogFragment, но я изменил:

<fragment android:layout_height="425dp"
...

к этому:

<fragment android:layout_height="wrap_content" 
...

А теперь прокручивается при открытой клавиатуре, или когда экран в ландшафтном режиме.

ПРИМЕЧАНИЕ. Конечно, у меня есть ScrollView как rootView в макете DialogFragment.

person Petr Tykal    schedule 25.02.2017