Làm cách nào để có được cửa sổ hoạt động kiểu Hộp thoại để lấp đầy màn hình?


142

Tôi đang sử dụng một hoạt động với bộ chủ đề hộp thoại và tôi muốn nó ở chế độ toàn màn hình. Tôi đã thử tất cả mọi thứ, thậm chí đi qua WindowManager để mở rộng cửa sổ thành toàn bộ chiều rộng và chiều cao bằng tay, nhưng không có gì hoạt động.

Rõ ràng, một cửa sổ hộp thoại (hoặc một hoạt động với chủ đề hộp thoại) sẽ chỉ mở rộng theo nội dung của nó, nhưng ngay cả điều đó không phải lúc nào cũng hoạt động. Chẳng hạn, tôi hiển thị vòng tròn thanh tiến trình có chiều rộng và chiều cao được đặt thành FILL_PARENT (thùng chứa bố cục của nó), nhưng vẫn, hộp thoại bao quanh thanh tiến trình nhỏ hơn nhiều thay vì lấp đầy màn hình.

Phải có cách hiển thị một cái gì đó nhỏ bên trong cửa sổ hộp thoại nhưng nó có mở rộng ra kích thước toàn màn hình mà không thay đổi kích thước nội dung không?


2
Lưu ý thú vị: Khi đặt chiều rộng và chiều cao của bố cục thành giá trị thực bằng pixel, thì hộp thoại sẽ thay đổi kích thước tương ứng. Nhưng khi đặt nó thành FILL_PARENT, thì nó không ...
Matthias

Có thật không? Bố cục của hoạt động là bắt đầu, nó có thẻ Relative hoặc linearLayout gốc được đặt thành chiều cao và chiều rộng của fill_parent không? Tôi đã thực hiện một vài hoạt động với chủ đề hộp thoại và chưa bao giờ gặp sự cố với nó chiếm toàn bộ màn hình.
MattC

Có, hoạt động này được cài đặt tuyến tính tuyến tính thành FILL_PARENT cho cả chiều rộng và chiều cao.
Matthias

Tôi đã giải quyết vấn đề bằng cách sử dụng một cách giải quyết, nhưng vì đây không phải là một giải pháp tốt, tôi sẽ bỏ ngỏ câu hỏi. Những gì tôi đã làm là phân lớp tuyến tính tuyến tính và ghi đè phương thức onMeasure () của nó, chịu trách nhiệm xác định kích thước của chế độ xem trong một chu kỳ bố cục và sửa nó theo chiều rộng và chiều cao màn hình. Mặc dù điều này không đúng, vì điều này không tính đến không gian bị chiếm bởi các thanh menu, do đó, hộp chứa thực sự sẽ cao hơn so với trên màn hình (với tất cả các tác dụng phụ kỳ lạ như trẻ em biến mất trong khu vực không nhìn thấy được của màn hình).
Matthias

Tôi tìm thấy giải pháp chính xác, xem câu trả lời của tôi dưới đây.
Matthias

Câu trả lời:


312

Tôi tìm thấy giải pháp:

Trong hoạt động của bạn có tập Theme.Dialogkiểu, hãy làm điều này:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.your_layout);

    getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
}

Điều quan trọng là bạn gọi Window.setLayout() sau khi bạn gọi setContentView(), nếu không nó sẽ không hoạt động.


5
Cảm ơn, đã tiết kiệm thời gian của tôi, không nơi nào tôi có thể tìm ra điều này! nhưng bất kỳ ý tưởng tại sao chúng ta phải xác định rõ ràng trong mã, tại sao fill_parent không hoạt động thông qua xml cho các hoạt động với hộp thoại chủ đề?
ngồi

3
Hộp thoại của tôi sẽ không điền chiều rộng, không phải bằng XML và không phải bằng phương pháp này. Tôi đang ăn móng tay của tôi.
eitama

6
Và đó là:import android.view.ViewGroup.LayoutParams;

11
FILL_PARENT hiện không được chấp nhận, thay vào đó, hãy sử dụng MATCH_PARENT
AlexV

4
Nó không lấp đầy toàn bộ màn hình, giống như nó có một miếng đệm nhỏ ở mỗi bên.
Machado

66

Bạn có thể thêm các giá trị này vào android phong cách của mình: windowMinWidthMajor và android: windowMinWidthMinor

<style name="Theme_Dialog" parent="android:Theme.Holo.Dialog">
    ...
    <item name="android:windowMinWidthMajor">97%</item>
    <item name="android:windowMinWidthMinor">97%</item>
</style>

2
giải pháp đơn giản nhất. Nó cũng đang làm việc với thư viện hỗ trợ appcompat. Cảm ơn.
Muhammad Saqib

Điều này nên được chấp nhận câu trả lời. Cách đúng đắn và sạch sẽ nhất để làm điều đó. Cân nhắc sử dụng cha mẹ = "@ style / Theme.AppCompat.Light.Dialog"
Kirill Karmazin

Điều này có vẻ như nó nên hoạt động, nhưng nó không dành cho tôi. Hmm, tôi tự hỏi tại sao. Có lẽ mọi thứ đã thay đổi kể từ năm 2014.
Scott Biggie

