DialogFragment 너비를 Fill_Parent로 만드는 방법


95

DialogFragment대화 상자를 표시하는 데 사용하는 Android 응용 프로그램에서 작업 중이지만 너비가 매우 작습니다. 이 너비를 어떻게 만들 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을 사용하는 똑같은 레이아웃이 매우 잘 표시됩니다. 나는 ... 그 생각을 설명하지 않습니다
댄 Chaltiel에게

답변:


154

이것이이 문제를 처리하기 위해 알아 낸 해결책입니다.

@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);위해 DialogFragment의 onResume()메서드를 넣으면 작동합니다 . onCreateView()방법에서 작동하지 않았습니다 . 나는 대답을에서 dialog으로 약간 수정 했습니다 getDialog().
락 리

2
setLayoutonStart방법 에서 완벽하게 작동합니다. 감사.
wonsuc

78

경고 대화 상자를 화면 크기의 90 %로 채우는 방법 의 Elvis 답변을 사용해 보셨습니까 ?

다음과 같습니다.

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

9
이 코드가 onStart작동하려면 DialogFragment 의 메서드에 있어야합니다.
Eborbob

1
여기에서 언급했듯이 stackoverflow.com/a/15279400/1641882 이 코드를 이동하는 것이 좋습니다onCreateDialog
Ishan

52

이것은 나를 위해 일했습니다.

나만의 스타일 만들기 :

   <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

29

나를 위해 onCreateView에서 부풀린 레이아웃의 LinearLayout 부모를 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

10

나는 이것을 명확히하고 싶다. 두 가지 방법 모두 옳지 만 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()
소니

3

이것은 나를 위해 완벽하게 작동합니다.

android:minWidth="300dp"

이를 통해 대화 Fragment에 너비를 지정할 수 있습니다.


2

DialogFragment 내부의 사용자 AlertDialog.Builder. 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>

그런 다음 DialogFragment의 createDialog 메서드에서 코드로 대화 개체를 만듭니다.

 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

DialogFragment의 onCreateView 메서드에서 이것을 사용하십시오.

    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)
        }
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.