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


165

Я пытаюсь показать почти полноэкранный DialogFragment. Но я как-то не в состоянии это сделать.

То, как я показываю фрагмент, прямо из документации разработчика Android

FragmentManager f = ((Activity)getContext()).getFragmentManager();
FragmentTransaction ft = f.beginTransaction();
Fragment prev = f.findFragmentByTag("dialog");
if (prev != null) {
    ft.remove(prev);
}
ft.addToBackStack(null);

// Create and show the dialog.
DialogFragment newFragment = new DetailsDialogFragment();
newFragment.show(ft, "dialog");

Я знаю, наивно пытался установить RelativeLayout во фрагменте для fill_parent и некоторых minWidth и minHeight.

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"  
    android:minWidth="1000px" 
    android:minHeight="600px"
    android:background="#ff0000">

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

Я также попытался установить атрибуты окна в коде, как предложено здесь: http://groups.google.com/group/android-developers/browse_thread/thread/f0bb813f643604ec . Но это тоже не помогло.

Я, вероятно, неправильно понимаю что-то о том, как Android обрабатывает диалоги, так как я новичок в этом. Как я могу сделать что-то подобное? Есть ли альтернативные способы достижения моей цели?


Android-устройство:
Asus EeePad Transformer
Android 3.0.1


Обновление: теперь мне удалось получить его в полноэкранном режиме со следующим кодом во фрагменте

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setStyle(STYLE_NO_FRAME, android.R.style.Theme_Holo_Light);
}

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

Есть идеи, как этого добиться?



Ты экономишь мое время, тызм
Мани

Ответы:


73

Попробуйте переключиться на LinearLayoutвместо RelativeLayout. Я тестировал 3.0 Honeycomb API при тестировании.

public class FragmentDialog extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Button button = (Button) findViewById(R.id.show);
    button.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            showDialog();
        }
    });
}

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
}

void showDialog() {
    FragmentTransaction ft = getFragmentManager().beginTransaction();
    DialogFragment newFragment = MyDialogFragment.newInstance();
    newFragment.show(ft, "dialog");
}

public static class MyDialogFragment extends DialogFragment {

    static MyDialogFragment newInstance() {
        MyDialogFragment f = new MyDialogFragment();
        return f;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_dialog, container, false);
        return v;
    }

}
}

и макеты : фрагмент_диалог.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:minWidth="1000dp"  
    android:minHeight="1000dp"> 
 </LinearLayout> 

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"
    android:background="#ffffff">
    <Button android:id="@+id/show"
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"
        android:layout_weight="0"
        android:text="show">
    </Button>
</LinearLayout>

И для меня мне нужно было использовать RelativeLayout, но ширина диалога не корректировалась должным образом к содержимому, поэтому я вложил RelativeLayout в LinearLayout, единственным дочерним элементом которого был RelativeLayout ... это вызвало правильные настройки ширины.
Питер Айтай

1
Я проверил все, но могу подтвердить, что единственное, что сработало для моего DialogFragment, - это завершение всего макета в LinearLayout. Таким образом, я мог установить ширину и высоту моего (теперь обернутого) оригинального макета ... потраченные впустую часы на этом
до

6
Установка minWidth и minHeight на что-то большое кажется важной частью; но это взлом вместо чистого решения. Ответ, данный @David ниже - объясненный далее в ссылке, которую он дает - также работает и является чистым.
Гарлеф Вегарт,

@ tir38 Я не думаю, что это правда, потому что onCreateDialog () уже имеет реализацию в суперклассе.
starkej2

Это должен быть принятый ответ. Разработано и ясно
mutiemule

179

Вывести DialogFragment на весь экран

Переопределите onStartваш DialogFragment следующим образом:

@Override
public void onStart()
{
    super.onStart();
    Dialog dialog = getDialog();
    if (dialog != null)
    {
        int width = ViewGroup.LayoutParams.MATCH_PARENT;
        int height = ViewGroup.LayoutParams.MATCH_PARENT;
        dialog.getWindow().setLayout(width, height);
    }
}

И большое спасибо за этот пост: тайны андроидов-полноэкранные диалоги-фрагменты


