경고 대화 상자를 화면 크기의 90 %로 채우는 방법은 무엇입니까?


304

사용자 정의 알림 대화 상자를 작성하고 표시 할 수는 있지만 android:layout_width/height="fill_parent" 대화 상자 xml에는 내용만큼 큽니다.

내가 원하는 것은 20 픽셀의 패딩을 제외하고 전체 화면을 채우는 대화 상자입니다. 그런 다음 대화 상자의 일부인 이미지는 fill_parent를 사용하여 전체 대화 상자 크기로 자동 확장됩니다.

답변:


355

토론 그룹 게시물의 Android 플랫폼 개발자 Dianne Hackborn에 따르면 Dialogs는 Window의 최상위 레이아웃 너비와 높이를로 설정했습니다 WRAP_CONTENT. 대화 상자를 더 크게 만들기 위해 해당 매개 변수를로 설정할 수 있습니다 MATCH_PARENT.

데모 코드 :

    AlertDialog.Builder adb = new AlertDialog.Builder(this);
    Dialog d = adb.setView(new View(this)).create();
    // (That new View is just there to have something inside the dialog that can grow big enough to cover the whole screen.)

    WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
    lp.copyFrom(d.getWindow().getAttributes());
    lp.width = WindowManager.LayoutParams.MATCH_PARENT;
    lp.height = WindowManager.LayoutParams.MATCH_PARENT;
    d.show();
    d.getWindow().setAttributes(lp);

대화 상자가 표시된 후에 속성이 설정됩니다. 시스템 설정 시점에 문제가 있습니다. 대화 상자가 처음 표시 될 때 레이아웃 엔진이 설정해야한다고 생각합니다.

