Как изменить размер AlertDialog на дисплее клавиатуры - PullRequest
32 голосов
/ 11 апреля 2011

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

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

enter image description here

Ответы [ 6 ]

97 голосов
/ 15 сентября 2011

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

Я использую:

android:windowSoftInputMode="adjustResize|stateHidden"

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

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

alertDialog.getWindow().setSoftInputMode(
    WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
15 голосов
/ 01 ноября 2012

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

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.

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

2 голосов
/ 06 июля 2017

У меня ничего не получалось, кроме 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), то она будет работать правильно.

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

1 голос
/ 11 апреля 2011

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

1 голос
/ 11 апреля 2011

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

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

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

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

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

НТН

0 голосов
/ 31 января 2016

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

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);
        }
    }
});
...