6
Именно это работает, но я пытался с Videoview, и это не работает для этого. StatusBar все еще показывает. Так что это исправило меня ниже кода: dialog.getWindow (). SetFlags (WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
WhiteHorse

1
наконец разобраться, спасибо за предложение @David
Ашу Кумар

1
Это хорошо сработало для меня. Я использовал ViewGroup.LayoutParams.WRAP_CONTENTдля высоты. Спасибо.
ошеломлен

1
это чисто и не
хакерски

7
это не работает для моего случая .. это показывает некоторые отступы со всех углов. любая помощь?
Абдул Вахид

144
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setStyle(DialogFragment.STYLE_NORMAL,
             android.R.style.Theme_Black_NoTitleBar_Fullscreen);
}

7
Единственное решение, которое, казалось, сработало для меня. Другие иногда работали, иногда нет. Будем надеяться, что я тоже не найду исключения из этого :)
azertiti

12
Это работает и для меня. Если вы хотите, чтобы фон был прозрачным, вы должны использовать '' 'android.R.style.Theme_Translucent_NoTitleBar' ''
acntwww

2
Ключ передает STYLE_NORMAL. Это делает диалог, чтобы заполнить экран, как и любой другой вид деятельности. Мы можем использовать любую тему. Для дизайна материала вы можете получить тему материала (например, Theme.AppCompat.NoActionBar, которая сохраняет оформление системы, но удаляет панель действий).
rpattabi

2
Ха-ха, когда я запустил, появился черный экран, и я подумал, что он завис. Затем я изменил тему на Theme_Light_NoTitleBar_Fullscreen. Спасибо, диалог занимает весь экран (включая строку состояния).
CoolMind

1
Theme_DeviceDefault_Light_NoActionBar_Fullscreen fow диалог с белым фоном.
Хитеш Саху

45

По этой ссылке DialogFragment в полноэкранном режиме показывает отступы по бокам, это будет работать как шарм.

@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.TRANSPARENT));
    dialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);

    return dialog;
}

4
Отлично работает даже в 2018 году! (больше ничего не делал) Спасибо.
Автономные приложения

2
Это идеальный ответ даже в Android Studio 3.1+ в 2018 году, здесь лучше других ответов. Другой ответ сломает пользовательский интерфейс Android, такой как просмотр карт, счетчик и т. Д.
Тауфик Нур Рахманда

1
Работает очаровательно в 2020 году!
Юэ Инь

Работает, но если вы хотите определить поля в макете XML, вам придется обернуть свои представления другим макетом, в противном случае поля будут игнорироваться.
Фелипе Рибейро Р. Магальес

30

Сделайте полноэкранный DialogFragment, используя только стиль

Первое решение

** 1. Добавьте к своему `style.xml`: **
    <style name="FullScreenDialog" parent="Theme.AppCompat.Light.Dialog">
        <item name="android:backgroundDimEnabled">false</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:padding">0dp</item>
        <item name="android:windowIsFloating">false</item>
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:windowCloseOnTouchOutside">false</item>
    </style>

2. Добавьте в свой DialogFragment:

@Override
public int getTheme() {
    return R.style.FullScreenDialog;
}

Альтернативное решение

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    setStyle(DialogFragment.STYLE_NO_FRAME, R.style.FullScreenDialog)
}

Это более элегантный способ, чем ответ Брэдли4.
MeLine

идеальное решение в одну строку
me_

Оба решения работали, но первое вызвало ошибку при всплывающем окне буфера обмена. Альтернатива отлично работает
Януш Хайн

18

В моем случае я использовал следующий подход:

    @Override
    public void onStart() {
        super.onStart();
        getDialog().getWindow().setLayout(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
    }
}

Плюс LinearLayout, чтобы заполнить все пространство контентом.

Но на некоторых устройствах Lollipop + (например, Nexus 9) все еще были небольшие промежутки между левым и правым краями диалога и краями экрана.

Это было неочевидно, но в конце концов я понял, что для обеспечения его полной ширины на всех устройствах и платформах фон окна должен быть указан внутри styles.xml, как показано ниже:

<style name="Dialog.NoTitle" parent="Theme.AppCompat.Dialog">
    <item name="android:windowNoTitle">true</item>
    <item name="android:padding">0dp</item>
    <item name="android:windowBackground">@color/window_bg</item>
</style>

И, конечно, этот стиль необходимо использовать при создании диалога, подобного следующему:

    public static DialogFragment createNoTitleDlg() {
        DialogFragment frag = new Some_Dialog_Frag();
        frag.setStyle(DialogFragment.STYLE_NO_TITLE, R.style.Dialog_NoTitle);
        return frag;
}