Theme.Dialog를 확장 하여이 작업을 수행하는 것이 좋습니다. 그러면 setAttributes를 호출 할 때 추측 게임을 할 필요가 없습니다. (대화 상자에서 적절한 밝거나 어두운 테마 또는 Honeycomb Holo 테마를 자동으로 채택하는 것이 약간 더 많은 작업이지만 http://developer.android.com/guide/topics/ui/themes 에 따라 수행 할 수 있습니다 . html # SelectATheme )


5
대답을 이해하지 못하거나 효과가 없는지 여부.
David Morales

4
대화 상자의 너비가 wrap_content라는 것은 사실이 아닙니다. 상황이 좁아지고 잘립니다. 대화 상자가 사전에 지정된 최대 너비로 설정된 것 같습니다.
Peter Ajtai

21
이것이 어떻게 질문에 대답하지 않습니까? @nmr에서 제안한 코드가 대화 상자를 화면의 90 %로 설정합니까? 나는 그것을 보지 못한다. 대화 상자가 fill_width로 설정되어 90 %가 아닌 100 %가 맞습니까?
Ted

4
@Ted, AlertDialog에서 사용하는 테마에는 여백이 있습니다. 따라서 결과는 화면 가장자리에 도달하지 않고 약 90 %를 채 웁니다. (정확히 90 %가 아니라 미적 근사치 인 90 %입니다)
nmr

8
d.getWindow (). getAttributes (). width = WindowManager.LayoutParams.FILL_PARENT; show ()를 호출하기 전에 트릭을 수행합니다. 또한 대화 상자의 배경이 투명하지 않아 주어진 방법에 문제가있었습니다. copyFrom (()을 제거하자마자 문제가 해결되었습니다.
Alexey

182

RelativeLayout대신 사용자 정의 대화 상자 레이아웃을 래핑하십시오 LinearLayout. 그것은 나를 위해 일했다.


2
그것은 나에게도있다. 누구나 이유를 설명 할 수 있습니까 !!
로지나

이것이 RelativeLayout이 작동하는 방식입니까 아니면 사라질 수있는 행복한 사고입니까?
Yetti99

9
2019 년이며 여전히 작동합니다. 건배! 실제로 인정되는 답변이어야합니다.
TaylanUB

@ cvarsendan 당신은 대답을 설명 할 수 있습니까? 그것은 나를 위해 일했다. 감사합니다!
Jaco

OMG, My RecyclerView는 절대로 전체 높이를 표시하지 않거나 높이가 항상 0이며, 많은 솔루션을 시도한 후 하루 만에 완벽하게 작동합니다. RelativeLayout이 다른 이유는 무엇입니까?
leegor

85

대화 상자 창에서 FILL_PARENT를 지정하면 다른 사람들이 제안한 것처럼 전체 화면을 채우기 위해 검은 색 대화 상자 배경을 늘 렸기 때문에 (Android 4.0.4에서) 작동하지 않았습니다.

제대로 작동하는 것은 최소 표시 값을 사용하지만 코드 내에서 지정하여 대화 상자가 화면의 90 %를 차지하도록하는 것입니다.

그래서:

Activity activity = ...;
AlertDialog dialog = ...;

// retrieve display dimensions
Rect displayRectangle = new Rect();
Window window = activity.getWindow();
window.getDecorView().getWindowVisibleDisplayFrame(displayRectangle);

// inflate and adjust layout
LayoutInflater inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View layout = inflater.inflate(R.layout.your_dialog_layout, null);
layout.setMinimumWidth((int)(displayRectangle.width() * 0.9f));
layout.setMinimumHeight((int)(displayRectangle.height() * 0.9f));

dialog.setView(layout);

일반적으로 대부분의 경우 너비 조정만으로 충분합니다.


4.0 이상에서는 완벽하게 작동하지 않는 것 같습니다. 화면의 90 %를 채우지 않습니다. 왜 그런지 알아? 4.0이 설치된 Motorola Xoom에서이 작업을 수행하고 있습니다
Ryan Gray

@RyanGray 그것은 OS가 업데이트 된 Samsung Nexus S에서 나를 위해 일하고 있습니다. 부가적인 정보가 없으면 불행히도 당신을 도울 수 없습니다.
koma

83

설정 android:minWidthandroid:minHeight사용자 정의보기 XML이다. 이로 인해 경고가 내용 크기 만 랩핑하지 않도록 할 수 있습니다. 이와 같은보기를 사용하면해야합니다.

<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:minWidth="300dp" 
  android:minHeight="400dp">
  <ImageView
   android:layout_width="fill_parent"
   android:layout_height="fill_parent"
   android:background="@drawable/icon"/>
</LinearLayout>

3
예,이를 사용하여 특정 크기로 설정할 수 있지만 화면 크기에서 20 픽셀의 패딩을 뺀 값을 원합니다. 또는 너비 = 화면 너비의 90 %
Fabian

4
I 밀도 독립 픽셀은 항상 크기가 조정되므로 모든 화면이 320x480dp이므로 모든 경우에 300x460dp보기가 20dp 패딩이됩니다. 또는 다음과 같이 화면 크기를 찾을 수 있습니다. Display display = ((WindowManager) getSystemService (Context.WINDOW_SERVICE)). getDefaultDisplay (); int width = display.getWidth (); maxWidth와 maxHeight를 적절히 설정하십시오.
jqpubliq 2019

5
흠에서 나는 dp의 개념을 이해합니다. 그러나 화면 비율이 16 : 9 또는 4 : 3이면 어떻게 되나요? dp가 고르지 않게 늘어날까요?
Fabian

2
아니요, 화면 비율이 2 : 3 인 경우 dp 해상도는 320x480 일 뿐이므로이 방법은 작동하지 않습니다.
mhsmith

21
이 답변이 왜 그렇게 많이지지 되었습니까? 이것은 사용자가 어떤 장치 크기를 사용하고 있는지 전혀 고려하지 않기 때문에 끔찍한 해결책입니다.
Jin

70

더 간단한 방법은 다음과 같습니다.

int width = (int)(getResources().getDisplayMetrics().widthPixels*0.90);
int height = (int)(getResources().getDisplayMetrics().heightPixels*0.90);

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

참고 사항 : getResources ()는 활동 컨텍스트에서 사용할 수 있습니다.
nat101

이 답변은 onCreate장치 교체 후 대화 상자를 다시 만들려는 시나리오에 매우 유용했습니다 . 이 경우 레이아웃에있는 항목의 너비 / 높이는 아직 만들어지지 않았으므로 사용할 수 없습니다. 그러나 장치의 물리적 너비 / 높이는 여전히 사용할 수 있습니다.
Tim Biegeleisen

4
하나의 차원 만 변경 ViewGroup.LayoutParams.WRAP_CONTENT하려면 매개 변수 중 하나로 전달 하십시오.
Vadim Kotov

53
dialog.getWindow().setLayout(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);

1
이것은 나를 위해 일했고 MonoDroid로 쉽게 번역되었습니다 (d는 새로운 대화 상자입니다). d.Window.SetLayout (WindowManagerLayoutParams.FillParent, WindowManagerLayoutParams.FillParent);
TheJerm

9
그러나 90 %는 100 %와 동일하지 않습니다. FILL_PARENT는 90 %가 아닌 전체 너비 100 %를 채우도록 표시합니다. 권리?
Ted

@ 테드 당신이 맞아요. FILL_PARENT현재 디스플레이 너비의 90 %로 계산 된 너비 를 대체 할 수 있습니다 . 그러나 나는 다른 것보다 쉽기 때문에 대답을 좋아합니다.
HRJ

26

여기에있는 다른 모든 대답은 의미가 있지만 Fabian의 요구를 충족시키지 못했습니다. 여기 내 해결책이 있습니다. 완벽한 해결책은 아니지만 저에게 효과적입니다. 전체 화면에있는 대화 상자가 표시되지만 위쪽, 아래쪽, 왼쪽 또는 오른쪽에 패딩을 지정할 수 있습니다.

먼저 이것을 res / values ​​/ styles.xml에 넣으십시오.

<style name="CustomDialog" parent="@android:style/Theme.Dialog">
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowBackground">@color/Black0Percent</item>
    <item name="android:paddingTop">20dp</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:backgroundDimEnabled">false</item>
    <item name="android:windowIsFloating">false</item>
</style>

보시다시피 android : paddingTop = 20dp 가 기본적으로 필요한 것입니다. 안드로이드 : windowBackground = @ 색상 / Black0Percent가 단지 색상 코드 내 color.xml 선언이다

입술 / 값 /color.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="Black0Percent">#00000000</color>
</resources>

해당 색상 코드는 대화 상자의 기본 창 배경을 0 % 투명도 색상으로 대체하기위한 더미 역할을합니다.

다음 사용자 정의 대화 상자 레이아웃 res / layout / dialog.xml을 빌드하십시오.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/dialoglayout"
    android:layout_width="match_parent"
    android:background="@drawable/DesiredImageBackground"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <EditText
        android:id="@+id/edittext1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:singleLine="true"
        android:textSize="18dp" />

    <Button
        android:id="@+id/button1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Dummy Button"
        android:textSize="18dp" />

</LinearLayout>

마지막으로 dialog.xml을 사용하는 사용자 정의보기를 설정하는 대화 상자가 있습니다.

Dialog customDialog;
LayoutInflater inflater = (LayoutInflater) getLayoutInflater();
View customView = inflater.inflate(R.layout.dialog, null);
// Build the dialog
customDialog = new Dialog(this, R.style.CustomDialog);
customDialog.setContentView(customView);
customDialog.show();

결론 : CustomDialog라는 styles.xml에서 대화 상자 테마를 대체하려고했습니다. 대화 창 레이아웃을 재정의하고 패딩을 설정하고 배경의 불투명도를 변경할 수있는 기회를 제공합니다. 완벽한 해결책은 아니지만 도움이 되길 바랍니다 .. :)


그것은 지금까지 다른 bulids를 테스트 할 수 없었습니다 지금 jellybean에 대 한 작동
Nasz Njoka Sr.

가장 깨끗하고 가장 우아한 솔루션 인 것 같습니다. Kitkat 4.4 및 4.3에서 작동합니다.
David

나는 사용자 정의 대화 상자를 가지고 있으며 이것을 볼 때까지 NOTHING이 작동했습니다. 사용자 정의 대화 상자의 마술, 모든 마술은 확장 DialogFragment됩니다 Dialog customDialog = new Dialog(context, STYLE);. 감사합니다. 정말 감사합니다.
Sierisimo


이것은 대화창의 매력처럼 작동합니다! 불행히도 부작용은 대화 상자의 모든보기가 대화 상자에 설정 한 패딩을 상속한다는 것입니다.
runholen

25

(JUST) 창 대화 상자 너비에 백분율을 사용할 수 있습니다.

Holo Theme에서이 예제를 살펴보십시오.

<style name="Theme.Holo.Dialog.NoActionBar.MinWidth">
    <item name="android:windowMinWidthMajor">@android:dimen/dialog_min_width_major</item>
    <item name="android:windowMinWidthMinor">@android:dimen/dialog_min_width_minor</item>
</style>

 <!-- The platform's desired minimum size for a dialog's width when it
     is along the major axis (that is the screen is landscape).  This may
     be either a fraction or a dimension. -->
<item type="dimen" name="dialog_min_width_major">65%</item>

이 테마를 확장하고 "주요"및 "부"값을 65 % 대신 90 %로 변경하기 만하면됩니다.

문안 인사.


1
대화 상자에서 이것을 사용하려면 대화 상자 작성기 생성자에서 사용자 정의 스타일을 전달하십시오 :)
sosite

