DialogFragment의 너비와 높이를 설정하는 방법은 무엇입니까?


173

XML 레이아웃 파일 (이라고 부르 자)에서 DialogFragment의 레이아웃을 지정 layout_mydialogfragment.xml하고 그 속성 layout_widthlayout_height속성 (특히 100dp말하자)을 지정하십시오. 그런 다음 DialogFragment의 onCreateView(...)메소드 에서이 레이아웃 을 다음과 같이 팽창시킵니다 .

View view = inflater.inflate(R.layout.layout_mydialogfragment, container, false);

불행히도 내 대화 상자 (DialogFragment)가 나타나면 xml 레이아웃 파일에 지정된 layout_width및을 존중하지 않습니다 layout_height(내 대화 상자는 내용에 따라 다양하게 축소되거나 확장됩니다). 누구나 대화 상자를 XML 레이아웃 파일에서 존중 layout_width하고 layout_height지정할 수 있는지 여부 또는 방법을 알고 있습니까? 현재 DialogFragment의 onResume()메소드에서 다음과 같이 대화 상자의 너비와 높이를 다시 지정해야합니다 ...

getDialog().getWindow().setLayout(width, height);

... 따라서 대화 상자의 너비와 높이를 두 곳에서 변경해야한다는 점을 기억해야합니다.


2
jpmcosta의 답변을 수락하십시오. 그것은 해킹이 아니며 실제로 문제를 해결합니다.
Bogdan Zurac

답변:


168

자원 값에서 직접 변환하는 경우 :

int width = getResources().getDimensionPixelSize(R.dimen.popup_width);
int height = getResources().getDimensionPixelSize(R.dimen.popup_height);        
getDialog().getWindow().setLayout(width, height);

그런 다음 대화 상자의 레이아웃에서 match_parent를 지정하십시오.

android:layout_width="match_parent"
android:layout_height="match_parent"

