Как сделать так, чтобы диалог оповещения занимал 90% размера экрана?

305

Я могу создавать и отображать настраиваемые диалоговые окна предупреждений просто отлично, но даже android:layout_width/height="fill_parent"в этом случае в диалоговом окне xml оно не больше, чем его содержимое.

То, что я хочу, это диалог, который заполняет весь экран, за исключением, может быть, отступа в 20 пикселей. Затем изображение, которое является частью диалога, автоматически растягивается до полного размера диалога с помощью fill_parent.

Fabian
источник

Ответы:

355

По словам разработчиков платформы Android Дайан Hackborn в этой группе посте обсуждения, Диалоги установить ширину макета верхнего уровня их окна и высоту 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
Я не понимаю ответ, или он не работает для меня.
Дэвид Моралес
4
Похоже, это не правда, что диалоги имеют ширину wrap_content. Вещи становятся более узкими и отрезанными. Кажется, что в диалоге установлена ​​максимальная заданная ширина.
Питер Айтай
21
Я не понимаю, как это отвечает на вопрос? Код, предложенный @nmr, делает диалог равным 90% экрана? Потому что я не вижу этого. Диалог просто установлен на fill_width, так что это 100%, а не 90%, верно?
Тед
4
@Ted, у темы, используемой AlertDialog, есть запас. Таким образом, результат не достигает края экрана, он заполняет около 90%. (Это точно не совсем 90%, просто эстетическое приближение 90%)
ЯМР
8
Просто вызовите d.getWindow (). GetAttributes (). Width = WindowManager.LayoutParams.FILL_PARENT; перед вызовом show () добьется цели. Кроме того, у меня были некоторые проблемы с данным методом, так как фон диалога становился непрозрачным. Как только удалили copyFrom ((), проблема исправилась сама собой.
Алексей
183

Попробуйте обернуть свой собственный диалог RelativeLayoutвместо LinearLayout. Это сработало для меня.

cvarsendan
источник
2
это касается и меня. Может кто-нибудь объяснить причину !!
Розина
Так должен работать RelativeLayout или счастливый случай, который может уйти?
Yetti99
10
Это 2019 год, и это все еще работает. Ура! Действительно должен быть принятый ответ.
TaylanUB
@cvarsendan не могли бы вы объяснить ответ? Это сработало для меня. Спасибо!
Жако
Боже мой, мой RecyclerView никогда не отображает полную высоту, или его высота всегда равна 0, и с этим он отлично работает после дня, пытаясь найти много решений. Почему RelativeLayout, а другие?
Легор
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% экрана. Есть идеи почему? Я делаю это на Motorola Xoom с 4.0
Райан Грей
@RyanGray Это работает для меня на Samsung Nexus S с обновленной ОС. Без дополнительной информации я, к сожалению, не могу вам помочь.
Кома
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>
jqpubliq
источник
3
Да, с этим я могу установить определенный размер, но я хочу, чтобы он был размером экрана минус отступ, например, 20 пикселей. Или ширина = 90% ширины экрана.
Фабиан
4
Пиксели, не зависящие от плотности, всегда масштабируются так, чтобы любой экран имел разрешение 320x480 точек на дюйм, так что при просмотре 300x460 точек на дюйм во всех случаях было бы добавление 20 точек на дюйм. В качестве альтернативы вы можете найти размер экрана следующим образом: Display display = ((WindowManager) getSystemService (Context.WINDOW_SERVICE)). GetDefaultDisplay (); int width = display.getWidth (); и установите maxWidth и maxHeight соответственно.
jqpubliq
5
Хм от декументирования я понимаю концепцию дп. Но что, если соотношение сторон экрана составляет 16: 9 или 4: 3? Будет ли неровно растягиваться?
Фабиан
2
Нет, разрешение dp будет только 320x480, если соотношение сторон экрана 2: 3, поэтому этот метод не будет работать.
Mhsmith
21
что, почему этот ответ проголосовал так много раз? Это ужасное решение, поскольку оно не имеет никакого отношения к размеру устройства, которое использует пользователь.
Джин
71

Еще проще просто сделать это:

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

alertDialog.getWindow().setLayout(width, height);
FOMDeveloper
источник
незначительное примечание: getResources () доступен в контексте Activity.
nat101
Этот ответ был очень полезен для сценария попытки восстановить диалоговое окно onCreateпосле поворота устройства. В этом случае мы не можем полагаться на ширину / высоту чего-либо в макете, потому что это еще не было создано; но физическая ширина / высота устройства все еще доступны.
Тим Бигелейзен
5
Если вы хотите изменить только одно измерение, передайте в ViewGroup.LayoutParams.WRAP_CONTENTкачестве одного из параметров
Вадим Котов
Это лучшее решение для меня.
Текам Сутар
53
dialog.getWindow().setLayout(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
Элвис
источник
1
Это сработало для меня и было легко перевести на MonoDroid, который работал следующим образом (где d - новый диалог): d.Window.SetLayout (WindowManagerLayoutParams.FillParent, WindowManagerLayoutParams.FillParent);
TheJerm
10
Но 90% это не то же самое, что 100%. FILL_PARENT указывает на заполнение всей ширины, 100%, а не 90%. Правильно?
Тед
@Ted Ты прав. Вы можете заменить FILL_PARENTшириной, рассчитанной как 90% ширины текущего дисплея. Но мне нравится ответ, потому что он легче, чем другие.
HRJ
27

Все остальные ответы здесь имеют смысл, но они не отвечают требованиям Фабиана. Вот мое решение. Возможно, это не идеальное решение, но оно работает для меня. Он показывает диалоговое окно в полноэкранном режиме, но вы можете указать отступ сверху, снизу, слева или справа.

Сначала поместите это в ваш файл 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

RES / значения / 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();

Заключение: я попытался переопределить тему диалога в файле styles.xml с именем CustomDialog. Он переопределяет макет окна диалога и дает мне возможность установить отступы и изменить непрозрачность фона. Возможно, это не идеальное решение, но я надеюсь, что оно поможет вам .. :)

icaneatclouds
источник
это работает на желе, пока я не смог проверить его на других булидах
Nasz Njoka Sr.
Кажется, самое чистое и элегантное решение. Работает на Киткат 4.4 и 4.3.
Дэвид
У меня есть собственный диалог, и НИЧЕГО не работало, пока я не увидел, что волшебство, ВСЕ МАГИЯ в настраиваемом диалоге (который расширяется DialogFragment) приходит, когда вы делаете: Dialog customDialog = new Dialog(context, STYLE);спасибо, ДЕЙСТВИТЕЛЬНО, спасибо.
Sierisimo
Приятно
Это работает как очарование для диалогового окна! (вы также можете определить Black60Percent, чтобы исходное окно было серым). К сожалению, побочным эффектом является то, что все мои представления в диалоге унаследовали отступы, которые я установил для диалога ....
runholen
25

Вы можете использовать процент для (ПРОСТО) ширины диалогового окна.

Посмотрите на этот пример из 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>

Все, что вам нужно сделать, это расширить эту тему и изменить значения для «Major» и «Minor» на 90% вместо 65%.

С уважением.

Жоао Гаваззи
источник
1
Для того, чтобы использовать этот диалог просто передать свой собственный стиль в диалоговом конструктор строитель :)
sosite
23

