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

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

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

Ответы [ 24 ]

7 голосов
/ 27 февраля 2012

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

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

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

//then

dialog.show()
6 голосов
/ 08 июня 2015

Самый простой способ, который я могу себе представить, -

Если ваш диалог сделан из вертикальной 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" в атрибутах фиктивного представления

5 голосов
/ 16 марта 2018

Получить ширину устройства:

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();
4 голосов
/ 17 апреля 2016

После инициализации объекта диалога и настройки просмотра содержимого. Делай это и наслаждайся.

(в случае, если я устанавливаю 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 голосов
/ 15 февраля 2013

Ну, вы должны установить высоту и ширину вашего диалогового окна, прежде чем показывать это (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;

, чтобы получить размер экрана

3 голосов
/ 05 января 2015

Мой ответ основан на комах, но он не требует переопределения 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.

2 голосов
/ 02 сентября 2013
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;
        }
    }
2 голосов
/ 24 мая 2013

Вот мой вариант для ширины настраиваемого диалога:

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

Для высоты диалога код должен быть похож на этот.

2 голосов
/ 14 мая 2015

Над многими из ответов есть хорошие, но ни один из них не сработал для меня полностью.Поэтому я объединил ответ от @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();
2 голосов
/ 03 февраля 2016
    ...
    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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...