한 곳만 걱정하면됩니다 (에 배치 DialogFragment#onResume). 완벽하지는 않지만 대화 상자의 레이아웃 파일의 루트로 RelativeLayout을 사용하는 것이 좋습니다.


3
이 대답은 내 경우에는 작동하지 않습니다 (DialogFragment의 경우). 표시 창 크기를 변경하려면 FragmentLayout 매개 변수를 사용해야했습니다.
Rusfearuth

3
내 레이아웃을 래핑 RelativeLayout해야하고 도움이되었습니다. 솔루션에 대한 많은 감사-시간을 많이 절약했습니다.
Johnny Doe

62
일단 이것이 onResume()아닌에 있어야한다는 것을 깨닫고 나면 (Android 4.0 이상) 잘 작동합니다 onCreateView(). (내 루트 레이아웃은 RelativeLayout이 ScrollView에 싸여 있습니다.)
Jonik

14
일부 경우에 유용 : 전체 화면 너비를 사용하십시오.int width = getResources().getDisplayMetrics().widthPixels
Jonik

6
조 니크 +1 Richard의 경우 -1입니다. 나는 항상 지원 조각을 사용하고 이것을 작동시킬 수 없었습니다 onCreateDialog(). 에 있어야 onResume()합니다.
MinceMan

146

Fragment.onResume()기본 대화 상자에서 속성을 재정의 하고 파악한 다음 너비 / 높이 매개 변수를 설정했습니다. 가장 바깥 쪽 레이아웃 높이 / 너비를로 설정했습니다 match_parent. 이 코드는 xml 레이아웃에서 정의한 여백도 존중하는 것 같습니다.

@Override
public void onResume() {
    super.onResume();
    ViewGroup.LayoutParams params = getDialog().getWindow().getAttributes();
    params.width = LayoutParams.MATCH_PARENT;
    params.height = LayoutParams.MATCH_PARENT;
    getDialog().getWindow().setAttributes((android.view.WindowManager.LayoutParams) params);
}

2
감사 ! 그것은 나를 위해 작동합니다! 또한 이것은 우아한 방법입니다.
AntoineP

1
@jmaculate-빠른 질문 :에 캐스팅 할 때 (android.view.WindowManager.LayoutParams)무엇을 캐스팅합니까? LayoutParams함수의 처음 3 줄에 나타나는 올바른 가져 오기를 선택할 때 당황했습니다 . 을 (를) 선택했습니다 (android.view.WindowManager.LayoutParams). 이것이 맞아야합니까?
Dev-iL

@ 데브 위원장의 getAttributes ()는 WindowManger.LayoutParams를 반환하지만 내 경우에는 내가 암시 ViewGroup.LayoutParams에 캐스팅하는 모든 I 필요 (유효 자바, 항목 52)이기 때문에 -이 반영되도록 질문을 수정거야
jmaculate을

1
에 다시 캐스팅해야하는 경우 위의 세 줄 android.view.WindowManager.LayoutParams을 사용하는 것은 쓸모 ViewGroup.LayoutParams가 없습니다. 여기에서는 유연성이 없습니다. 어쨌든이 좋은 답변에 감사드립니다!
Kevin Robatel

2
이것이 가장 좋은 해결책입니다. MATCH_PARENT 또는 WRAP_CONTENT와 함께 특정 픽셀 값을 사용할 수도 있습니다.
Koesh

98

XML 기본 레이아웃 (내 경우에는 LinearLayout)에서 다음을 정의하는 고정 크기의 DialogFragment가 있습니다.

android:layout_width="match_parent"
android:layout_height="match_parent"
android:minWidth="1000dp"
android:minHeight="450dp"

4
Honeycomb에는 midWidth와 minHeight가 필요하지만 ICS에는 필요하지 않다는 것을 알았습니다.
daveywc

1
이것은 언뜻보기에 작동하는 것처럼 보이지만 아마도 피해야합니다. 장치 너비에 따라 화면이 계속 꺼져 있으므로 오른쪽 하단에 버튼이 있으면 표시되지 않습니다.
CodyEngel

화면이 계속 꺼져 있습니다. 안드로이드 시스템은 DialogFragment가 지정된 minWidth 및 minHeight보다 작더라도 DialogFragment가 뷰 경계 안에 (마진이 작은) 유지되도록하는 것처럼 보입니다.
Lensflare

51

내 경우에는 근무 유일한 것은 해결책이 여기 지적했다 : http://adilatwork.blogspot.mx/2012/11/android-dialogfragment-dialog-sizing.html

Adil 블로그 게시물의 스 니펫 :

@Override
public void onStart()
{
  super.onStart();

  // safety check
  if (getDialog() == null)
    return;

  int dialogWidth = ... // specify a value here
  int dialogHeight = ... // specify a value here

  getDialog().getWindow().setLayout(dialogWidth, dialogHeight);

  // ... other stuff you want to do in your onStart() method
}

완벽한 솔루션이며 블로그에서 잘 설명되어 있습니다.
varun bhardwaj

+1 getDialog().getWindow().setLayout(dialogWidth, dialogHeight); 은 DialogFragment에 완벽하게 작동합니다. 그러나 안전 점검을 이해하지 못합니다. 왜 확인해야 null합니까?
tpk

3
@ 2943- 요청한 시점에 Dialog(의 자식 DialogFragment)을 사용할 수 있다는 보장이 없기 때문에 . 호출 할 때 Android가 null을 반환 할 수 getDialog()있습니다.
rmirabelle

@mirabelle 대화 상자의 onStart 콜백을 사용하는 경우 대화 상자가 어떻게 null 될 수 있습니까?
rommex

49

DialogFragment너비와 높이 를 제어하는 ​​한 가지 방법 은 값이 인 경우 대화 상자가보기의 너비와 높이를 존중하도록하는 것입니다 WRAP_CONTENT.

사용 ThemeOverlay.AppCompat.Dialog

이를 달성하는 간단한 방법 중 하나 ThemeOverlay.AppCompat.Dialog는 Android 지원 라이브러리에 포함 된 스타일을 사용하는 것 입니다.

DialogFragmentDialog:

@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    LayoutInflater inflater = LayoutInflater.from(getContext());
    View view = inflater.inflate(R.layout.dialog_view, null);

    Dialog dialog = new Dialog(getContext(), R.style.ThemeOverlay_AppCompat_Dialog);
    dialog.setContentView(view);
    return dialog;
}

DialogFragmentAlertDialog(주의 : minHeight="48dp") :

@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    LayoutInflater inflater = LayoutInflater.from(getContext());
    View view = inflater.inflate(R.layout.dialog_view, null);

    AlertDialog.Builder builder = new AlertDialog.Builder(getContext(), R.style.ThemeOverlay_AppCompat_Dialog);
    builder.setView(view);
    return builder.create();
}