Это ответ. Прекрасно работает.
VonSchnauzer

2
Я перепробовал большинство ответов в этой теме, некоторые сработали, но я потерял все стили своих тем для приложения. Я надеялся, что это сработает, поскольку родительской темой был AppCompat. Это почти сработало. Для меня мне пришлось добавить 2 дополнительных стиля: <item name="android:windowFullscreen">true</item> <item name="android:windowIsFloating">false</item> Источник: TechRepublic
Breeno

15

Я сталкивался с этой проблемой раньше, когда использовал полноэкранный dialogFragment: всегда есть заполнение при настройке полноэкранного режима. попробуйте этот код в методе onActivityCreated () dialogFragment:

public void onActivityCreated(Bundle savedInstanceState)
{   
    super.onActivityCreated(savedInstanceState);
    Window window = getDialog().getWindow();
    LayoutParams attributes = window.getAttributes();
    //must setBackgroundDrawable(TRANSPARENT) in onActivityCreated()
    window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
    if (needFullScreen)
    {
        window.setLayout(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
    }
}

Работает, другие решения меняют тему кнопок и других элементов фрагмента.
Йондри

11

Начиная с обновления Android API, предлагаемый способ отображения полноэкранного диалогового окна заключается в следующем:

FragmentTransaction transaction = this.mFragmentManager.beginTransaction();
// For a little polish, specify a transition animation
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
// To make it fullscreen, use the 'content' root view as the container
// for the fragment, which is always the root view for the activity
transaction.add(android.R.id.content, this.mFragmentToShow).commit();

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

this.mFragmentToShow.show(this.mFragmentManager, LOGTAG);

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

РЕДАКТИРОВАТЬ

Знайте, что решение, которое я дал, работает, но имеет слабость, которая иногда может быть неприятной. Добавление DialogFragment в android.R.id.contentконтейнер не позволит вам правильно обрабатывать эту DialogFragment#setCancelable()функцию и может привести к неожиданным действиям при добавлении самого DialogFragment в задний стек.

Поэтому я предложил вам просто изменить стиль вашего DialogFragment в методе onCreate следующим образом:

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setStyle(DialogFragment.STYLE_NORMAL, android.R.style.Theme_Translucent_NoTitleBar);
}

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


1
Я согласен. Вот полное объяснение из руководства разработчика Android: ссылка
user2274431

10

Попробуйте использовать setStyle () в onCreate и переопределить onCreateDialog сделать диалог без заголовка

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);    
    setStyle(DialogFragment.STYLE_NORMAL, android.R.style.Theme);        
}

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

или просто переопределите onCreate () и setStyle вместе с кодом.

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);    
    setStyle(DialogFragment.STYLE_NO_TITLE, android.R.style.Theme);        
}

8

Это может действительно зависеть от того, как определен макет. Но чтобы гарантировать, что диалоговое окно приобретает требуемый размер, наилучшим решением является предоставление LayoutParams, как только диалоговое окно отображается (а не при создании). В DialogFragment диалоговое окно отображается для метода onStart , поэтому допустимый метод для получения полной ширины:

@Override public void onStart() {
    super.onStart();
    Dialog d = getDialog();
    if (d!=null){
        d.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
    }
}

Чтобы также предоставить тему или стиль, например стиль NO_TITLE, наилучшее расположение находится в методе onCreate :

@Override public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setStyle(STYLE_NO_TITLE, android.R.style.Theme_Holo_Light_Dialog);
}

7

Примечание : Даже здесь можно найти правильный ответ. Но я хочу уточнить путаницу.

Используйте ниже код для android.app.DialogFragment

@Override
public void onStart()
{
    super.onStart();
    Dialog dialog = getDialog();
    if (dialog != null)
    {
        int width = ViewGroup.LayoutParams.MATCH_PARENT;
        int height = ViewGroup.LayoutParams.MATCH_PARENT;
        dialog.getWindow().setLayout(width, height);
    }
}

Используйте ниже код для android.support.v4.app.DialogFragment

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setStyle(DialogFragment.STYLE_NORMAL, android.R.style.Theme_Black_NoTitleBar_Fullscreen);
}

6

И версия котлин!

