Làm cách nào để tạo hộp thoại cảnh báo lấp đầy 90% kích thước màn hình?


305

Tôi có thể tạo và hiển thị một hộp thoại cảnh báo tùy chỉnh tốt nhưng ngay cả khi tôi có android:layout_width/height="fill_parent"trong hộp thoại xml, nó chỉ lớn bằng nội dung.

Những gì tôi muốn là hộp thoại lấp đầy toàn bộ màn hình ngoại trừ có thể là một miếng đệm 20 pixel. Sau đó, hình ảnh là một phần của hộp thoại sẽ tự động kéo dài đến kích thước hộp thoại đầy đủ với fill_parent.

Câu trả lời:


355

Theo nhà phát triển nền tảng Android Dianne Hackborn trong này Tập đoàn Bưu thảo luận, Dialogs thiết lập chiều rộng bố trí cấp cao nhất Window của họ và chiều cao WRAP_CONTENT. Để làm cho Hộp thoại lớn hơn, bạn có thể đặt các tham số đó thành MATCH_PARENT.

Mã trình diễn:

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

Lưu ý rằng các thuộc tính được đặt sau khi Hộp thoại được hiển thị. Hệ thống rất khó hiểu khi chúng được thiết lập. (Tôi đoán rằng công cụ bố trí phải đặt chúng lần đầu tiên khi hộp thoại được hiển thị hoặc một cái gì đó.)

