Как сделать ширину DialogFragment равной Fill_Parent

100

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

public class AddNoteDialogFragment extends DialogFragment {

    public AddNoteDialogFragment() {
        // Empty constructor required for DialogFragment
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        getDialog().setTitle(getString(R.string.app_name));
        View view = inflater.inflate(R.layout.fragment_add_note_dialog,
                container);

        return view;
    }


    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        Dialog dialog = super.onCreateDialog(savedInstanceState);

        // request a window without the title
        dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);

        return dialog;
    }
}

fragment_add_note_dialog.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:background="@android:color/white"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin" >

    <EditText
        android:id="@+id/addNoteEditText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="top"
        android:hint="@string/clock_enter_add_note"
        android:imeOptions="actionDone"
        android:inputType="textCapSentences|textMultiLine"
        android:lines="5" />

    <Button
        android:id="@+id/submit"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:background="@drawable/login_button"
        android:text="@string/submit_button"
        android:textColor="@android:color/white" />

</LinearLayout>

N Sharma
источник
3
Фактически, тот же самый макет с использованием RelativeLayout отображается очень хорошо. Я не объясняю это, хотя ...
Дэн Чалтиэль

Ответы:

157

Это решение, которое я придумал для решения этой проблемы:

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

Редактировать:

Вы можете использовать приведенный ниже код в onCrateViewметоде Fragment перед возвратом расширенного представления.

getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));
спасти население
источник
3
Вы можете просто позвонитьdialog.getWindow().setBackgroundDrawable(null);
edwardaa
если для него установлено значение null, он не будет прозрачным ... только черным, в 4.0.4
Жоао Поло,
17
Для меня это работает, если я getDialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);вставлю onResume()метод DialogFragment . По onCreateView()методу не вышло. Я немного изменил ответ с dialogна getDialog().
Рок Ли
2
setLayoutв onStartметоде работает отлично. Спасибо.
wonsuc
82

Вы пробовали использовать ответ Элвиса из книги Как заставить диалоговое окно предупреждения заполнять 90% размера экрана ?

Это следующее:

dialog.getWindow().setLayout(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);

Обновить:

Вышеупомянутый код должен быть добавлен внутри onStart()метода DialogFragment.

EpicPandaForce
источник
4
Какие LayoutParams вы импортировали?
ymerdrengene
1
@ymerdrengene На самом деле очень хороший вопрос. Попробуй WindowManager.LayoutParams.FILL_PARENT.
EpicPandaForce
2
@ymerdrengene, хотя технически все они просто наследуют это значение ViewGroup.LayoutParams, так что в любом случае он работает отлично.
EpicPandaForce
1
Как упоминалось здесь stackoverflow.com/a/15279400/1641882, я бы предложил переместить этот код вonCreateDialog
Ishan
1
import android.view.WindowManager;
Кирти 08
53

Это сработало для меня

Создайте свой собственный стиль:

   <style name="DialogStyle" parent="Base.Theme.AppCompat.Dialog">
    <item name="android:windowMinWidthMajor">97%</item>
    <item name="android:windowMinWidthMinor">97%</item>
   </style>

Вы также можете попробовать использовать правильного родителя для соответствия другим вашим диалогам. например parent="ThemeOverlay.AppCompat.Dialog"и так далее.

Используйте этот стиль в своем диалоге

public class MessageDialog extends DialogFragment {

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

// your code 
}
Кишан Вагела
источник
3
красивое решение с <item name = "android: windowBackground"> ​​@ null </item>.
Евгений Синицкий
1
позаботьтесь об использовании правильного родителя для соответствия другим вашим диалогам. в моем случае это был ThemeOverlay.AppCompat.Dialog
quealegriamasalegre
31

Для меня это сработало, когда я заменил родительский элемент LinearLayout макета, созданного в onCreateView, на RelativeLayout. Никаких других изменений кода не требуется.

AA_PV
источник
6
Типичный, всегда самый непопулярный ответ о переполнении стека решает мою проблему. Спасибо
busuu
1
Мне очень понравился этот ответ, но разве не причина, по которой он работает только для относительного макета?
Пратик Гупта,
19
    <!-- A blank view to force the layout to be full-width -->
    <View
        android:layout_width="wrap_content"
        android:layout_height="1dp"
        android:layout_gravity="fill_horizontal" />

в верхней части моего диалогового окна сделали свое дело.

RJ M
источник
3
У меня это работает, и мне нравится, что нам не нужно ничего добавлять в код, но мне интересно, почему это работает ...
shela
Невероятно, но это единственное, что у меня сработало. Кастомного стиля не было.
Magnus W
19
public class FullWidthDialogFragment extends AppCompatDialogFragment {
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setStyle(DialogFragment.STYLE_NORMAL, R.style.Theme_AppCompat_Light_Dialog_Alert);
    }
}

и если вы хотите большей гибкости, можете расширить AppCompat_Dialog_Alert и настраиваемые атрибуты

Мехрдад Фараджи
источник
12

На основе других решений я создал свое.

<style name="AppTheme.Dialog.Custom" parent="Theme.AppCompat.Light.Dialog.Alert">
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowMinWidthMajor">100%</item>
    <item name="android:windowMinWidthMinor">100%</item>
</style>
abstract class BaseDialogFragment : DialogFragment() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setStyle(DialogFragment.STYLE_NO_TITLE, R.style.AppTheme_Dialog_Custom)
    }
}
Владислав Стариков
источник
11

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

    @Override
    public void onStart() {
        super.onStart();
        getDialog().getWindow().setLayout(LayoutParams.MATCH_PARENT, (int) getResources().getDimension(R.dimen.dialog_height));
    }
}