override fun onStart() {
    super.onStart()
    dialog?.let {
        val width = ViewGroup.LayoutParams.MATCH_PARENT
        val height = ViewGroup.LayoutParams.MATCH_PARENT
        it.window?.setLayout(width, height)
    }
}

1
Это действительно работает! Также я хочу добавить, что разработчик должен обернуть содержимое диалога прозрачным FrameLayout, чтобы избежать деформации содержимого.
Георгий Чеботарев

4

Вот решение, как я понял эту проблему:

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    Dialog dialog = super.onCreateDialog(savedInstanceState);    
    dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);   

    return dialog;
}

@Override
public void onStart() {
    super.onStart();
    Dialog dialog = getDialog();
    if (dialog != null) {
            dialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
            dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
    }
}

3

Создайте тему ниже в вашем style.xml:

<style name="DialogTheme" parent="Theme.AppCompat.Light.DarkActionBar">
   <item name="android:paddingRight">0dp</item>
   <item name="android:paddingLeft">0dp</item>
   <item name="android:layout_width">match_parent</item>
   <item name="android:windowNoTitle">true</item>
</style>

затем установите стиль в DialogFragment

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStyle(DialogFragment.STYLE_NO_TITLE, R.style.DialogTheme);
}

2

Чираг Нагария прав, кроме дополнения «_Fullscreen». это может быть решено с использованием любого базового стиля, который не является производным от стиля диалога. 'android.R.style.Theme_Black_NoTitleBar' также может быть использован.


1

В случае, если кто-то еще сталкивался с этим, у меня был подобный опыт, но оказалось, что проблема заключалась в том, что я забыл вернуть раздутое представление из onCreateView (вместо этого возвращая стандартный super.onCreateView). Я просто вернул правильное раздутое представление, и это решило проблему.


1
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    Dialog dialog = new Dialog(getActivity(), android.R.style.Theme_Holo_Light);
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);

    return dialog;
}

Это решение применяет полноэкранную тему в диалоге, которая похожа на setStyle Чирага в onCreate. Недостатком является то, что saveInstanceState не используется.


1

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

public class DialogFragment extends DialogFragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_visit_history_main, container, false);

        getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
        getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
        initializeUI(rootView);
        return rootView;
    }

    @Override
    public void onStart() {
        super.onStart();
        Dialog dialog = getDialog();
        if (dialog != null) {
            int width = ViewGroup.LayoutParams.MATCH_PARENT;
            int height = ViewGroup.LayoutParams.MATCH_PARENT;
            dialog.getWindow().setLayout(width, height);
        }
    }
    private void initializeUI(View rootView) {
    //getChildFragmentManager().beginTransaction().replace(R.id.fv_container,FragmentVisitHistory.getInstance(), AppConstant.FRAGMENT_VISIT_HISTORY).commit();
    }
}

пожалуйста, обратитесь к этому вопросу - stackoverflow.com/questions/45494644/…
Аман Верма

1

Вот что вам нужно установить для фрагмента:

/* theme is optional, I am using leanback... */
setStyle(STYLE_NORMAL, R.style.AppTheme_Leanback);

В твоем случае:

DialogFragment newFragment = new DetailsDialogFragment();
newFragment.setStyle(STYLE_NORMAL, R.style.AppTheme_Leanback);
newFragment.show(ft, "dialog");

И почему? Потому что DialogFragment (если не указано явно), будет использовать свои внутренние стили, которые обернут в него ваш пользовательский макет (без полноэкранного режима и т. Д.).

А макет? Хакерский путь не нужен, это работает просто отлично:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
    ...
</RelativeLayout>

наслаждаться


1

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

Я использовал этот код в своем проекте, он работает как в более низкой версии, так и в более высокой версии.

Просто используйте эту тему внутри onCreateDialog () следующим образом:

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {

    View view = getActivity().getLayoutInflater().inflate(R.layout.dialog_pump_details, null);

    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), android.R.style.Theme_Black_NoTitleBar_Fullscreen);
    return builder.create();
}

android.R.style.Theme_Black_NoTitleBar_Fullscreen - Вот исходный код этой темы, вы можете увидеть, что только этой темы достаточно, чтобы DialogFragment отображался в полноэкранном режиме.