22

다음은 나를 위해 잘 작동했습니다.

    <style name="MyAlertDialogTheme" parent="Base.Theme.AppCompat.Light.Dialog.Alert">
        <item name="windowFixedWidthMajor">90%</item>
        <item name="windowFixedWidthMinor">90%</item>
    </style>

(참고 : 이전 답변에서 제안한 windowMinWidthMajor / Minor는 트릭을 수행하지 않았습니다. 내용에 따라 대화 상자의 크기가 계속 변경되었습니다)

그리고:

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), R.style.MyAlertDialogTheme);

3
지금까지 가장 좋은 답변입니다. 나를 위해 완벽하게 일했습니다!
Pawan

궁금합니다 : 코드를 통해 백분율로 설정된 특수 치수의 값을 어떻게 얻을 수 있습니까?
안드로이드 개발자

18

실제 90 % 계산 솔루션 :

@Override public void onStart() {
   Dialog dialog = getDialog();
   if (dialog != null) {
     dialog.getWindow()
        .setLayout((int) (getScreenWidth(getActivity()) * .9), ViewGroup.LayoutParams.MATCH_PARENT);
   }
}

여기서는 getScreenWidth(Activity activity)다음과 같이 정의됩니다 (Utils 클래스에 가장 적합).

public static int getScreenWidth(Activity activity) {
   Point size = new Point();
   activity.getWindowManager().getDefaultDisplay().getSize(size);
   return size.x;
}

