경고 대화 상자를 화면 크기의 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:minWidth및 android: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.