Полный экран DialogFragment

Я пытаюсь создать DialogFragment с шириной MATCH_PARENT, чтобы диалоговое окно было почти полноэкранным (оставляя отступы по краям для плавающего вида). Я видел это решение Полноэкранный диалоговый фрагмент в Android, но я пытаюсь избежать взлома установив ширину на 1000dp. С моим текущим макетом, независимо от того, использую ли я FILL_PARENT или MATCH_PARENT, кажется, что ширина и высота устанавливаются на WRAP_CONTENT.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

Я использовал это решение для Dialog (не DialogFragment), и оно работает так, как ожидалось:

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

person invertigo    schedule 09.08.2012    source источник
comment
Я добавил android:minWidth=1000dp в приведенный выше макет, и это дает мне желаемые результаты, но я все еще ищу более элегантное решение (если оно есть).   -  person invertigo    schedule 09.08.2012


Ответы (9)


это идеально для меня. когда расширяет DialogFragment, переопределяет onCreateView()... реализует всю логику

диалоговое окно делает его полноэкранным, просто переопределите этот метод

 @Override
public Dialog onCreateDialog(final Bundle savedInstanceState) {

    // the content
    final RelativeLayout root = new RelativeLayout(getActivity());
    root.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));

    // creating the fullscreen dialog
    final Dialog dialog = new Dialog(getActivity());
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
    dialog.setContentView(root);
    dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.YELLOW));
    dialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);

    return dialog;
}
person Attif    schedule 26.03.2014
comment
хорошо, но как также удалить строку состояния? Я хочу полный полный экран только мой макет! - person Amir Hossein Ghasemi; 06.04.2015
comment
ПРОСТО добавьте этот код строки, чтобы он был полноэкранным без строки состояния: dialog.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN); - person Amir Hossein Ghasemi; 06.04.2015
comment
В onCreateView() вашего DialogFragment добавьте следующее getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITL); Works on me - person Sattar Hummatli; 13.07.2016
comment
Источник: andraskindler.com/blog/ 2013/. Вместо Color.YELLOW можно написать Color.TRANSPARENT. Это обязательная строка, если ее убрать, вокруг диалога появятся рамки. - person CoolMind; 22.08.2016
comment
@AmirHosseinGhasemi, добавление getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE); к любой части onCreateView() приводит к исключению: requestFeature() must be called before adding content. - person CoolMind; 22.08.2016
comment
Если вы хотите установить поля, см. этот ответ SO: stackoverflow.com/a/42419832/2011622 - person Peter F; 24.02.2017

попробуйте переключиться на RelativeLayout вместо LinearLayout. Это сработало в моем случае

person atermenji    schedule 09.08.2012


Лучшим решением, которое я нашел, было установить для ширины или minWidth какое-то сколь угодно большое значение, чтобы оно заполнило весь экран. Мне не нравится это решение, но я не видел ничего лучше.

person invertigo    schedule 12.06.2013

В моем коде я хотел полноэкранный диалог, но по-прежнему показывал панель уведомлений в верхней части экрана, поэтому я использую:

setStyle(DialogFragment.STYLE_NORMAL, android.R.style.Theme_Black_NoTitleBar);

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

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

person LukeWaggoner    schedule 16.04.2016

Вы также можете сделать что-то вроде

@Override
  public void onCreate(@Nullable final Bundle savedInstanceState) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
      setStyle(STYLE_NO_TITLE, android.R.style.Theme_Material_Light_NoActionBar_Fullscreen);
    } else {
      setStyle(STYLE_NO_TITLE, android.R.style.Theme_DeviceDefault_Light_NoActionBar);
    }
    super.onCreate(savedInstanceState);

  }

Благодаря этому вы также сможете увидеть строку состояния, окрашенную для версий >= леденец.

person Vaibhav Sharma    schedule 14.10.2016
comment
Правильный ответ! Но не нужно проверять Build.Version, просто используйте AppTheme по умолчанию. ‹style name=AppTheme parent=Theme.AppCompat.Light.DarkActionBar› setStyle(STYLE_NO_TITLE, R.style.AppTheme); - person maXp; 04.08.2017

На DialogFragment работает следующее. В onCreateView() добавить следующее

getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE); 

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    //…
    getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
    //…
    return view;
}
person Sattar Hummatli    schedule 13.07.2016

Я ответил на этот вопрос с объяснением, что это самый короткий и эффективный способ. Пожалуйста, проверьте в этой теме

Надеюсь это поможет :)

person Biswajit    schedule 26.06.2017

Чтобы иметь полноэкранный диалог, вам нужно использовать

public class CustomDialogFragment extends DialogFragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
        // Inflate the layout to use as dialog or embedded fragment
        return inflater.inflate(R.layout.purchase_items, container, false);
    }


    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        Dialog dialog = super.onCreateDialog(savedInstanceState);
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        return dialog;
    }
}

И чтобы показать этот диалог:

CustomDialogFragment newFragment = new CustomDialogFragment();
FragmentManager fragmentManager = getSupportFragmentManager();
// To make it fullscreen, use the 'content' root view as the container
// for the fragment, which is always the root view for the activity
fragmentManager.beginTransaction().add(android.R.id.content, newFragment).commit();

ВНИМАНИЕ: вы не можете использовать следующий код для отображения диалогового окна, в противном случае диалоговое окно будет отображаться в центре экрана, а не на весь экран.

//don't show dialog like this
newFragment.show(fragmentManager, "dialog");
person loic    schedule 08.09.2016
comment
Неправильный ответ! Потому что вы запускаете простой фрагмент, а не диалоговый режим! - person maXp; 04.08.2017