Sẽ tốt hơn nếu làm điều này bằng cách mở rộng Theme.Dialog, sau đó bạn sẽ không phải chơi một trò chơi đoán về thời điểm gọi setAttribution. (Mặc dù nó là một chút công việc để có hộp thoại tự động áp dụng một ánh sáng thích hợp hoặc chủ đề tối, hoặc các chủ đề Honeycomb Holo. Điều đó có thể được thực hiện theo http://developer.android.com/guide/topics/ui/themes. html # ChọnATheme )


5
Cho dù tôi không hiểu câu trả lời, hoặc nó không hoạt động với tôi.
David Morales

4
Dường như không đúng khi các hộp thoại được bao bọc rộng. Mọi thứ trở nên hẹp hơn và bị cắt đứt. Hộp thoại dường như được đặt thành một số chiều rộng tối đa được xác định trước.
Peter Ajtai

21
Tôi không hiểu làm thế nào điều này trả lời câu hỏi? Mã được đề xuất bởi @nmr có làm cho Hộp thoại chiếm 90% màn hình không? Vì tôi không thấy nó. Hộp thoại chỉ được đặt thành fill_creen, vì vậy đó là 100% chứ không phải 90%, phải không?
Ted

4
@Ted, chủ đề được sử dụng bởi AlertDialog có lề. Vì vậy, kết quả không đạt đến cạnh của màn hình, nó lấp đầy khoảng 90% của màn hình. (Nó chắc chắn không chính xác 90%, chỉ là xấp xỉ 90% về mặt thẩm mỹ)
nmr

8
Chỉ cần gọi d.getWindow (). GetAttribut (). Width = WindowManager.LayoutParams.FILL_PARENT; trước khi gọi show () sẽ thực hiện thủ thuật. Ngoài ra, tôi đã gặp một số vấn đề với phương thức đã cho vì nền của hộp thoại trở nên không trong suốt. Ngay khi gỡ bỏ bản sao Từ ((), sự cố đã tự khắc phục.
Alexey

183

Hãy thử gói bố trí hộp thoại tùy chỉnh của bạn vào RelativeLayoutthay vì LinearLayout. Điều đó làm việc cho tôi.


2
nó cũng có cho tôi Bất cứ ai có thể giải thích lý do !!
Rozina

Đây có phải là cách RelativeLayout được cho là hoạt động hay một tai nạn hạnh phúc có thể biến mất?
Yetti99

10
Đó là năm 2019 và điều này vẫn hoạt động. Chúc mừng! Nên thực sự là câu trả lời được chấp nhận.
TaylanUB

@cvarsendan bạn có thể giải thích câu trả lời? Điều đó làm việc cho tôi. Cảm ơn bạn!
Jaco

OMG, My RecyclerView không bao giờ hiển thị chiều cao đầy đủ hoặc chiều cao luôn là 0 và sau đó, nó hoạt động hoàn hảo sau một ngày thử nhiều giải pháp. Tại sao RelativeLayout mà lại khác?
leegor

85

Chỉ định FILL_PARENT trên cửa sổ hộp thoại, như những người khác đã đề xuất, không hoạt động với tôi (trên Android 4.0.4), vì nó chỉ kéo dài nền hộp thoại màu đen để lấp đầy toàn màn hình.

Những gì hoạt động tốt là sử dụng giá trị hiển thị tối thiểu, nhưng chỉ định nó trong mã, để hộp thoại chiếm 90% màn hình.

Vì thế:

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

Nói chung chỉ điều chỉnh chiều rộng là đủ trong hầu hết các trường hợp.


Điều này dường như không hoạt động hoàn toàn trên 4.0 trở lên. Nó không lấp đầy 90% màn hình. Bất cứ ý tưởng tại sao? Tôi đang làm điều này trên Motorola Xoom với 4.0
Ryan Gray

@RyanGray Nó hoạt động với tôi trên Samsung Nexus S với hệ điều hành được cập nhật. Không có thông tin bổ sung, tôi rất tiếc không thể giúp bạn.
koma

83

Đặt android:minWidthandroid:minHeighttrong chế độ xem tùy chỉnh xml của bạn. Những thứ này có thể buộc cảnh báo không chỉ bọc kích thước nội dung. Sử dụng một khung nhìn như thế này sẽ làm điều đó:

<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
Có với điều này tôi có thể đặt nó thành một kích thước cụ thể, nhưng tôi muốn nó có kích thước màn hình trừ đi phần đệm, ví dụ 20 pixel. Hoặc chiều rộng = 90% băng thông màn hình.
Fabian

4
Mật độ pixel độc lập của tôi luôn được chia tỷ lệ sao cho bất kỳ màn hình nào có kích thước 320x480dp, vì vậy, chế độ xem 300x460dp sẽ là phần đệm 20dp trong mọi trường hợp. Ngoài ra, bạn có thể tìm thấy kích thước của màn hình như thế này: Display display = ((WindowManager) getSystemService (Context.WINDOW_SERVICE)). GetDefaultDisplay (); int width = display.getWidth (); và đặt maxWidth và maxHeight tương ứng.
jqpubliq

5
Hmm từ sự phân tách tôi hiểu khái niệm về dp. Nhưng nếu tỷ lệ màn hình là 16: 9 hoặc 4: 3 thì sao? Dp sẽ được kéo dài không đều?
Fabian

2
Không, độ phân giải dp sẽ chỉ là 320x480 nếu tỷ lệ màn hình là 2: 3, vì vậy phương pháp này sẽ không hoạt động.
mhsmith

21
cái gì, tại sao câu trả lời này được nâng cấp rất nhiều lần? Đây là một giải pháp khủng khiếp vì nó hoàn toàn không liên quan đến kích thước thiết bị mà người dùng đang sử dụng.
Jin

70

Thậm chí đơn giản hơn chỉ cần làm điều này:

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

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

lưu ý nhỏ: getResource () có sẵn trong ngữ cảnh Activity.
nat101

Câu trả lời này rất hữu ích cho kịch bản cố gắng tạo lại hộp thoại onCreatesau khi xoay thiết bị. Trong trường hợp này, chúng tôi không thể dựa vào chiều rộng / chiều cao của bất kỳ thứ gì trong bố cục, vì nó chưa được tạo; nhưng chiều rộng / chiều cao vật lý của thiết bị vẫn có sẵn.
Tim Biegeleisen

4
Nếu bạn chỉ muốn thay đổi một chiều, hãy chuyển qua ViewGroup.LayoutParams.WRAP_CONTENTmột trong các tham số
Vadim Kotov

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

1
Điều này làm việc cho tôi và rất dễ dịch sang MonoDroid, nó hoạt động như vậy (trong đó d là một Hộp thoại mới): d.Window.SetLayout (WindowManagerLayoutParams.FillParent, WindowManagerLayoutParams.FillParent);
theJerm

10
Nhưng 90% không giống với 100%. FILL_PARENT sẽ chỉ ra để lấp đầy toàn bộ chiều rộng, 100%, không phải 90%. Đúng?
Ted

@Ted Bạn nói đúng. Bạn có thể thay thế FILL_PARENTbằng chiều rộng được tính bằng 90% chiều rộng của màn hình hiện tại. Nhưng tôi thích câu trả lời vì nó dễ hơn những người khác.
HRJ

26

Tất cả các câu trả lời khác ở đây có ý nghĩa, nhưng nó không đáp ứng những gì Fabian cần. Đây là một giải pháp của tôi. Nó có thể không phải là giải pháp hoàn hảo nhưng nó hiệu quả với tôi. Nó hiển thị một hộp thoại trên toàn màn hình nhưng bạn có thể chỉ định một phần đệm ở trên, dưới, trái hoặc phải.

Đầu tiên hãy đặt cái này vào res / value / style.xml của bạn:

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

Như bạn có thể thấy tôi có android: paddingTop = 20dp về cơ bản là những gì bạn cần. Các android: windowBackground = @ màu / Black0Percent chỉ là một mã màu tuyên bố trên color.xml của tôi

res / value / color.xml

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

Mã màu đó chỉ đóng vai trò là hình nộm để thay thế nền cửa sổ mặc định của Hộp thoại bằng màu trong suốt 0%.

Tiếp theo xây dựng bố cục hộp thoại tùy chỉnh res / layout / hộp thoại

<?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>

Cuối cùng, đây là hộp thoại của chúng tôi đặt chế độ xem tùy chỉnh sử dụng hộp thoại của chúng tôi:

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();

Kết luận: Tôi đã cố gắng ghi đè chủ đề của hộp thoại trong tệp kiểu tệp có tên CustomDialog. Nó ghi đè lên bố cục cửa sổ Hộp thoại và cho tôi cơ hội đặt phần đệm và thay đổi độ mờ của nền. Nó có thể không phải là giải pháp hoàn hảo nhưng tôi hy vọng nó sẽ giúp bạn .. :)


bây giờ nó hoạt động cho sứa. Tôi đã không thể kiểm tra các loại thuốc phiện khác
Nasz Njoka Sr.

Có vẻ là giải pháp sạch sẽ và thanh lịch nhất. Hoạt động trên Kitkat 4.4 và 4.3.
David

Tôi có một hộp thoại tùy chỉnh và KHÔNG CÓ hoạt động cho đến khi tôi thấy điều này, điều kỳ diệu, TẤT CẢ CÁC BÀI VIẾT trên hộp thoại tùy chỉnh (kéo dài DialogFragment) xuất hiện khi bạn thực hiện: Dialog customDialog = new Dialog(context, STYLE);cảm ơn, THỰC SỰ, cảm ơn.
Sierisimo

Thật tốt khi biết điều đó sẽ giúp :)
icaneatclouds