대화와 같은 기능을한다 appcompatactivity에 대한 매력처럼 작동

나는 이것에 대해 배열 인덱스를 벗어났습니다 :(
Dr. aNdRO

@ Dr.aNdRO 어떻게? 어느 라인? 이 코드가 확실하고 다른 코드가 아닌가?
Mehmet K

.setLayout ()이 줄에 도착했습니다. 랩 콘텐츠로 변경하면 제대로 작동합니다.
Dr. aNdRO


10

장치 너비를 가져옵니다.

public static int getWidth(Context context) {
    DisplayMetrics displayMetrics = new DisplayMetrics();
    WindowManager windowmanager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
    windowmanager.getDefaultDisplay().getMetrics(displayMetrics);
    return displayMetrics.widthPixels;
}

대화 상자를 장치의 90 %로 만드는 데 사용하십시오.

Dialog filterDialog = new Dialog(context, R.style.searchsdk_FilterDialog);

filterDialog.setContentView(R.layout.searchsdk_filter_popup);
initFilterDialog(filterDialog);
filterDialog.setCancelable(true);
filterDialog.getWindow().setLayout(((getWidth(context) / 100) * 90), LinearLayout.LayoutParams.MATCH_PARENT);
filterDialog.getWindow().setGravity(Gravity.END);
filterDialog.show();

8

자, 이것을 표시하기 전에 대화 상자의 높이와 너비를 설정해야합니다 (dialog.show ())

따라서 다음과 같이하십시오.

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

//then

dialog.show()

나를 위해 치수를 설정하지 않습니다. API> = 21.
Odys

7

내가 생각할 수있는 가장 간단한 방법은

대화 상자가 수직 LinearLayout으로 만들어진 경우 화면 높이 전체를 차지하는 "높이 채우기"더미보기를 추가하십시오.

예를 들어-

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:orientation="vertical"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:weightSum="1">

    <EditText
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:id="@+id/editSearch" />

    <ListView
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       android:id="@+id/listView"/>


   <!-- this is a dummy view that will make sure the dialog is highest -->
   <View
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       android:layout_weight="1"/>

</LinearLayout>

통지 android:weightSum="1"있는 LinearLayout의 속성에서와 android:layout_weight="1"더미보기의 속성에서을


좋은! 이것은 onPageFinished 후에 내 웹뷰가 매우 짧게 시작하여 전체 높이로 확장되는 것을 방지합니다. 명성!
낸시

6

자, 이것을 표시하기 전에 대화 상자의 높이와 너비를 설정해야합니다 (dialog.show ())

따라서 다음과 같이하십시오.

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

//then

dialog.show()

이 코드를 가져 와서 약간 변경했습니다.

dialog.getWindow().setLayout((int)(MapGeaGtaxiActivity.this.getWindow().peekDecorView().getWidth()*0.9),(int) (MapGeaGtaxiActivity.this.getWindow().peekDecorView().getHeight()*0.9));

그러나 장치의 위치가 변경되면 대화 상자 크기가 변경 될 수 있습니다. 메트릭이 변경 될 때 자체적으로 처리해야 할 수도 있습니다. PD : peekDecorView, 활동의 레이아웃이 올바르게 초기화되었음을 나타냅니다. 그렇지 않으면 사용할 수 있습니다

DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int height = metrics.heightPixels;
int wwidth = metrics.widthPixels;

화면 크기를 얻기 위해


6

대화 상자 객체를 초기화하고 내용보기를 설정 한 후. 이것을하고 즐기십시오.

(폭 90 %가 툴바 위에 있기 때문에 너비 90 %, 높이 70 %로 설정하는 경우)

DisplayMetrics displaymetrics = new DisplayMetrics();
getActivity().getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
int width = (int) ((int)displaymetrics.widthPixels * 0.9);
int height = (int) ((int)displaymetrics.heightPixels * 0.7);
d.getWindow().setLayout(width,height);
d.show();

4

내 대답은 koma를 기반으로하지만 onStart를 재정의 할 필요는 없지만 onfrag는 새 조각을 만들 때 기본적으로 거의 항상 재정의됩니다.

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.your_fragment_layout, container);

    Rect displayRectangle = new Rect();
    Window window = getDialog().getWindow();
    window.getDecorView().getWindowVisibleDisplayFrame(displayRectangle);

    v.setMinimumWidth((int)(displayRectangle.width() * 0.9f));
    v.setMinimumHeight((int)(displayRectangle.height() * 0.9f));

    return v;
}

