Подтвердить что ты не робот

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

Хорошо, у меня есть окно AlertDialog с примерно 10 элементами управления (текст и текст). Эти элементы управления находятся в scrollview с alertdialog, плюс я получил две кнопки положительные и отрицательные. Проблема в том, что при открытии мягкой клавиатуры две кнопки скрыты за клавиатурой.

Я искал что-то вроде функции перерисовки в моем внутреннем представлении или в диалоговом окне.

Если у кого-то есть какие-либо идеи, пожалуйста, помогите. Ниже показан снимок экрана, о котором я говорю.

enter image description here

4b9b3361

Ответ 1

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

Я использую:

android:windowSoftInputMode="adjustResize|stateHidden"

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

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

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

Ответ 2

Я нашел лучший способ справиться с этим. Потому что это диалог, так что код "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" должен быть ложным.

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

Ответ 3

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

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

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

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

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

НТН

Ответ 4

Ничего не работало для меня, кроме 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 (не более этого) для высоты, поэтому клавиатура будет правильно добираться до edittext. Мне понравилось:

@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), тогда она будет правильно работать.

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

Ответ 5

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

Ответ 6

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

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