Điều này hoạt động như một nét duyên dáng cho cửa sổ hộp thoại! (bạn cũng có thể định nghĩa một Black60Percent có cửa sổ ban đầu màu xám) Các tác dụng phụ đáng tiếc là tất cả các quan điểm của tôi trong hộp thoại kế thừa miếng đệm không tôi đặt cho hộp thoại ....
runholen

25

Bạn có thể sử dụng tỷ lệ phần trăm cho chiều rộng hộp thoại (JUST).

Nhìn vào ví dụ này từ 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>

Tất cả những gì bạn cần làm là mở rộng chủ đề này và thay đổi các giá trị cho "Chính" và "Nhỏ" thành 90% thay vì 65%.

Trân trọng.


1
Để sử dụng điều này với hộp thoại, chỉ cần chuyển kiểu tùy chỉnh của bạn trong hàm tạo của trình tạo hộp thoại :)
nằm trong

23

Sau đây làm việc tốt cho tôi:

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

(lưu ý: windowMinWidthMajor / Nhỏ như được đề xuất trong các câu trả lời trước không thực hiện được mẹo. Các hộp thoại của tôi tiếp tục thay đổi kích thước tùy thuộc vào nội dung)

và sau đó:

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

4
Câu trả lời tốt nhất cho đến nay. Làm việc hoàn hảo cho tôi!
Pawan

Tôi tự hỏi: làm thế nào tôi có thể nhận được giá trị của các kích thước đặc biệt như vậy, được đặt theo tỷ lệ phần trăm, thông qua mã?
nhà phát triển Android

19

Giải pháp với tính toán thực tế 90%:

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

trong đó getScreenWidth(Activity activity)được định nghĩa như sau (tốt nhất đặt trong lớp Utils):

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

hoạt động như bùa mê cho tính tương thích ứng dụng sẽ hoạt động như hộp thoại

Tôi nhận được chỉ số mảng ngoài giới hạn về điều này :(
Tiến sĩ aNdRO

@ Dr.aNdRO thế nào? Dòng nào? Bạn có chắc đây là đoạn mã này chứ không phải ai khác?
Mehmet K

.setLayout () Tôi đang nhận được dòng này, Khi tôi đổi nó thành WRAP NỘI DUNG, nó hoạt động tốt
Tiến sĩ aNdRO


10

Lấy chiều rộng của thiết bị:

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;
}

sau đó sử dụng nó để tạo hộp thoại 90% thiết bị,

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

Chà, bạn phải đặt chiều cao và chiều rộng của hộp thoại trước để hiển thị điều này (hộp thoại.show ())

vì vậy, làm một cái gì đó như thế này:

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

//then

dialog.show()

Không đặt kích thước cho tôi. API> = 21.
Odys