ThemeOverlay.AppCompat.Dialog대화 상자를 만들 때 앱의 xml 테마에 대화 상자를 추가하여 기본 테마로 설정할 수도 있습니다 .
많은 대화 상자가 제대로 보이도록 기본 최소 너비가 필요하므로주의하십시오.

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- For Android Dialog. -->
    <item name="android:dialogTheme">@style/ThemeOverlay.AppCompat.Dialog</item>

    <!-- For Android AlertDialog. -->
    <item name="android:alertDialogTheme">@style/ThemeOverlay.AppCompat.Dialog</item>

    <!-- For AppCompat AlertDialog. -->
    <item name="alertDialogTheme">@style/ThemeOverlay.AppCompat.Dialog</item>

    <!-- Other attributes. -->
</style>

DialogFragmentDialog의 사용을 만드는 android:dialogTheme:

@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    LayoutInflater inflater = LayoutInflater.from(getContext());
    View view = inflater.inflate(R.layout.dialog_view, null);

    Dialog dialog = new Dialog(getContext());
    dialog.setContentView(view);
    return dialog;
}

DialogFragment와 함께 AlertDialog사용 android:alertDialogTheme하거나 alertDialogTheme(캐비티 :) minHeight="48dp":

@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    LayoutInflater inflater = LayoutInflater.from(getContext());
    View view = inflater.inflate(R.layout.dialog_view, null);

    AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
    builder.setView(view);
    return builder.create();
}

보너스

이전 Android API에서는 Dialog제목으로 인해 너비 문제가있는 것 같습니다 (설정하지 않은 경우에도). 스타일
을 사용 하지 않고 제목이 필요하지 않은 경우 (또는 사용자 지정 제목이있는 경우) 비활성화 할 수 있습니다.ThemeOverlay.AppCompat.DialogDialog

@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    LayoutInflater inflater = LayoutInflater.from(getContext());
    View view = inflater.inflate(R.layout.dialog_view, null);

    Dialog dialog = new Dialog(getContext());
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
    dialog.setContentView(view);
    return dialog;
}

오래된 답변, 대부분의 경우 작동하지 않습니다

프로그래밍 방식으로 고정 크기를 지정하지 않고 대화 상자에서 레이아웃의 너비와 높이를 존중하려고했습니다.

나는 그것을 생각 android:windowMinWidthMinor하고 android:windowMinWidthMajor문제의 원인이되었다. 비록 내 Activity또는 의 주제에 포함되지 않았지만 Dialog여전히 Activity주제 에 적용되고있었습니다 .

나는 세 가지 가능한 해결책을 생각해 냈습니다.

해결 방법 1 : 사용자 정의 대화 상자 테마를 만들고에서 대화 상자를 만들 때 사용하십시오 DialogFragment.

<style name="Theme.Material.Light.Dialog.NoMinWidth" parent="android:Theme.Material.Light.Dialog">
    <item name="android:windowMinWidthMinor">0dip</item>
    <item name="android:windowMinWidthMajor">0dip</item>
</style>
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    return new Dialog(getActivity(), R.style.Theme_Material_Light_Dialog_NoMinWidth);
}

해결 방법 2 : 대화 상자 ContextThemeWrapper와 같은 역할을 하는 사용자 지정 테마를 만듭니다 Context. 사용자 정의 대화 상자 테마를 작성하지 않으려는 경우 (예 :에 의해 지정된 테마를 사용하려는 경우)이를 사용하십시오 android:dialogTheme.

<style name="Theme.Window.NoMinWidth" parent="">
    <item name="android:windowMinWidthMinor">0dip</item>
    <item name="android:windowMinWidthMajor">0dip</item>
</style>
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    return new Dialog(new ContextThemeWrapper(getActivity(), R.style.Theme_Window_NoMinWidth), getTheme());
}

(AN과 해결책 3 AlertDialog) 적용 android:windowMinWidthMinorandroid:windowMinWidthMajorContextThemeWrapper의해 생성 AlertDialog$Builder.

<style name="Theme.Window.NoMinWidth" parent="">
    <item name="android:windowMinWidthMinor">0dip</item>
    <item name="android:windowMinWidthMajor">0dip</item>
</style>
@Override
public final Dialog onCreateDialog(Bundle savedInstanceState) {
    View view = new View(); // Inflate your view here.
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    builder.setView(view);
    // Make sure the dialog width works as WRAP_CONTENT.
    builder.getContext().getTheme().applyStyle(R.style.Theme_Window_NoMinWidth, true);
    return builder.create();
}

