Cách tạo chiều rộng DialogFragment thành Fill_Parent


95

Tôi đang làm việc trên một ứng dụng Android mà tôi đang sử dụng DialogFragmentđể hiển thị hộp thoại nhưng chiều rộng của nó rất nhỏ. Làm thế nào tôi có thể làm cho chiều rộng này fill_parentđến nó?

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

segment_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
Trên thực tế, cùng một bố cục sử dụng RelativeLayout đang hiển thị rất tốt. Tôi không giải thích rằng mặc dù ...
Dan Chaltiel

Câu trả lời:


154

Đây là giải pháp tôi đã tìm ra để xử lý vấn đề này:

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

Biên tập:

Bạn có thể sử dụng đoạn mã dưới đây trong onCrateViewphương thức Fragment trước khi trả về chế độ xem tăng cao.

getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));

3
Bạn chỉ có thể gọidialog.getWindow().setBackgroundDrawable(null);
edwardaa

nếu nó setted để null, nó không được minh bạch ... chỉ có màu đen, trên 4.0.4
Joao Polo

17
Đối với tôi, nó hoạt động nếu tôi đặt phương thức getDialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);của DialogFragment onResume(). Nó không hoạt động trên onCreateView()phương pháp. Tôi đã sửa đổi câu trả lời một chút từ dialogthành getDialog().
Rock Lee

2
setLayouttrong onStartphương pháp hoạt động hoàn hảo. Cảm ơn.
wonsuc

78

Bạn đã thử sử dụng câu trả lời của Elvis từ Cách tạo hộp thoại cảnh báo lấp đầy 90% kích thước màn hình chưa?

Nó là như sau:

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

Cập nhật:

Mã trên nên được thêm vào bên trong onStart()phương thức của DialogFragment.


4
Bạn đã nhập LayoutParams nào?
ymerdrengene

1
@ymerdrengene Thực ra câu hỏi rất hay. Cố gắng WindowManager.LayoutParams.FILL_PARENT.
EpicPandaForce

2
@ymerdrengene mặc dù về mặt kỹ thuật, tất cả chúng đều chỉ kế thừa giá trị này từ đó ViewGroup.LayoutParams, vì vậy nó hoạt động hoàn toàn tốt theo cách nào đó.
EpicPandaForce

9
Mã này cần phải nằm trong onStartphương thức của DialogFragment để hoạt động.
Eborbob

1
Như đã đề cập ở đây stackoverflow.com/a/15279400/1641882, tôi khuyên bạn nên chuyển mã này sangonCreateDialog
Ishan

52

Điều này làm việc cho tôi

Tạo phong cách tùy chỉnh của bạn:

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

Bạn cũng có thể thử sử dụng phụ huynh phù hợp để khớp với các hộp thoại khác của mình. ví dụ parent="ThemeOverlay.AppCompat.Dialog"và như vậy.

Sử dụng kiểu này trong hộp thoại của bạn

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
giải pháp tuyệt vời với <item name = "android: windowBackground"> ​​@ null </item>.
Evgeny Sinitsky

1
hãy cẩn thận để sử dụng phụ huynh phù hợp để khớp với các hộp thoại khác của bạn. trong trường hợp của tôi, đó là ThemeOverlay.AppCompat.Dialog
quealegriamasalegre

29

Đối với tôi, nó hoạt động khi tôi thay thế cha mẹ LinearLayout của bố cục được thổi phồng trong onCreateView bằng RelativeLayout. Không cần thay đổi mã khác.


6
Câu trả lời điển hình, luôn không phổ biến nhất về tràn ngăn xếp giải quyết được vấn đề của tôi. Cảm ơn
busuu 27/07/17

1
Tôi thích câu trả lời này rất nhiều nhưng không phải lý do tại sao nó chỉ hoạt động cho bố cục tương đối?
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" />

ở trên cùng của bố cục hộp thoại của tôi đã thực hiện thủ thuật.