7

Cho đến nay, cách đơn giản nhất tôi có thể nghĩ đến -

Nếu hộp thoại của bạn được tạo từ một linearLayout dọc, chỉ cần thêm chế độ xem giả "lấp đầy chiều cao", nó sẽ chiếm toàn bộ chiều cao của màn hình.

Ví dụ -

<?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>

Lưu ý các android:weightSum="1"thuộc tính của linearLayout và các android:layout_weight="1"thuộc tính của Chế độ xem giả


Đẹp! Điều này giữ cho webview của tôi bắt đầu cực kỳ ngắn và mở rộng đến chiều cao đầy đủ sau khi onPageFinished. Thanh danh!
Nancy

6

Chà, bạn phải đặt chiều cao và chiều rộng của hộp thoại trước để hiển thị điều này (hộp thoại.show ())

vì vậy, làm một cái gì đó như thế này:

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

//then

dialog.show()

Lấy mã này, tôi đã thực hiện một số thay đổi:

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

tuy nhiên, kích thước hộp thoại có thể thay đổi khi thiết bị thay đổi vị trí. Có lẽ bạn cần tự xử lý khi số liệu thay đổi. PD: peekDecorView, ngụ ý rằng bố cục trong hoạt động được khởi tạo đúng cách nếu không bạn có thể sử dụng

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

để có được kích thước màn hình


6

Sau khi khởi tạo đối tượng hộp thoại của bạn và đặt chế độ xem nội dung. Làm điều này và tận hưởng.

(trong trường hợp tôi đang đặt 90% cho chiều rộng và 70% cho chiều cao vì chiều rộng 90% nó sẽ nằm trên thanh công cụ)

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

Câu trả lời của tôi dựa trên koma nhưng nó không yêu cầu ghi đè onStart mà chỉ onCreateView gần như luôn bị ghi đè theo mặc định khi bạn tạo các đoạn mới.

@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;
}

Tôi đã thử nghiệm nó trên Android 5.0.1.


3

Đây là biến thể của tôi cho chiều rộng của hộp thoại tùy chỉnh:

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

Vì vậy, tùy thuộc vào ThemeHelper.isPortrait(mContext)chiều rộng của hộp thoại định hướng thiết bị ( ) sẽ là 95% (đối với chế độ dọc ) hoặc 65% (đối với ngang). Đó là một chút nữa mà tác giả yêu cầu nhưng nó có thể hữu ích cho ai đó.

Bạn cần tạo một lớp mở rộng từ Hộp thoại và đặt mã này vào onCreate(Bundle savedInstanceState)phương thức của bạn .

Đối với chiều cao của hộp thoại, mã phải tương tự như thế này.


ThemeHelpergì Tôi không có lớp này trong dự án của tôi.
Nemi

ThemeHelperchỉ là một lớp người trợ giúp cho nhu cầu của tôi. Phương thức của nó isPortrait(Context)trả về cho dù hướng màn hình của thiết bị là dọc hay ngang.
Gia tộc

điều này sẽ có vấn đề nếu một khi hộp thoại được tải và sau đó chúng tôi thay đổi hướng, nó sẽ giữ cài đặt ban đầu của nó trong 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

Trên nhiều câu trả lời là tốt nhưng không có câu trả lời nào phù hợp với tôi. Vì vậy, tôi đã kết hợp câu trả lời từ @nmr và có cái này.

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
hiển thị hộp thoại trước khi cài đặt bố cục hoạt động cho tôi.
Angel Koh

2

bạn cần sử dụng một style @ style.xml, chẳng hạn như CustomDialog để hiển thị hộp thoại có thể tùy chỉnh.

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

và sử dụng kiểu này trong Activity.java như thế này

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

và custom_dialog.xml của bạn phải nằm trong thư mục bố trí của bạn

<?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>

2

Nếu bạn đang sử dụng Bố cục ràng buộc , bạn có thể đặt bất kỳ chế độ xem nào bên trong nó, để lấp đầy phần trăm màn hình bằng:

layout_constraintWidth_percent = "0.8"

Vì vậy, ví dụ, nếu bạn có ScrollView bên trong hộp thoại và bạn muốn đặt nó thành phần trăm chiều cao màn hình. Nó sẽ như thế này:

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

Hy vọng nó sẽ giúp được ai đó !!


2

Chỉ cần cung cấp cho AlertDialog chủ đề này

<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

Đây là một câu trả lời ngắn phù hợp với tôi (Đã thử nghiệm trên API 8 và 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);

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();

        }
    });

hộp thoại tùy chỉnh với hộp thoại tùy chỉnh chiều cao
Neelu Agrawal
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.