4
도대체 이것이 왜 받아 들여지지 않는지 모르겠습니다. 이것은 말 그대로 작동하고 해킹이 아닌 유일한 대답입니다 (주로 첫 번째 솔루션에 대해 이야기하고 있습니다).
Bogdan Zurac

1
불행히도 이것을 해결하는 방법을 알아 낸 한 시간을 보낸 후에 만 ​​발견되었습니다!
brainvision

해결책 3은 내 생명을 구합니다. 대단히 감사합니다
Simon

구형 Android API에서 문제를 재현 할 수있었습니다. 도움이 될만한 대안을 추가했습니다.
jpmcosta

솔루션 1이 나를 위해 일했습니다. 방금 Theme.MaterialComponents.Light.Dialog부모로 사용하고의 생성자 에서이 스타일을 사용했습니다 MaterialAlertDialogBuilder. 1 시간 동안 조사한 후 답을 우연히 발견했습니다. 감사합니다.
Shahood ul Hassan

39

문제 # 13 : DialogFragment레이아웃

정말 정신 마비입니다.

을 만들 때 ( .xml 레이아웃을 첨부하기 위해 a 를 전달 ) 또는 DialogFragment을 무시하도록 선택할 수 있습니다 .onCreateViewViewGrouponCreateDialog

대화 상자의 레이아웃이 언제 팽창했는지에 대해 안드로이드를 혼동시킬 수 있기 때문에 두 가지 방법을 모두 무시해서는 안됩니다! WTF?

재정의 여부 OnCreateDialog또는 OnCreateView대화 상자 사용 방법에 따라 선택합니다 .

  • 대화 상자를 창에서 시작하면 (정상적인 동작) 재정의해야 OnCreateDialog합니다.
  • 기존 UI 레이아웃 내에 대화 상자 조각을 포함 시키려면 (FAR이 덜 일반적 임)을 재정의해야 OnCreateView합니다.

이것은 아마도 세상에서 최악의 일입니다.

onCreateDialog 광기

그래서, 당신은 무시하고 onCreateDialog당신에 DialogFragment의 사용자 인스턴스를 생성 AlertDialog창에 표시합니다. 멋있는. 그러나 사용자 지정 .xml 레이아웃 에 첨부 onCreateDialog하지 ViewGroup마십시오 . 문제 없습니다 . 단순히 메소드에 전달 합니다 .nullinflate

광기가 시작하자.

을 재정의 onCreateDialog하면 Android가 팽창 한 .xml 레이아웃의 루트 노드에 대한 여러 속성을 완전히 무시 합니다. 여기에는 다음이 포함되지만 이에 국한되지는 않습니다.

  • background_color
  • layout_gravity
  • layout_width
  • layout_height

당신은 설정해야합니다 이것은 거의 코믹입니다 layout_widthlayout_height수치의 좋은 작은 빨간 배지 당신을 때릴 것 EVERY .XML 레이아웃 또는 안드로이드 스튜디오.

단어 만으로 DialogFragment말하고 싶어요 나는 안드로이드 gotchas와 snafus로 가득 찬 소설을 쓸 수 있지만, 이것은 가장 내부적 인 것 중 하나입니다.

정신 건강으로 돌아가려면 먼저 우리는 단지 복원 할 스타일을 선언 background_color하고 다음 layout_gravity을 기대합니다.

<style name="MyAlertDialog" parent="Theme.AppCompat.Dialog">
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:layout_gravity">center</item>
</style>

위의 스타일은 Dialogs의 기본 테마 ( AppCompat이 예제 의 테마)에서 상속됩니다 .

다음으로, 프로그래밍 방식으로 스타일 을 적용 하여 Android에서 방금 던진 값을 되돌리고 표준 AlertDialog모양과 느낌 을 복원합니다 .

public class MyDialog extends DialogFragment {
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        View layout = getActivity().getLayoutInflater().inflate(R.layout.my_dialog_layout, null, false);
        assert layout != null;
        //build the alert dialog child of this fragment
        AlertDialog.Builder b = new AlertDialog.Builder(getActivity());
        //restore the background_color and layout_gravity that Android strips
        b.getContext().getTheme().applyStyle(R.style.MyAlertDialog, true);
        b.setView(layout);
        return b.create();
    }
}

