Как изменить размер AlertDialog на дисплее клавиатуры

У меня есть поле AlertDialog с примерно 10 элементами управления (текст и TextView). Эти элементы управления находятся в ScrollView с AlertDialog, плюс у меня есть 2 кнопки плюс и минус. Проблема, с которой я сталкиваюсь, заключается в том, что когда появляется программная клавиатура, две кнопки скрыты за клавиатурой.

Я искал что-то вроде функции перерисовки во внутреннем представлении или в диалоговом окне. Ниже скриншот того, о чем я говорю.

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


person Sanj    schedule 11.04.2011    source источник


Ответы (7)


Если ваш диалог был активностью, использующей одну из тем диалога, вы можете повлиять на это поведение, установив флаг adjustResize для параметра windowSoftInputMode активности.

Я использую:

android:windowSoftInputMode="adjustResize|stateHidden"

Я думаю, что вы все еще можете использовать этот флаг с обычными диалогами, но я не уверен, как его применить. Возможно, вам придется создать свой AlertDialog с настраиваемой темой, которая наследует правильную родительскую тему, а также устанавливает этот флаг, или вам, возможно, придется использовать ContextThemeWrappers и прочее.

Или, может быть, вы можете просто использовать Window#setSoftInputMode.

alertDialog.getWindow().setSoftInputMode(
    WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
person nmr    schedule 15.09.2011
comment
Последняя строка работает для меня, в идеале я полагаю, что это был вопрос здесь, и это правильный ответ. Выбранный ответ является скорее предложением об изменении дизайна, чем правильным ответом. +1 за ответ - person Jayshil Dave; 03.01.2012
comment
если у вас есть собственный стиль, вы также можете сделать его элементом определения стиля <style name="Theme.MyDialog" parent="@android:style/Theme.Dialog"><item name="android:windowSoftInputMode">adjustResize|stateHidden</item></style> - person ChristophK; 17.08.2012
comment
Этот ответ должен был быть принятым. Последняя строка кода помогла мне. Большое спасибо ! - person Bogdan Zurac; 18.04.2013
comment
Работает и с FragmentDialog! - person Bojan Radivojevic Bomber; 30.08.2013
comment
Удивительный! Большое тебе спасибо! - person rocknow; 21.11.2013
comment
Миллион раз это. Вам нужно установить SoftInputMode самого диалога. - person Eugen Timm; 19.01.2015
comment
Последняя строка кода сделала свое дело, я попытался сделать это в onCreate Activity и установить его в манифесте, но я думаю, что это не одно и то же окно. - person Eric Van Der Dijs; 22.10.2020

Я нашел лучший способ справиться с этим. Потому что это диалог, поэтому код

alertDialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

не очень хорошо работает.

Помимо этого кода, вы должны установить стиль диалога для этого диалога. Стиль должен выглядеть следующим образом:

<style name="DialogStyle" parent="@android:style/Theme.Black.NoTitleBar.Fullscreen">
    <item name="android:windowFullscreen">false</item>
    ......
    ......
</style>

ВНИМАНИЕ, что атрибут parent Theme.Black.NoTitleBar.Fullscreen подобен стилю активности. а атрибут android:windowFullScreen должен быть false.

Теперь размер диалогового окна будет изменяться при переключении программной клавиатуры.

person Nick    schedule 01.11.2012
comment
это сработало для меня, но я использовал parent="Theme.AppCompat.Light.Dialog.Alert", но установка false на "android:windowFullscreen" помогла... спасибо. - person CrandellWS; 18.09.2019

У меня ничего не работало, кроме adjustPan

согласно документации

Размер главного окна действия не изменяется, чтобы освободить место для программной клавиатуры. Вместо этого содержимое окна автоматически панорамируется, так что текущий фокус никогда не перекрывается клавиатурой, и пользователи всегда могут видеть, что они печатают. Обычно это менее желательно, чем изменение размера, потому что пользователю может потребоваться закрыть виртуальную клавиатуру, чтобы получить доступ к скрытым частям окна и взаимодействовать с ними.

Так что просто используйте его в своем методе onCreate() или onCreateView(), например:

getDialog().getWindow().setSoftInputMode(
            WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

Или просто поместите android:windowSoftInputMode="adjustPan" в манифест для Activiry, в котором мы играем с диалогами.

и используйте android:windowSoftInputMode="adjustResize|stateHidden" в каждом тексте редактирования, что поможет пользователю легко перейти к следующему текстовому полю.

Необходимо помнить

Никогда не используйте MATCH_PARENT, чтобы сделать диалоговое окно полноэкранным, так как adjustPan здесь не работает. Если кто-то хочет, чтобы диалоговое окно соответствовало размеру экрана, просто используйте точки до 0,96 (не более) для высоты, чтобы клавиатура правильно доставала до редактируемого текста. Мне понравилось ниже:

@Override
public void onStart()
{
    super.onStart();
    Dialog dialog = getDialog();
    if (dialog != null)
    {
        //int height = ViewGroup.LayoutParams.MATCH_PARENT;
        int width = ViewGroup.LayoutParams.MATCH_PARENT;
        Display display = getActivity().getWindowManager().getDefaultDisplay();
        Point size = new Point();
        display.getSize(size);
        //int width = (int)(size.x * 0.96);
        int h = (int)(size.y * 0.96);

        dialog.getWindow().setLayout(width, h);
    }
}

Посмотрите, если я буду использовать общую высоту (MATCH_PARENT), то soft_keyboard сократит диалоговое окно. Но если я буду использовать точки для высоты (здесь 0,96, что почти близко к match_parent), то это будет работать правильно.

Надеюсь, это поможет кому-то :)

person Ranjit    schedule 06.07.2017

возможно, вам не нужно изменять размер диалога

добавить android:imeOptions="actionNext" в EditText (все, кроме последнего) (он добавит кнопку "Далее" на клавиатуру - перейти к следующему EditText)

и добавьте android:imeOptions="actionDone" в последний EditText (кнопка "Готово" - скрыть клавиатуру)

теперь пользователь должен иметь возможность нажимать кнопки

если вы создаете текстовые поля в коде, используйте функцию EditText#setImeOptions

ХТН

person Selvin    schedule 11.04.2011
comment
Спасибо за информацию, но это не совсем то, как пользователь будет себя вести в этом случае. То есть у них есть свобода заполнять только одно или несколько текстовых полей, а не все - person Sanj; 11.04.2011

Вы вынуждены иметь его как всплывающее окно? Всплывающее окно выглядит настолько большим, что вы можете просто захотеть использовать его как отдельное действие. Как правило, всплывающие окна используются для предоставления краткого вопроса или заявления с несколькими вариантами, а не для полноценной формы ввода данных. Поскольку вы ничего не видите за большим всплывающим окном, вы в любом случае не предоставляете никаких базовых элементов управления.

person Stealth Rabbi    schedule 11.04.2011
comment
Хотя ваш ответ кажется мне верным, он не касается крайних случаев. Как насчет диалога среднего размера на планшете? - person nmr; 01.09.2011
comment
Правда я думал наладонник, судя по скриншоту. Если вы делаете отдельный пользовательский интерфейс для планшета, я полагаю, что диалог среднего размера для планшета может работать, но я думаю, что в целом диалог следует использовать для ввода очень небольших данных и только для уведомлений. Если вы пытаетесь сделать что-то формой, сделайте это отдельной деятельностью. - person Stealth Rabbi; 06.09.2011
comment
Но это не ответ на вопрос. - person ViliusK; 06.06.2013
comment
@ViliusK Я знаю, что это не отвечает на его точный вопрос, но я предложил альтернативное предложение пользовательского интерфейса, которое делает вещи чище для пользователя и упрощает реализацию. Если ему не понравилось предложение, то он, как постер, должен проголосовать против него или проигнорировать его. - person Stealth Rabbi; 06.06.2013

чтобы сразу показать клавиатуру и настроить размер:

editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (hasFocus) {
            dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
        }
    }
});
person Samad    schedule 31.01.2016

Тем, кто в такой же ситуации, как я.

в моем случае проблема заключалась в том, что активность имела эти атрибуты в стиле

<style name="SomeStyleName">
   <item name="android:windowTranslucentStatus">true</item>
   <item name="android:windowTranslucentNavigation">true</item>
</style>

Если windowTranslucentStatus и windowTranslucentNavigation оба верны, клавиатура появляется как диалоговое окно наложения.

Поэтому я заменяю эти значения на false только для materialAlertDialog. (возможно, AlertDialog или Dialog в вашем случае)

<style name="SomeStyleName">
   <item name="android:windowTranslucentStatus">true</item>
   <item name="android:windowTranslucentNavigation">true</item>
   <item name="materialAlertDialogTheme">@style/TranslucentMaterialAlertDialogTheme</item>
</style>

<style name="TranslucentMaterialAlertDialogTheme" parent="ThemeOverlay.MaterialComponents.MaterialAlertDialog">
   <item name="android:windowTranslucentStatus">false</item>
   <item name="android:windowTranslucentNavigation">false</item>
</style>
person yeonseok.seo    schedule 15.04.2021