Размер DialogFragment всегда изменяется при открытии программной клавиатуры
У меня есть некоторые проблемы с пользовательским DialogFragment, который отображается в полноэкранном режиме. Этот диалог имеет прокручиваемый контент и автозаполнение просмотра текста.
Первоначально диалоговое окно отображается с полем вверху - программно устанавливается как прозрачное представление вверху содержимого макета. Как только автозаполнение текстового обзора сфокусировано, это поле уменьшается до 0 (таким образом, создается иллюзия, что диалог открывается в полноэкранном режиме). В этот момент клавиатура также показана.
В настоящее время клавиатура уменьшает размер диалогового окна, и кнопка, которая находится в диалоговом окне, перемещается вверх над клавиатурой. Это создает проблему, поскольку, как только автозаполнение текстового обзора теряет фокус, размер диалогового окна изменяется, и из-за изменения размера клавиатуры также создается мерцание: клавиатура скрыта -> диалоговое окно перемещается внизу -> диалоговое окно изменяется в полноэкранный режим -> диалоговое окно resisez к исходному размеру
Текущее создание диалога:
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Dialog dialog = super.onCreateDialog(savedInstanceState);
dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);
if (!hasTitle()) {
dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
}
// the content
//final RelativeLayout root = new RelativeLayout(getActivity());
//root.setLayoutParams(
// new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
//dialog.setContentView(root);
if (position != null) {
WindowManager.LayoutParams windowParams = dialog.getWindow().getAttributes();
windowParams.x = position.x;
windowParams.y = position.y;
dialog.getWindow().setAttributes(windowParams);
} else {
dialog.getWindow().setLayout(WindowManager.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
}
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(hasTitle() ? Color.WHITE : Color.TRANSPARENT));
dialog.getWindow().setGravity(Gravity.TOP | Gravity.START);
return dialog;
}
Это работает частично, так как диалог не заполняет ширину, он намного меньше.
Что-то это исправляет, но создает еще одну проблему:
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setStyle(DialogFragment.STYLE_NO_FRAME, android.R.style.Theme_DeviceDefault_DialogWhenLarge_NoActionBar);
}
Но это повлияет на то, как выглядит фон диалога, и я не могу изменить его из метода создания диалога.
2 ответа
Я наконец нашел решение своей проблемы.
Создание диалога:
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Dialog dialog = super.onCreateDialog(savedInstanceState);
if (!hasTitle()) {
dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
}
if (position != null) {
WindowManager.LayoutParams windowParams = dialog.getWindow().getAttributes();
windowParams.x = position.x;
windowParams.y = position.y;
dialog.getWindow().setAttributes(windowParams);
} else {
WindowManager.LayoutParams attrs = dialog.getWindow().getAttributes();
attrs.flags &= ~WindowManager.LayoutParams.FLAG_FULLSCREEN;
dialog.getWindow().setLayout(WindowManager.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
}
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(hasTitle() ? Color.WHITE : Color.TRANSPARENT));
dialog.getWindow().setGravity(Gravity.TOP | Gravity.START);
dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
return dialog;
}
Создание фрагмента (я настраиваю стиль диалога - очень важно использовать No_FRAME):
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// We customize the style of this dialog - we remove the frames of the dialogs and leave the drawing to the
// onCreateView() method, and we use the custom theme for dialogs - this is a special theme which has no
// Background and the status bar is left unchanged
setStyle(DialogFragment.STYLE_NO_FRAME, R.style.Theme_Dialog);
}
Пользовательская тема (я повторно использую все свои стили, чтобы диалог выглядел одинаково):
<!-- Custom theme for dialogs - this will use the same styling as the main theme, but will disable the background
of the window, and it will also leave the status bar color unchanged -->
<style name="Theme.Dialog">
<item name="android:windowBackground">@android:color/transparent</item>
<!-- We do not want to change the status bar color -->
<item name="colorPrimaryDark">@color/transparent</item>
</style>
Теперь мой фрагмент диалога выглядит как FullScreen, и он больше не изменяется при открытии программной клавиатуры, создавая эффект мерцания при ручном изменении его размера. Важной частью была DialogFragment.STYLE_NO_FRAME
,
Я надеюсь, что это поможет другим с подобными проблемами.
Вы можете сделать одну вещь для этого...
Добавьте это в свой onViewCreated:
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
super.onViewCreated(view, savedInstanceState);
}
Использование "AdjustPan" Главное окно действия не изменяется, чтобы освободить место для программной клавиатуры. Таким образом, в этом случае все представления вашей фрагментированной страницы должны быть в ScrollView, или пользователю может потребоваться закрыть экранную клавиатуру, чтобы получить доступ к скрытым частям и взаимодействовать с ними. окно.
Надеюсь, что это поможет вам.