위의 코드 AlertDialogAlertDialog다시 처럼 보이게 합니다. 아마도 이것으로 충분할 것입니다.

그러나 더 많은 것이 있습니다!

SPECIFIC 을 설정 layout_width하거나 layout_height표시 AlertDialog될 때 (매우 가능성이 높은) 것을 찾고 있다면 , 아직 완료하지 않은 것을 추측하십시오!

특정 스타일 layout_width이나 layout_height멋진 새 스타일 을 설정하려고 시도하면 Android에서도 해당 스타일을 완전히 무시합니다.

<style name="MyAlertDialog" parent="Theme.AppCompat.Dialog">
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:layout_gravity">center</item>
    <!-- NOPE!!!!! --->
    <item name="android:layout_width">200dp</item>
    <!-- NOPE!!!!! --->
    <item name="android:layout_height">200dp</item>
</style>

특정 창 너비 또는 높이를 설정하려면 전체 '너머 방법으로 넘어 가서 다음을 처리하십시오 LayoutParams.

@Override
public void onResume() {
    super.onResume();
    Window window = getDialog().getWindow();
    if(window == null) return;
    WindowManager.LayoutParams params = window.getAttributes();
    params.width = 400;
    params.height = 400;
    window.setAttributes(params);
}

많은 사람들이 안드로이드의 나쁜 예 WindowManager.LayoutParams를 따라 더 일반적인 것으로 ViewGroup.LayoutParams캐스팅하고 나중에 ViewGroup.LayoutParams다시 WindowManager.LayoutParams몇 줄로 다시 캐스팅 합니다. 코드를 해독하기 어렵게 만드는 것 외에는 불필요한 캐스팅으로 아무것도 제공하지 않습니다.

참고 사항 : LayoutParams근본적으로 열악한 디자인의 완벽한 예 인 Android SDK 전체에서 몇 차례의 반복이 있습니다.

요약해서 말하자면

의 경우는 DialogFragment그 재정이야 onCreateDialog:

  • 표준 AlertDialog모양과 느낌 을 복원하려면 background_color= transparentlayout_gravity= 를 설정 center하고에 해당 스타일을 적용하는 스타일을 onCreateDialog만듭니다.
  • 특정를 설정하려면 layout_width및 / 또는 layout_height,에서 프로그래밍을 할 수 onResumeLayoutParams
  • 건전성을 유지하려면 Android SDK에 대해 생각하지 마십시오.

13
이 대답을 읽으면 울고 싶어집니다.
Bassinator

3
야, 지금 내가 겪고있는 것을 정확히 설명 했어
Mert Gülsoy

2
안드로이드는 똥이다. 나는 당신이 형제 느낌. 모든 것에 대한 상황, 앱 프로세스 중단, 일부 지원 라이브러리 부족, 목록이
계속됨

1
@ rmirabelle-이 답변은 실제로 도움이되며 실제로 중간 블로그를 작성할 수 있으며 많은 사람들에게 도움이 될 수 있습니다. 제 경우에는 제약 조건 레이아웃과 DialogFragment를 사용하고 있으므로 Android 9에서는 무시되었으며 Android 9 아래에서는 제대로 작동합니다. 스타일에 "android : windowMinWidthMajor", "android : windowMinWidthMinor"를 추가하고 제대로 작동하기 시작했습니다
Rahul


14

DialogFragment를 조금 더 넓게 만들어야 할 때 minWidth를 설정합니다.

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:minWidth="320dp"
    ... />

1
내 의견으로는 최고의 솔루션!
Fabian Knapp

더 좁히려면 어떻게해야합니까?
Daniel

8

내가 대체 할 강력한 이유가 표시되지 않습니다 onResume또는 onStart의 폭과 높이를 설정 WindowDialogFragment'들 Dialog-이 특별한 라이프 사이클의 방법을 반복하고 불필요하게 전화를받을 수 있습니다 실행 인해 멀티 윈도우 스위치 같은 것들에 한 번 이상 코드 크기를 조정, 배경 처리 앱 포 그라운드 등. 그 반복의 결과는 매우 사소하지만 왜 그 점에 정착합니까?

재정의 된 onActivityCreated()메서드 내에서 너비 / 높이를 대신 설정하면 이 메서드는 실제로 인스턴스 당 한 번만 호출되므로 개선됩니다 DialogFragment. 예를 들면 다음과 같습니다.

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

    Window window = getDialog().getWindow();
    assert window != null;

    WindowManager.LayoutParams layoutParams = window.getAttributes();
    layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT;
    window.setAttributes(layoutParams);
}