Android 5.0.1에서 테스트했습니다.


3

다음은 사용자 정의 대화 상자 너비에 대한 변형입니다.

DisplayMetrics displaymetrics = new DisplayMetrics();
mActivity.getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
int width = (int) (displaymetrics.widthPixels * (ThemeHelper.isPortrait(mContext) ? 0.95 : 0.65));

WindowManager.LayoutParams params = getWindow().getAttributes();
params.width = width;
getWindow().setAttributes(params);

따라서 기기 방향 (ThemeHelper.isPortrait(mContext) ) 대화 상자의 너비는 95 % (세로 모드) 또는 65 % (가로)입니다. 저자가 요구 한 것이 조금 더 있지만 누군가에게 유용 할 수 있습니다.

Dialog에서 확장되는 클래스를 만들고이 코드를 onCreate(Bundle savedInstanceState)메서드에 넣어야합니다 .

대화 상자의 높이의 코드는 이와 유사해야합니다.


무엇입니까 ThemeHelper? 내 프로젝트에서이 수업을 이용할 수 없습니다.
Nemi

ThemeHelper내 요구에 대한 도우미 수업 일뿐입니다. 이 메서드 isPortrait(Context)는 장치의 화면 방향이 세로인지 가로인지를 반환합니다.
Clans

일단 대화 상자가로드 된 다음 방향을 변경하면 onCreate
iBabur

