วิธีสร้างความกว้าง 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>


3
จริงๆแล้วเค้าโครงเดียวกันโดยใช้ RelativeLayout แสดงได้ดีมาก ฉันไม่อธิบายว่า ...
Dan Chaltiel

คำตอบ:


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

หากตั้งค่าเป็นโมฆะจะไม่โปร่งใส ... มีเพียงสีดำเท่านั้นที่ 4.0.4
Joao Polo

17
สำหรับฉันมันใช้งานได้ถ้าฉันใส่วิธีgetDialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);ของ DialogFragment onResume()มันไม่ได้ผลกับonCreateView()วิธีการนี้ ผมปรับเปลี่ยนคำตอบเล็กน้อยจากการdialog getDialog()
Rock Lee

2
setLayoutในonStartวิธีการทำงานได้อย่างสมบูรณ์ ขอบคุณ.
wonsuc

82

คุณได้ลองใช้คำตอบของ Elvis จากHow to make an alert response to 90% of screen size ?

ดังต่อไปนี้:

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

อัปเดต:

ควรเพิ่มโค้ดด้านบนภายในonStart()วิธีการของไฟล์DialogFragment.


4
คุณนำเข้า LayoutParams ใด
ymerdrengene

1
@ymerdrengene เป็นคำถามที่ดีมากจริงๆ ลองWindowManager.LayoutParams.FILL_PARENT.
EpicPandaForce

2
@ymerdrengene แม้ว่าในทางเทคนิคแล้วพวกเขาทั้งหมดเป็นเพียงการสืบทอดค่านี้จากViewGroup.LayoutParamsดังนั้นจึงทำงานได้ดีอย่างสมบูรณ์แบบไม่ว่าจะด้วยวิธีใดก็ตาม
EpicPandaForce

1
ดังที่กล่าวไว้ที่นี่stackoverflow.com/a/15279400/1641882ฉันขอแนะนำให้ย้ายรหัสนี้ไปที่onCreateDialog
Ishan

1
นำเข้า android.view.WindowManager;
kirti

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

1
ใช้ความระมัดระวังในการใช้ผู้ปกครองที่เหมาะสมเพื่อให้ตรงกับกล่องโต้ตอบอื่น ๆ ของคุณ ในกรณีของฉันมันคือ ThemeOverlay.AppCompat.Dialog
quealegriamasalegre

31

สำหรับฉันมันใช้งานได้เมื่อฉันเปลี่ยนพาเรนต์ LinearLayout ของเลย์เอาต์ที่สูงเกินจริงใน onCreateView โดย RelativeLayout ไม่จำเป็นต้องเปลี่ยนรหัสอื่น ๆ


6
โดยทั่วไปคำตอบที่ไม่เป็นที่นิยมมากที่สุดในสแต็กโอเวอร์โฟลว์ช่วยแก้ปัญหาของฉันได้ ขอบคุณ
busuu

1
ฉันชอบคำตอบนี้มาก แต่ไม่มีเหตุผลว่าทำไมจึงใช้ได้กับเลย์เอาต์แบบสัมพัทธ์เท่านั้น?
Prateek Gupta

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

ที่ด้านบนของเค้าโครงกล่องโต้ตอบของฉันทำเคล็ดลับ


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

2
นี่ควรเป็นคำตอบที่ได้รับการยอมรับ! ช่วยฉันได้มากเวลา! พื้นหลังของหน้าต่างเป็นเคล็ดลับ
Karan

11

ฉันต้องการชี้แจงเรื่องนี้ ทั้งสองวิธีนั้นถูกต้องแต่มี DialogFragment ที่แตกต่างกัน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"

ด้วยวิธีนี้คุณสามารถกำหนดความกว้างให้กับส่วนโต้ตอบ


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

สิ่งนี้ใช้ได้ผลสำหรับฉันและหวังว่านี่จะช่วยคุณได้เช่นกัน


ฉันต้องเพิ่มสิ่งต่อไปนี้ในสไตล์เพื่อให้มันใช้งานได้: <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>

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. เพิ่มรหัสต่อไปนี้ในการสร้างในกิจกรรม

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

}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.