위에서 나는 match_parent장치 방향에 관계없이 너비를 설정했습니다 . 가로 대화 상자가 너무 넓지 않게하려면 getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT미리 여부를 확인할 수 있습니다 .


6

가장 바깥 쪽 레이아웃의 치수가 대화 상자에서 작동하지 않습니다. 치수를 가장 바깥쪽으로 설정 한 레이아웃을 추가 할 수 있습니다.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content">

<LinearLayout
    android:layout_width="xxdp"
    android:layout_height="xxdp"
    android:orientation="vertical">

</LinearLayout>


5

루트 요소 레이아웃 매개 변수 설정을 수정했습니다.

int width = activity.getResources().getDisplayMetrics().widthPixels;
int height = activity.getResources().getDisplayMetrics().heightPixels;
content.setLayoutParams(new LinearLayout.LayoutParams(width, height));

5

xml에서 DialogFragment 너비 / 높이를 설정하는 방법은 다음과 같습니다. 투명한 배경의 Framelayout (모든 레이아웃이 작동 함)에서 계층 구조를 래핑하십시오.

투명한 배경은 frameLayout의 자식을 자동으로 창에 배치하기 때문에 특별한 플래그 인 것 같습니다. 여전히 조각 뒤에 전체 화면이 어두워 져 조각이 활성 요소임을 나타냅니다.

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/transparent">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="300dp"
        android:background="@color/background_material_light">

      .....

일관되게 작동하면 레이아웃의 일부를 XML로 코딩하고 코드의 일부를 코딩하는 데 매우 뛰어난 접근 방식이기 때문에 시도해 볼 것입니다. 감사합니다
rmirabelle

나는이 접근법의 아이디어를 좋아하지만 테스트 할 때 단순히 프로그래밍 방식으로 높이와 너비를 변경하는 것과 다른 레이아웃을 생성합니다. 예를 들어, 전체 너비는 AlertDialog에서 제공하는 최대 너비 (아마도 Android 스타일로 인해)로 강제 축소됩니다. 코드를 통해 w와 h를 설정하면 AlertDialog 스타일이 무시됩니다. 그러나 이것은 많은 요구에 맞을 수 있으며 좋은 생각입니다. 역사상 최악의 SDK를 오랫동안 사용하십시오.
rmirabelle

내부 너비를 match_parent로 변경하려고 할 때까지 onCreateView에서 훌륭하게 작동했습니다 ...
tudor

5

여기 kotlin 버전이 있습니다

    override fun onResume() {
        super.onResume()

        val params:ViewGroup.LayoutParams = dialog.window.attributes
        params.width = LinearLayout.LayoutParams.MATCH_PARENT
        params.height = LinearLayout.LayoutParams.MATCH_PARENT
        dialog.window.attributes = params as android.view.WindowManager.LayoutParams
    }

4

너비에 백분율을 사용할 수 있습니다.

<style name="Theme.Holo.Dialog.MinWidth">
<item name="android:windowMinWidthMajor">70%</item>

이 예제에서는 Holo Theme를 사용했습니다.


3

아래 코드를 사용하여 Java에서 레이아웃 너비와 높이를 설정할 수 있습니다.

final AlertDialog alertDialog  = alertDialogBuilder.create();
final WindowManager.LayoutParams WMLP = alertDialog.getWindow().getAttributes();

WMLP.gravity = Gravity.TOP;
WMLP.y = mActionBarHeight;
WMLP.x = getResources().getDimensionPixelSize(R.dimen.unknown_image_width);

alertDialog.getWindow().setAttributes(WMLP);
alertDialog.show();

2

AlertDialog.Builder를 사용하여 대화 상자를 만들므로 OnShowListener 내부에서 Rodrigo의 답변을 사용했습니다.

dialog.setOnShowListener(new OnShowListener() {

            @Override
            public void onShow(DialogInterface dialogInterface) {
                Display display = getWindowManager().getDefaultDisplay();
                DisplayMetrics outMetrics = new DisplayMetrics ();
                display.getMetrics(outMetrics);
                dialog.getWindow().setLayout((int)(312 * outMetrics.density), (int)(436 * outMetrics.density));
            }

        });