3
public static WindowManager.LayoutParams setDialogLayoutParams(Activity activity, Dialog dialog)
    {
        try 
        {
            Display display = activity.getWindowManager().getDefaultDisplay();
            Point screenSize = new Point();
            display.getSize(screenSize);
            int width = screenSize.x;

            WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams();
            layoutParams.copyFrom(dialog.getWindow().getAttributes());
            layoutParams.width = (int) (width - (width * 0.07) ); 
            layoutParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
            return layoutParams;
        } 
        catch (Exception e)
        {
            e.printStackTrace();
            return null;
        }
    }

3

위의 많은 답변은 좋지만 완전히 나를 위해 일한 것은 없습니다. 그래서 나는 @ nmr의 대답을 결합하고 이것을 얻었습니다.

final Dialog d = new Dialog(getActivity());
        //  d.getWindow().setBackgroundDrawable(R.color.action_bar_bg);
        d.requestWindowFeature(Window.FEATURE_NO_TITLE);
        d.setContentView(R.layout.dialog_box_shipment_detail);

        WindowManager wm = (WindowManager) getActivity().getSystemService(Context.WINDOW_SERVICE); // for activity use context instead of getActivity()
        Display display = wm.getDefaultDisplay(); // getting the screen size of device
        Point size = new Point();
        display.getSize(size);
        int width = size.x - 20;  // Set your heights
        int height = size.y - 80; // set your widths

        WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
        lp.copyFrom(d.getWindow().getAttributes());

        lp.width = width;
        lp.height = height;

        d.getWindow().setAttributes(lp);
        d.show();

3
    ...
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    Dialog d = builder.create(); //create Dialog
    d.show(); //first show

    DisplayMetrics metrics = new DisplayMetrics(); //get metrics of screen
    getActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics);
    int height = (int) (metrics.heightPixels*0.9); //set height to 90% of total
    int width = (int) (metrics.widthPixels*0.9); //set width to 90% of total

    d.getWindow().setLayout(width, height); //set layout

3
레이아웃을 설정하기 전에 대화 상자를 표시하면 나에게 효과적입니다.
Angel Koh

2

당신이 사용하는 경우 제약 레이아웃 , 당신은 화면의 비율을 채우기 위해, 그것은 내부의보기를 설정할 수 있습니다 :

layout_constraintWidth_percent = "0.8"

예를 들어 대화 상자 안에 ScrollView가 있고 화면 높이의 백분율로 설정하려는 경우. 다음과 같습니다.

<ScrollView
            android:id="@+id/scrollView"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            app:layout_constraintHeight_percent="0.8">

그것이 누군가를 돕기를 바랍니다!


2

AlertDialog에이 테마를 지정하십시오.

<style name="DialogTheme" parent="Theme.MaterialComponents.Light.Dialog.MinWidth">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="android:windowMinWidthMajor">90%</item>
    <item name="android:windowMinWidthMinor">90%</item>
</style>

1

다음은 저에게 도움이되는 간단한 답변입니다 (API 8 및 API 19에서 테스트 됨).

Dialog mDialog;
View   mDialogView;
...
// Get height
int height = mDialog.getWindow()
.getWindowManager().getDefaultDisplay()
.getHeight();