3
Công trình này đối với tôi, và tôi như vậy nó không yêu cầu chúng tôi để thêm bất cứ điều gì thêm trong mã, nhưng tôi đang tự hỏi tại sao nó hoạt động ...
Shela

Thật kinh ngạc, đây là điều duy nhất có hiệu quả với tôi. Phong cách tùy chỉnh không.
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);
    }
}

và nếu bạn muốn linh hoạt hơn, có thể mở rộng AppCompat_Dialog_Alert và các thuộc tính tùy chỉnh


12

Dựa trên các giải pháp khác, tôi đã tạo ra của riêng mình.

<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

Trong trường hợp của tôi, tôi cũng đã sử dụng cách tiếp cận sau:

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

Nhưng vẫn có những khoảng trống nhỏ giữa các cạnh trái, phải của hộp thoại và các cạnh màn hình trên một số thiết bị Lollipop + (ví dụ: Nexus 9).

Nó không rõ ràng nhưng cuối cùng tôi đã phát hiện ra rằng để làm cho nó có chiều rộng đầy đủ trên tất cả các thiết bị và nền tảng, nền cửa sổ nên được chỉ định bên trong styles.xml như sau:

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

Và tất nhiên kiểu này cần được sử dụng khi chúng ta tạo hộp thoại như sau:

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

2
Đây phải là câu trả lời được chấp nhận! Đã tiết kiệm cho tôi rất nhiều thời gian! Nền cửa sổ đã thực hiện thủ thuật.
Karan

10

Tôi muốn làm rõ điều này. Cả hai cách đều đúng, Nhưng với DialogFragment khác nhau .

Sử dụng 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);
    }
}

Sử dụng 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);
}

Về cơ bản, tôi cần chiều rộng đầy đủ và điều này đã hoạt động. Cảm ơn!
sud007

4

Một giải pháp khác hiệu quả với tôi mà không có tác dụng phụ là:

Trong lớp mở rộng DialogFragment của bạn:

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

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

Theo phong cách của bạn:

<style name="DialogStyle" parent="ThemeOverlay.AppCompat.Dialog.Alert"></style>

bạn có thể trực tiếp sử dụng các chủ đề cảnh báo trongsetStyle()
Sony

3

Điều này làm việc cho tôi một cách hoàn hảo.

android:minWidth="300dp"

Thông qua đó, bạn có thể cung cấp chiều rộng cho Fragment hộp thoại.


2

User AlertDialog.Builder bên trong DialogFragment của bạn. Thêm nó vào onCreateDialogphương pháp như thế này. Và onCreateViewkhông làm gì cả.

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

Tạo kiểu tùy chỉnh trong tệp style.xml của bạn. Chỉ cần sao chép, dán mã này vào tệp style.xml của bạn

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

Sau đó, trong phương thức createDialog của DialogFragment, hãy tạo đối tượng hộp thoại bằng mã

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

Điều này đang làm việc cho tôi và hy vọng điều này cũng sẽ giúp bạn


Tôi phải thêm phần sau vào kiểu để làm cho nó hoạt động với tôi: <item name = "android: windowMinWidthMajor"> 100% </item> <item name = "android: windowMinWidthMinor"> 100% </item>
Arnout

2

Đây là cách tôi giải quyết khi gặp vấn đề này. Thử cái này.

trong onActivityCreate của DialogFragment, Thêm mã này theo nhu cầu của bạn ....

 @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

sử dụng điều này trong phương thức onCreateView của 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 là chiều cao của đoạn hộp thoại, hãy thay đổi nó theo ý bạn muốn


1

trong gốc bố cục của bạn, hãy đặt android: minWidth thành một giá trị rất lớn, ví dụ:

<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

Tôi đã thử nhiều câu trả lời được liệt kê ở trên; họ không làm việc cho tôi. Đây là giải pháp cho vấn đề của tôi:

Trong DialogFragment(), hãy thêm các mã bên dưới:

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)
        }
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.