53

Tôi chỉ muốn lấp đầy 80% màn hình mà tôi đã làm như thế này bên dưới

        DisplayMetrics metrics = getResources().getDisplayMetrics();
        int screenWidth = (int) (metrics.widthPixels * 0.80);

        setContentView(R.layout.mylayout);

        getWindow().setLayout(screenWidth, LayoutParams.WRAP_CONTENT); //set below the setContentview

nó chỉ hoạt động khi tôi đặt dòng getwindow (). setLayout ... bên dưới dòng setContentView (..)

cảm ơn @Matthias


11

Gói hộp thoại_custom_layout.xml của bạn vào RelativeLayout thay vì bất kỳ bố cục nào khác. Điều đó đã làm việc cho tôi.


1
Tương tự ở đây, Chiều rộng và Chiều cao hoàn toàn sai và không thể tìm ra cách khắc phục. Việc chuyển đổi bố cục gốc sang RelativeLayout cũng khắc phục các sự cố của tôi!
SharpMobileCode

8

Đối với hộp thoại Điều này có thể hữu ích cho một ai đó. Tôi muốn một hộp thoại để có toàn bộ chiều rộng của màn hình. tìm kiếm rất nhiều nhưng không tìm thấy gì hữu ích Cuối cùng, điều này làm việc cho tôi:

mDialog.setContentView(R.layout.my_custom_dialog);
mDialog.getWindow().setBackgroundDrawable(null);

Sau khi thêm nó, hộp thoại của tôi xuất hiện trên toàn màn hình.


5

Câu trả lời này là một cách giải quyết cho những người sử dụng "Theme.AppCompat.Dialog" hoặc bất kỳ hậu duệ "Theme.AppCompat.Dialog" nào khác như "Theme.AppCompat.Light.Dialog", "Theme.AppCompat.DayNight.Dialog", v.v. Bản thân tôi phải sử dụng hộp thoại AppCompat vì tôi sử dụng AppCompatActivity như mở rộng cho tất cả các hoạt động của mình. Sẽ có một vấn đề làm cho hộp thoại có phần đệm ở mọi phía (trên, phải, dưới và trái) nếu chúng ta sử dụng câu trả lời được chấp nhận.

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.your_layout);

    getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
}

Theo kiểu Hoạt động của bạn, hãy thêm các mã này

<style name="DialogActivityTheme" parent="Theme.AppCompat.Dialog">
    <item name="windowNoTitle">true</item>
    <item name="android:windowBackground">@null</item>
</style>

Như bạn có thể nhận thấy, vấn đề tạo ra phần đệm cho hộp thoại của chúng tôi là "android: windowBackground", vì vậy ở đây tôi làm nền của cửa sổ thành null.


2

Đặt chiều rộng tối thiểu ở bố cục trên cùng.

android:minWidth="300dp"

Ví dụ:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"
  xmlns:android="http://schemas.android.com/apk/res/android" android:minWidth="300dp">

<!-- Put remaining contents here -->

</LinearLayout>

2

Câu trả lời của Matthias hầu hết là đúng nhưng nó vẫn không lấp đầy toàn bộ màn hình vì nó có một miếng đệm nhỏ ở mỗi bên (được chỉ ra bởi @Holmes). Ngoài mã của anh ta, chúng tôi có thể sửa lỗi này bằng cách mở rộng kiểu Theme.Dialog và thêm một số thuộc tính như thế này.

<style name="MyDialog" parent="@android:style/Theme.Dialog">
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowNoTitle">true</item>
</style>

Sau đó, chúng tôi chỉ cần khai báo Activity với chủ đề được đặt thành MyDialog:

<activity
    android:name=".FooActivity"
    android:theme="@style/MyDialog" />

1

Điều này sẽ hữu ích cho một người như tôi. Tạo kiểu hộp thoại tùy chỉnh:

<style name="MyDialog" parent="Theme.AppCompat.Light.Dialog">
    <item name="windowNoTitle">true</item>
    <item name="android:windowFullscreen">true</item>
    <item name="android:windowIsFloating">false</item>
</style>

Trong AndroidManifest.xmltập tin chủ đề cho hoạt động mong muốn:

<activity
        android:name=".CustomDialog"
        ...
        android:theme="@style/MyDialog"/>

Đó là tất cả, không cần phải gọi phương pháp lập trình.


vẫn hiển thị phần đệm ở mỗi bên (trên cùng, bên phải, dưới cùng và bên trái) và nếu chúng ta cũng cần hiển thị thanh trạng thái, giải pháp này sẽ thất bại
HendraWD

Kiểm tra stackoverflow.com/a/39590004/3940133 nếu bạn có phần đệm ở mỗi bên
HendraWD

0

Trong tệp kê khai của bạn nơi hoạt động của chúng tôi được xác định

<activity
        android:name=".YourPopUpActivity"
        android:theme="@android:style/Theme.Holo.Dialog" >
    </activity>

không có thanh hành động

<activity android:name=".YourPopUpActivity"
            android:theme="@android:style/Theme.Holo.Dialog.NoActionBar"/>
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.