Но на некоторых устройствах 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;
}
goRGon
источник
2
Это должен быть принятый ответ! Сэкономил мне столько времени! Фон окна сделал свое дело.
Каран
11

Я хочу прояснить это. Оба пути верны , но с другим DialogFragment .

С помощью 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);
}
Хемрадж
источник
В основном мне нужна была полная ширина, и это сработало. Благодарность!
sud007
4

Еще одно решение, которое работало для меня без побочных эффектов, было:

В вашем классе, расширяющем DialogFragment:

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

    setStyle(DialogFragment.STYLE_NO_TITLE, R.style.DialogStyle);
}

В ваших стилях:

<style name="DialogStyle" parent="ThemeOverlay.AppCompat.Dialog.Alert"></style>
Джозиэль Новаес
источник
вы можете напрямую использовать тему предупреждений вsetStyle()
Sony
4

У меня это отлично работает.

android:minWidth="300dp"

Таким образом вы можете задать ширину диалоговому окну Fragment.

Nouman Ch
источник
2

User AlertDialog.Builder внутри вашего DialogFragment. Добавьте это в onCreateDialogметод, подобный этому. И onCreateViewничего не делать.

public Dialog onCreateDialog(Bundle savedInstanceState)
{

    AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
    View view = LayoutInflater.from(getContext()).inflate(R.layout.gf_confirm_order_timeout_dialog, null);
    final Bundle args = getArguments();
    String message = args.getString(GfConstant.EXTRA_DATA);
    TextView txtMessage = (TextView) view.findViewById(R.id.txt_message);
    txtMessage.setText(message);

    view.findViewById(R.id.btn_confirm).setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            if (mListener != null)
            {
                mListener.onDialogConfirmOK();
            }
        }
    });
    builder.setView(view);
    Dialog dialog = builder.create();
    dialog.setCanceledOnTouchOutside(false);
    dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
    return dialog;
}
Сон Нгуен Тхань
источник
2

Создайте собственный стиль в файле style.xml. Просто скопируйте и вставьте этот код в свой файл style.xml.

<style name="CustomDialog" parent="@android:style/Theme.Holo.Light" >
    <item name="android:windowBackground">@null</item>
    <item name="android:windowIsFloating">true</item>
</style>

Затем в методе createDialog вашего DialogFragment создайте объект диалога с помощью кода

 dialog = new Dialog(getActivity(), R.style.CustomDialog);

Это работает для меня и надеюсь, что это тоже поможет вам

Emilpmp
источник
Мне пришлось добавить к стилю следующее, чтобы он работал у меня: <item name = "android: windowMinWidthMajor"> 100% </item> <item name = "android: windowMinWidthMinor"> 100% </item>
Arnout
2

Вот как я решил, когда столкнулся с этой проблемой. Попробуй это.

в своем DialogFragment onActivityCreated добавьте этот код в соответствии с вашими потребностями ....

 @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        myview=inflater.inflate(R.layout.fragment_insurance_detail, container, false);
        intitviews();
        return myview;
    }
    @Override
    public void onActivityCreated(Bundle arg0) {
        super.onActivityCreated(arg0);
        getDialog().getWindow().getAttributes().windowAnimations = R.style.DialogAnimation;
        getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
        getDialog().getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        getDialog().getWindow().setGravity(Gravity.CENTER);
    }
Шэрон Джоши
источник
1

используйте это в методе onCreateView DialogFragment

    Display display = getActivity().getWindowManager().getDefaultDisplay();
    int width = display.getWidth();
    int px = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, **220**, getResources().getDisplayMetrics());
    getDialog().getWindow().setLayout(width,px);

220 - высота фрагмента диалога, меняйте ее по своему желанию

Саид-Рз
источник
1

в корне вашего макета установите android: minWidth на очень большое значение, например

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

   ...

</LinearLayout>
heeleeaz
источник
0

Я попробовал несколько ответов, перечисленных выше; они не работали на меня. Это решение моей проблемы:

В DialogFragment(), добавить коды ниже:

override fun onResume() {
    super.onResume()
    if (showsDialog) {
        val width = ViewGroup.LayoutParams.MATCH_PARENT
        val height = ViewGroup.LayoutParams.WRAP_CONTENT
        dialog?.window?.apply {
            setBackgroundDrawable(ColorDrawable(Color.WHITE))
            attributes.gravity = Gravity.BOTTOM
            setLayout(width, height)
        }
    }
}
Эрик Сен
источник
0

вариант 1. добавить следующий код в oncreate in activity

 getDialog().getWindow()
         .setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT);

или вы можете создать собственный стиль для диалога

<style name="CustomDialog" parent="AppTheme" >
  <item name="android:windowNoTitle">true</item>
  <item name="android:windowFullscreen">true</item>
  <item name="android:windowIsFloating">true</item>
  <item name="android:windowCloseOnTouchOutside">true</item>
</style>
then use that style in dialog fragment
@Override public void onCreate(@Nullable Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setStyle(DialogFragment.STYLE_NORMAL, R.style.CustomDialog);
}

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

SampleDialogFragment sampleDialogFragment = new SampleDialogFragment();
SampleDialogFragment.show(getActivity().getSupportFragmentManager(), "sometag");

ИЛИ вы попробуйте следующий код в стиле, который вам поможет

<item name="android:windowBackground">@null</item>

Решение 2. dialog.window.setLayout

class TestDialog : DialogFragment() {

    override fun onStart() {
        super.onStart()

        dialog?.window?.setLayout(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT)
    }

}
Humayoon Siddique
источник