Como tornar a largura de DialogFragment em Fill_Parent

95

Estou trabalhando em um aplicativo Android no qual estou usando DialogFragmentpara exibir a caixa de diálogo, mas sua largura é muito pequena. Como posso fazer essa largura fill_parentpara isso?

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
fonte
3
Na verdade, exatamente o mesmo layout usando RelativeLayout está sendo exibido muito bem. Eu não explico isso ...
Dan Chaltiel

Respostas:

153

Esta é a solução que descobri para lidar com esse problema:

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

Editar:

Você pode usar o código abaixo no onCrateViewmétodo de Fragment antes de retornar a visão inflada.

getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));
savepopulation
fonte
3
Você pode ligar paradialog.getWindow().setBackgroundDrawable(null);
edwardaa
se for nulo, não fica transparente ... só preto, em 4.0.4
João Polo
17
Para mim, funciona se eu colocar getDialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);o onResume()método DialogFragment . Não funcionou no onCreateView()método. Modifiquei ligeiramente a resposta de dialogpara getDialog().
Rock Lee
2
setLayoutno onStartmétodo funciona perfeitamente. Obrigado.
wonsuc
78

Você já tentou usar a resposta de Elvis em Como fazer um diálogo de alerta preencher 90% do tamanho da tela ?

É o seguinte:

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

Atualizar:

O código acima deve ser adicionado dentro do onStart()método do DialogFragment.

EpicPandaForce
fonte
4
Quais LayoutParams você importou?
ymerdrengene
1
@ymerdrengene Pergunta muito boa, na verdade. Experimente WindowManager.LayoutParams.FILL_PARENT.
EpicPandaForce
2
@ymerdrengene embora, tecnicamente, todos eles estejam apenas herdando esse valor ViewGroup.LayoutParams, então funciona perfeitamente de qualquer maneira.
EpicPandaForce
9
Esse código precisará estar no onStartmétodo do DialogFragment para funcionar.
Eborbob
1
Conforme mencionado aqui stackoverflow.com/a/15279400/1641882 , sugiro mover este código paraonCreateDialog
Ishan
51

Isso funcionou para mim

Crie seu estilo personalizado:

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

Use este estilo na sua caixa de diálogo

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 
}
Kishan Vaghela
fonte
3
bela solução com <item name = "android: windowBackground"> ​​@ null </item>.
Evgeny Sinitsky 01 de
1
trabalhando muito bem, muito obrigado
Herman
28

Para mim, funcionou quando substituí o pai LinearLayout do layout inflado em onCreateView por RelativeLayout. Nenhuma outra mudança de código necessária.

AA_PV
fonte
6
Típico, sempre a resposta mais impopular em estouro de pilha resolve meu problema. Obrigado
busuu
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" />

no topo do meu layout de diálogo funcionou.

RJ M
fonte
3
Isso funciona para mim, e eu gosto que não exija que adicionemos nada extra no código, mas estou me perguntando por que funciona ...
shela
Incrivelmente, essa é a única coisa que funcionou para mim. O estilo personalizado não.
Magnus W
18
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);
    }
}

e se você quiser muito mais flexibilidade pode estender AppCompat_Dialog_Alert e atributos personalizados

Mehrdad Faraji
fonte
11

No meu caso, também usei a seguinte abordagem:

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

Mas ainda havia pequenas lacunas entre as bordas esquerda e direita da caixa de diálogo e as bordas da tela em alguns dispositivos Lollipop + (por exemplo, Nexus 9).

Não era óbvio, mas finalmente descobri que, para torná-lo largura total em todos os dispositivos e plataformas , o plano de fundo da janela deve ser especificado em styles.xml como o seguinte:

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

E, claro, esse estilo precisa ser usado quando criamos o diálogo como o seguinte:

    public static DialogFragment createNoTitleDlg() {
        DialogFragment frag = new Some_Dialog_Frag();
        frag.setStyle(DialogFragment.STYLE_NO_TITLE, R.style.Dialog_NoTitle);
        return frag;
}
goRGon
fonte
2
Esta deve ser a resposta aceita! Me economizou muito tempo! O fundo da janela fez o truque.
Karan
11

Com base em outras soluções, criei a minha própria.

<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)
    }
}
Владислав Стариков
fonte
10

Eu quero esclarecer isso. Ambas as formas estão certas, mas com DialogFragment diferente .

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

Usando 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);
}
Khemraj
fonte
Basicamente, eu precisava de largura total e funcionou. Obrigado!
sud007
4

Outra solução que funcionou para mim sem efeitos colaterais foi:

Em sua classe que estende DialogFragment:

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

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

Em seus estilos:

<style name="DialogStyle" parent="ThemeOverlay.AppCompat.Dialog.Alert"></style>
Josiel Novaes
fonte
você pode usar diretamente o tema de alerta emsetStyle()
Sony
3

Isso funciona perfeitamente para mim.

android:minWidth="300dp"

Com isso, você pode dar a largura ao Fragmento de diálogo.

Nouman Ch
fonte
2

Crie um estilo personalizado em seu arquivo style.xml. Basta copiar e colar este código em seu arquivo style.xml

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

Em seguida, no método createDialog de seu DialogFragment, crie o objeto de diálogo pelo código

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

Isso está funcionando para mim e espero que ajude você também

emilpmp
fonte
Tive de adicionar o seguinte ao estilo para fazê-lo funcionar para mim: <item name = "android: windowMinWidthMajor"> 100% </item> <item name = "android: windowMinWidthMinor"> 100% </item>
Arnout
2

Foi assim que resolvi quando enfrentei esse problema. Experimente isso.

no onActivityCreated de seu DialogFragment, adicione este código de acordo com sua necessidade ....

 @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);
    }
Sharon Joshi
fonte
1

use isso no método onCreateView de 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 é a altura do fragmento de diálogo, altere-o como desejar

Saeed-rz
fonte
1

User AlertDialog.Builder dentro de seu DialogFragment. Adicione-o a um onCreateDialogmétodo como este. E onCreateViewnão fazer nada.

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;
}
Son Nguyen Thanh
fonte
1

na raiz do layout, defina android: minWidth com um valor muito grande, por exemplo

<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
fonte
0

Tentei várias respostas listadas acima; eles não funcionaram para mim. Esta é a solução para meu problema:

Em DialogFragment(), adicione os códigos abaixo:

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)
        }
    }
}
Eric Cen
fonte