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

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

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

Ответы [ 24 ]

338 голосов
/ 09 июля 2011

По словам разработчика платформы Android Дайан Хакборн в этом сообщении для дискуссионной группы, диалоги устанавливают ширину и высоту верхнего уровня окна в 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)

141 голосов
/ 24 марта 2013

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

80 голосов
/ 06 июня 2012

Указание 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);

Как правило, в большинстве случаев достаточно регулировки ширины.

78 голосов
/ 22 февраля 2010

Установите 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>
53 голосов
/ 03 ноября 2015

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

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

alertDialog.getWindow().setLayout(width, height);
50 голосов
/ 24 января 2012
dialog.getWindow().setLayout(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
25 голосов
/ 24 января 2014

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

Сначала поместите это в ваш файл 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 - это в основном то, что вам нужно. android: windowBackground = @ color / 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();

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

19 голосов
/ 30 сентября 2014

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

Посмотрите на этот пример из темы Холо:

<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%.

С уважением.

16 голосов
/ 03 февраля 2016

У меня нормально работали:

    <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);
15 голосов
/ 15 июня 2016

Решение с фактическим расчетом 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...