Следующее работало хорошо для меня:

    <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);
Deliriom
источник
4
Лучший ответ на данный момент. Отлично сработало для меня!
Паван
Интересно: как я могу получить значение таких специальных измерений, которые задаются в процентах, через код?
Android-разработчик
19

Решение с фактическим расчетом 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 как? Какая линия? Вы уверены, что это кусок кода, а не smt еще?
Мехмет К
.setLayout () Я получаю эту строку, когда я изменяю ее на WRAP CONTENT, это прекрасно работает
Dr.AndRO
См. Также: stackoverflow.com/questions/36777584/…
Mr-IDE
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();
Gopinath
источник
8

Ну, вы должны установить высоту и ширину вашего диалога, прежде чем показать это (dialog.show ())

Итак, сделайте что-то вроде этого:

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

//then

dialog.show()
shontauro
источник
Не устанавливает размеры для меня. API> = 21.
Одис
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% для ширины и 70% для высоты, потому что ширина 90% будет над панелью инструментов)

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

Мой ответ основан на комах, но он не требует переопределения onStart, а только onCreateView, который почти всегда переопределяется по умолчанию при создании новых фрагментов.

@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? У меня нет этого класса в моем проекте.
Неми
ThemeHelperэто просто вспомогательный класс для моих нужд. Его метод isPortrait(Context)возвращает ориентацию экрана устройства - книжную или альбомную.
Кланы
Это будет иметь проблему, если после загрузки диалога, а затем мы изменим ориентацию, он сохранит свои начальные настройки в 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
Guihgo
источник
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>
karimaounn
источник
2

Вам необходимо использовать style @ style.xml, например CustomDialog, для отображения настраиваемого диалогового окна.

<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>
Nuwan Withanage
источник
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);
Tanasis
источник
1
dialog.getWindow().setLayout(WindowManager.LayoutParams.MATCH_PARENT,WindowManager.LayoutParams.WRAP_CONTENT);
Саи Гопи Н
источник
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();

        }
    });
Нилу Агравал
источник
Пользовательский диалог с диалоговым окном Пользовательская высота
Нилу Агравал