// Set your desired padding (here 90%)
int padding = height - (int)(height*0.9f);

// Apply it to the Dialog
mDialogView.setPadding(
// padding left
0,
// padding top (90%)
padding, 
// padding right
0, 
// padding bottom (90%)
padding);

1
dialog.getWindow().setLayout(WindowManager.LayoutParams.MATCH_PARENT,WindowManager.LayoutParams.WRAP_CONTENT);

1

사용자 정의 가능한 대화 상자를 표시하려면 CustomDialog와 같은 스타일 @ style.xml을 사용해야합니다.

<style name="CustomDialog" parent="@android:style/Theme.DeviceDefault.Light.Dialog">
        <item name="android:windowIsTranslucent">true</item>
        <item name="android:windowBackground">@color/colorWhite</item>
        <item name="android:editTextColor">@color/colorBlack</item>
        <item name="android:windowContentOverlay">@null</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:backgroundDimEnabled">true</item>
        <item name="android:windowIsFloating">true</item>
        <item name="android:windowSoftInputMode">stateUnspecified|adjustPan</item>
    </style>

Activity.java 에서이 스타일을 사용하십시오.

Dialog dialog= new Dialog(Activity.this, R.style.CustomDialog);
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        dialog.setContentView(R.layout.custom_dialog);

custom_dialog.xml은 레이아웃 디렉토리 안에 있어야합니다.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="10dp"
    android:paddingRight="10dp">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text=""
        android:textSize="20dp"
        android:id="@+id/tittle_text_view"
        android:textColor="@color/colorBlack"
        android:layout_marginTop="20dp"
        android:layout_marginLeft="10dp"/>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:layout_marginLeft="20dp"
        android:layout_marginBottom="10dp"
        android:layout_marginTop="20dp"
        android:layout_marginRight="20dp">

        <EditText
            android:id="@+id/edit_text_first"
            android:layout_width="50dp"
            android:layout_height="match_parent"
            android:hint="0"
            android:inputType="number" />

        <TextView
            android:id="@+id/text_view_first"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_marginLeft="5dp"
            android:gravity="center"/>

        <EditText
            android:id="@+id/edit_text_second"
            android:layout_width="50dp"
            android:layout_height="match_parent"
            android:hint="0"
            android:layout_marginLeft="5dp"
            android:inputType="number" />

        <TextView
            android:id="@+id/text_view_second"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_marginLeft="5dp"
            android:gravity="center"/>

    </LinearLayout>

</LinearLayout>

0
    final AlertDialog alertDialog;

    LayoutInflater li = LayoutInflater.from(mActivity);
    final View promptsView = li.inflate(R.layout.layout_dialog_select_time, null);

    RecyclerView recyclerViewTime;
    RippleButton buttonDone;

    AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(mActivity);
    alertDialogBuilder.setView(promptsView);

    // create alert dialog
    alertDialog = alertDialogBuilder.create();

    /**
     * setting up window design
     */
    alertDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);


    alertDialog.show();

    DisplayMetrics metrics = new DisplayMetrics(); //get metrics of screen
    mActivity.getWindowManager().getDefaultDisplay().getMetrics(metrics);
    int height = (int) (metrics.heightPixels * 0.9); //set height to 90% of total
    int width = (int) (metrics.widthPixels * 0.9); //set width to 90% of total

    alertDialog.getWindow().setLayout(width, height); //set layout
    recyclerViewTime = promptsView.findViewById(R.id.recyclerViewTime);


    DialogSelectTimeAdapter dialogSelectTimeAdapter = new DialogSelectTimeAdapter(this);
    RecyclerView.LayoutManager linearLayoutManager = new LinearLayoutManager(this);
    recyclerViewTime.setLayoutManager(linearLayoutManager);
    recyclerViewTime.setAdapter(dialogSelectTimeAdapter);

    buttonDone = promptsView.findViewById(R.id.buttonDone);
    buttonDone.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            alertDialog.dismiss();

        }
    });

사용자 정의 대화 상자가있는 사용자 정의 대화 상자
Neelu Agrawal
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.