2016-06-10 3 views
1

У меня возникли проблемы с пользовательским диалоговым окном DialogFragment, который отображается в полноэкранном режиме. Этот диалог имеет прокручиваемый контент и имеет автозаполнение.DialogFragment всегда изменяется, когда открыта мягкая клавиатура

Первоначально диалог отображается с краем вверху - программно программируется как прозрачный вид в верхней части содержимого макета. Как только объект autocompletetextview сфокусирован, этот запас уменьшается до 0 (таким образом, создается иллюзия, что диалог переходит в полноэкранный режим). В этот момент также отображается клавиатура.

В настоящее время клавиатура уменьшает размер диалогового окна, и кнопка, расположенная в диалоговом окне, перемещается вверх над клавиатурой. Это создает проблему, потому что, как только autocompletetextview потеряет фокус, диалог изменяется, и из-за изменения размера клавиатуры создается также фликкер: они скрыты -> диалог сдвинут внизу -> изменяется диалог в полноэкранный режим -> диалог 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); 
    } 

Но это будет влиять как на фоне диалога выглядит, и я не могу показаться, чтобы быть в состоянии изменить его из диалогового создания метод.

ответ

3

Я, наконец, нашел решение моей проблемы.

Создание диалога:

@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.

Я надеюсь, что это поможет другим с аналогичными проблемами.

+1

DialogFragment.STYLE_NO_FRAME сделал трюк! –

1

Вы можете сделать одну вещь для этого ...

Добавить это в onViewCreated:

@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 
getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN); 
super.onViewCreated(view, savedInstanceState); 

}

Использование "adjustPan" Главное окно на данный вид деятельности не изменяется, чтобы освободить место для мягкой клавиатуры. Итак, в этом случае все виды страницы фрагмента должны быть в ScrollView или пользователю может понадобиться закрыть мягкую клавиатуру, чтобы получить доступ к скрытым частям окна и взаимодействовать с ними.

Надеюсь, это вам поможет.

+0

В настоящее время это не работает для моего случая –

+0

У меня есть редактирование моего ответа. Попробуйте этот –

+0

Ваш отредактированный ответ тот же, только тот, который он знает программно. Как и следовало ожидать, результат тот же. –

Смежные вопросы