(주로 미래의 독자를 위해 :) stackoverflow.com/a/7979823/3372061Snicolas 의 " DialogFragmentvs AlertDialog"에 대한 설명에서 주석을 참조하십시오 .
Dev-iL

2

Android 6.0에서 작업하면서 동일한 문제가 발생했습니다. 사용자 정의보기의 root에 실제 세트에 관계없이 테마에서 AlertDialog사전 정의 된 width세트로 기본 설정됩니다 . 나는 그것이 제대로 조정 설정 얻을 수 있었다 의를 . 더 조사하지 않고 실제 요소의 크기를 조정하고 그 주위에 루트 랩을 사용하면 예상대로 작동하는 것으로 보입니다 . 아래는 대화 상자를 올바르게 설정하는 로딩 대화 상자의 XML 레이아웃입니다 . 이 라이브러리 를 애니메이션에 사용합니다 .widthLayoutwidthloading_message TextViewLayoutwidth

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@color/custom_color"
    android:padding="@dimen/custom_dimen">
    <com.github.rahatarmanahmed.cpv.CircularProgressView
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/progress_view"
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:layout_centerHorizontal="true"
        app:cpv_color="@color/white"
        app:cpv_animAutostart="true"
        app:cpv_indeterminate="true" />
    <TextView
        android:id="@+id/loading_message"
        android:layout_width="100dp"
        android:layout_height="wrap_content"
        android:layout_below="@+id/progress_view"
        android:layout_centerHorizontal="true"
        android:gravity="center"
        android:textSize="18dp"
        android:layout_marginTop="@dimen/custom_dimen"
        android:textColor="@color/white"
        android:text="@string/custom_string"/>
</RelativeLayout>

2

쉽고 견고 함 :

@Override
    public void onResume() {
        // Sets the height and the width of the DialogFragment
        int width = ConstraintLayout.LayoutParams.MATCH_PARENT;
        int height = ConstraintLayout.LayoutParams.MATCH_PARENT;
        getDialog().getWindow().setLayout(width, height);

        super.onResume();
    }

2

내 경우에는 DialogFragment과 같은 전체 활동 크기를 차지했습니다 Fragment. 이 DialogFragment아닌 XML 레이아웃을 기반으로했습니다 AlertDialog. 내 실수는 FragmentManager일반적인 조각으로 대화 상자 조각을 추가하는 것이 었습니다 .

fragmentManager?.beginTransaction()?.run {
    replace(R.id.container, MyDialogFragment.newInstance(), MyDialogFragment.TAG)
    addToBackStack(MyDialogFragment.TAG)
}?.commitAllowingStateLoss()

대신 show대화 조각이 필요합니다 .

val dialogFragment = MyDialogFragment.newInstance()
fragmentManager?.let { dialogFragment.show(it, MyDialogFragment.TAG) }

일부 편집 ( ViewPager2레이아웃에 있음) 후 대화 조각이 너무 좁아졌습니다.

여기에 이미지 설명을 입력하십시오

N1hk 의 솔루션을 사용했습니다 .

override fun onActivityCreated(savedInstanceState: Bundle?) {
    super.onActivityCreated(savedInstanceState)

    dialog?.window?.attributes?.width = ViewGroup.LayoutParams.MATCH_PARENT
}

이제 전체 활동 크기가 아닌 너비와 높이를 정의했습니다.

에 대해 onCreateView하고 싶습니다 onCreateDialog. 레이아웃을 기반으로 한 대화 상자 조각이있는 경우이 두 가지 방법 중 하나를 사용할 수 있습니다.

1)을 사용하는 경우 너비를 설정 onCreateView하는 onActivityCreated데 사용해야 합니다.

2) onCreateDialog대신에 onCreateView파라미터 를 사용 하면 파라미터를 설정할 수 있습니다. onActivityCreated필요하지 않습니다.

override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
    super.onCreateDialog(savedInstanceState)

    val view = activity?.layoutInflater?.inflate(R.layout.your_layout, null)

    val dialogBuilder = MaterialAlertDialogBuilder(context!!).apply { // Or AlertDialog.Builder(context!!).apply
        setView(view)
        // setCancelable(false)
    }

    view.text_view.text = "Some text"

    val dialog = dialogBuilder.create()
    // You can access dialog.window here, if needed.

    return dialog
}

onActivityCreated에서 너비를 설정하여 하루를 저장했습니다.
Hagar Magdy

@ManishKumarSharma, 행운을 빌어 요!
CoolMind

1