<!-- Variant of {@link #Theme_Black} that has no title bar and
     no status bar.  This theme
     sets {@link android.R.attr#windowFullscreen} to true.  -->
<style name="Theme.Black.NoTitleBar.Fullscreen">
    <item name="windowFullscreen">true</item>
    <item name="windowContentOverlay">@null</item>
</style>

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


Диалог появляется в полноэкранном режиме, но все стало черным, кроме кнопки. любая идея ??
Сагар Наяк

1

Следующий способ будет работать, даже если вы работаете с относительным макетом. Выполните следующие шаги:

  1. Перейдите в редактор тем (доступно в меню Инструменты-> Android -> Редактор тем).
  2. Выберите показать все темы. Выберите один с AppCompat.Dialog
  3. Выберите опцию фона окна Android, если вы хотите, чтобы он имел какой-либо определенный цветной фон или прозрачный.
  4. Выберите цвет и нажмите «ОК». Выберите название новой темы.
  5. Перейдите к styles.xml и затем в только что добавленной теме добавьте эти два атрибута:

    <item name="android:windowNoTitle">true</item>
    <item name="android:windowIsFloating">false</item>

Моя настройка темы для диалога:

<style name="DialogTheme" parent="Theme.AppCompat.Dialog" >
    <item name="android:layout_width">match_parent</item>
    <item name="android:layout_height">match_parent</item>
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowIsFloating">false</item>

Убедитесь, что у темы есть родительский объект под названием Theme.AppCompat.Dialog. Другим способом было бы просто создать новый стиль в styles.xml и изменить его в соответствии с приведенным выше кодом.

  1. Перейдите в свой класс фрагмента диалога и в onCreate () установите стиль своего диалога как:

    @Override public void onCreate (@Nullable Bundle saveInstanceState) {super.onCreate (saveInstanceState); SetStyle (DialogFragment.STYLE_NORMAL, R.style.DialogTheme); }


1

Добавьте следующие строки в стиле полноэкранного диалога.

<item name="android:windowNoTitle">true</item>
    <item name="android:windowFullscreen">true</item>
    <item name="android:windowIsFloating">false</item>

или: переопределить fun onCreate (SavedInstanceState: Bundle?) {super.onCreate (сохраненныйInstanceState) item name = "android: windowIsFloating"> false </ item> </ style>
Filipkowicz

0

window.setLayout недостаточно для старых устройств.

Вот что я делаю:

try {
    ViewGroup parent = (ViewGroup) view;
    do {
        parent = (ViewGroup) parent.getParent();
        if (parent == null)
            break;

        parent.getLayoutParams().height = ViewGroup.LayoutParams.MATCH_PARENT;
        parent.getLayoutParams().width = ViewGroup.LayoutParams.MATCH_PARENT;
        parent.requestLayout();
    } while (true);
} catch (Exception e){}

0
This below answer works for me in fragment dialog.  


  Dialog dialog = getDialog();
        if (dialog != null)
        {
            int width = ViewGroup.LayoutParams.MATCH_PARENT;
            int height = ViewGroup.LayoutParams.MATCH_PARENT;
            dialog.getWindow().setLayout(width, height);
        }

0

Решение с использованием нового ConstraintLayoutзаключается в обёртывании ConstraintLayoutв LinearLayoutс фиксированными minHeight и minWidth. Без упаковки ConstraintLayout не получает правильный размер для диалога.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:minWidth="1000dp"
    android:minHeight="1000dp"
    android:orientation="vertical">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/background_color"
        android:orientation="vertical">
        <!-- some constrained views -->
    </androidx.constraintlayout.widget.ConstraintLayout>

</LinearLayout>

0

Работал для меня в Котлине,

 override fun onActivityCreated(savedInstanceState: Bundle?) {
    super.onActivityCreated(savedInstanceState)

    dialog?.window?.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)

}

0

следующее решение сработало для меня, другое решение дало мне некоторое пространство по бокам, т.е. не на весь экран

Вам нужно внести изменения в метод onStart и onCreate

@Override
public void onStart() {
    super.onStart();
    Dialog dialog = getDialog();
    if (dialog != null)
    {
        int width = ViewGroup.LayoutParams.MATCH_PARENT;
        int height = ViewGroup.LayoutParams.MATCH_PARENT;
        dialog.getWindow().setLayout(width, height);
    }
}


 public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
    final Dialog dialog = new Dialog(requireContext());
    dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
 }


   
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.