내 경우에는 align_parentBottom="true"내부의보기 로 인해 발생했습니다 RelativeLayout. 모든 alignParentBottom을 제거하고 모든 레이아웃을 수직 LinearLayouts로 변경하고 문제가 사라졌습니다.


1

사용자 정의 대화 상자 레이아웃의 부모 레이아웃을 RelativeLayout 으로 설정하고 일반적인 너비와 높이를 자동으로 가져옵니다.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">

이것은 나를 위해 일했습니다. ConstraintLayout을 사용하여 대화 상자에 컨트롤을 배치하고 루트 레이아웃에 RelativeLayout을 사용한 다음 ConstraintLayout을 직접 그 안에 넣었습니다. 이것은 나에게 정상적인 크기의 대화 상자를 주었다. 다른 것을 변경하지 않고 ConstraintLayout을 루트로 넣으면 대화 상자 너비가 너무 넓지 않았습니다!
leafcutter

1

이전 솔루션 중 하나가 거의 효과가있었습니다. 나는 약간 다른 것을 시도했고 결국 나를 위해 일했습니다.

(그의 해결책을 확인하십시오) 이것은 그의 해결책이었습니다. 여기를 클릭하십시오. 여기를 제외하고는 효과가있었습니다.

나는 그것을 바꿨다.

 @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {


        // Use the Builder class for convenient dialog construction
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

        // Get layout inflater
        LayoutInflater layoutInflater = getActivity().getLayoutInflater();

        // Set layout by setting view that is returned from inflating the XML layout
        builder.setView(layoutInflater.inflate(R.layout.dialog_window_layout, null));


        AlertDialog dialog = builder.create();

        dialog.getContext().setTheme(R.style.Theme_Window_NoMinWidth);

마지막 줄은 실제로 다른 것입니다.


0
@Override
public void onStart() {
    super.onStart();
    Dialog dialog = getDialog();
    if (dialog != null)
    {
        dialog.getWindow().setLayout(-1, -2);
        dialog.getWindow().getAttributes().windowAnimations = R.style.DialogAnimation;
        Window window = getDialog().getWindow();
        WindowManager.LayoutParams params = window.getAttributes();
        params.dimAmount = 1.0f;
        window.setAttributes(params);
        window.setBackgroundDrawableResource(android.R.color.transparent);
    }
}

0

이것이 가장 간단한 해결책입니다

내가 찾은 가장 좋은 해결책은 onCreateDialog()대신 재정의하는 것입니다 onCreateView(). setContentView ()는 팽창하기 전에 올바른 창 크기를 설정합니다. 리소스 파일에 치수, 배경색, 스타일 등을 저장 / 설정하거나 수동으로 설정할 필요가 없습니다.

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    Dialog dialog = new Dialog(getActivity());
    dialog.setContentView(R.layout.fragment_dialog);

    Button button = (Button) dialog.findViewById(R.id.dialog_button);
    // ...
    return dialog;
}

0

에 추가 FragmentDialog:

public void onResume() {
    Window window = getDialog().getWindow();
    Point size = new Point();
    Display display = window.getWindowManager().getDefaultDisplay();
    display.getSize(size);
    window.setLayout( (int)(size.x * 0.9), WindowManager.LayoutParams.WRAP_CONTENT );
    window.setGravity( Gravity.CENTER );
    super.onResume();
}

0

이것은 완벽하게 작동합니다.

@Override
public void onResume() {
    super.onResume();
    Window window = getDialog().getWindow();
    if(window == null) return;
    WindowManager.LayoutParams params = window.getAttributes();
    params.width = 400;
    params.height = 400;
    window.setAttributes(params);
}

이것은 3 년 전부터 받아 들여진 대답이 말한 것과 거의 같습니다.
Adil Hussain

-4

거의 모든 스크린을 다루는 대화 상자를 얻으려면 먼저 ScreenParameter 클래스를 정의하십시오.

public class ScreenParameters
{
    public static int Width;
    public static  int Height;

    public ScreenParameters()
    {
        LayoutParams l = new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT);
        Width= l.width;
        Height = l.height;
    }
}

그런 다음 getDialog.getWindow (). setLayout () 메서드 전에 ScreenParamater를 호출해야합니다.

@Override
public void onResume()
{
    super.onResume();
    ScreenParameters s = new ScreenParameters();
    getDialog().getWindow().setLayout(s.Width , s.Height);
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.