ฉันจะได้รับหน้าต่างกิจกรรมสไตล์ไดอะล็อกเพื่อเติมหน้าจอได้อย่างไร?


142

ฉันกำลังใช้กิจกรรมกับชุดรูปแบบข้อความโต้ตอบและฉันต้องการให้เป็นแบบเต็มหน้าจอ ฉันลองทุกสิ่งแม้จะผ่าน WindowManager เพื่อขยายหน้าต่างให้เต็มความกว้างและความสูงด้วยตนเอง แต่ไม่มีอะไรทำงาน

เห็นได้ชัดว่าหน้าต่างโต้ตอบ (หรือกิจกรรมที่มีชุดรูปแบบการโต้ตอบ) จะขยายตามเนื้อหา แต่จะไม่ได้ผลเสมอไป ตัวอย่างเช่นฉันแสดงวงกลมแถบความคืบหน้าซึ่งมีการตั้งค่าความกว้างและความสูงเป็น FILL_PARENT (เช่นเดียวกับที่เก็บโครงร่างของมัน) แต่ยังคงกล่องโต้ตอบล้อมรอบแถบความคืบหน้าขนาดเล็กมากแทนการเติมหน้าจอ

จะต้องมีวิธีการแสดงบางสิ่งเล็ก ๆ ในหน้าต่างโต้ตอบ แต่มันขยายเป็นขนาดเต็มหน้าจอโดยไม่ต้องปรับขนาดเนื้อหาด้วยหรือไม่


2
หมายเหตุที่น่าสนใจ: เมื่อตั้งค่าความกว้างและความสูงของคอนเทนเนอร์โครงร่างให้เป็นค่าจริงเป็นพิกเซลแล้วไดอะล็อกจะปรับขนาดตามความเหมาะสม แต่เมื่อการตั้งค่าให้ FILL_PARENT แล้วมันไม่ได้ ...
แมทเธีย

จริงๆ? โครงร่างกิจกรรมกำลังสร้างอินสแตนซ์มีแท็ก Relative หรือ LinearLayout หลักที่ถูกตั้งค่าเป็นความสูงและความกว้างของ fill_parent หรือไม่ ฉันได้นำกิจกรรมเล็ก ๆ น้อย ๆ มาใช้กับธีมของกล่องโต้ตอบและไม่เคยมีปัญหากับการใช้งานทั้งหน้าจอ
MattC

ใช่กิจกรรมมีการตั้งค่า LinearLayout เป็น FILL_PARENT ทั้งความกว้างและความสูง
Matthias

ฉันแก้ปัญหาโดยใช้วิธีแก้ปัญหา แต่เนื่องจากนี่ไม่ใช่วิธีที่ดีฉันจะเปิดคำถามทิ้งไว้ สิ่งที่ฉันทำคือซับคลาส LinearLayout และแทนที่เมธอด onMeasure () ของมันซึ่งมีหน้าที่กำหนดขนาดของมุมมองในระหว่างรอบการจัดวางและแก้ไขความกว้างและความสูงของหน้าจอ สิ่งนี้ไม่ถูกต้อง แต่เนื่องจากไม่คำนึงถึงพื้นที่ที่ถูกครอบครองโดยแถบเมนูดังนั้นคอนเทนเนอร์จะสูงกว่าที่ดูเหมือนบนหน้าจอจริง ๆ (โดยมีผลข้างเคียงแปลก ๆ เช่นเด็กหายไปในพื้นที่ที่มองไม่เห็นของ หน้าจอ).
Matthias

ฉันพบวิธีแก้ไขที่ถูกต้องแล้วดูคำตอบของฉันด้านล่าง
Matthias

คำตอบ:


312

ฉันพบวิธีแก้ปัญหา:

ในกิจกรรมของคุณที่มีTheme.Dialogชุดสไตล์ให้ทำดังนี้

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

    setContentView(R.layout.your_layout);

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

สิ่งสำคัญคือคุณต้องโทรหาWindow.setLayout() หลังจากที่คุณโทรsetContentView()มิฉะนั้นจะไม่ทำงาน


5
ขอบคุณบันทึกเวลาของฉันไม่มีที่ไหนเลยที่ฉันจะคิดออก! แต่ความคิดใด ๆ ว่าทำไมเราต้องระบุอย่างชัดเจนในโค้ดเหตุใด fill_parent ไม่ทำงานผ่าน xml สำหรับกิจกรรมที่มีกล่องโต้ตอบของธีม

3
กล่องโต้ตอบของฉันจะไม่เติมความกว้างไม่ใช่โดย XML และไม่ใช่ด้วยวิธีนี้ ฉันกำลังกเล็บ
eitama

6
และก็คือ:import android.view.ViewGroup.LayoutParams;

11
FILL_PARENT เลิกใช้แล้วในขณะนี้ใช้ MATCH_PARENT แทน
AlexV

4
มันไม่เต็มหน้าจอเหมือนมีช่องว่างขนาดเล็กแต่ละข้าง
Machado

66

คุณสามารถเพิ่มค่านี้ให้กับสไตล์ android ของคุณ: windowMinWidthMajor และ 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
ทางออกที่ง่ายที่สุด นอกจากนี้ยังทำงานกับไลบรารีสนับสนุน appcompat ขอบคุณ
มูฮัมหมัด Saqib

คำตอบนี้ควรได้รับการยอมรับ วิธีที่เหมาะสมและสะอาดที่สุดในการทำ พิจารณาใช้ parent = "@ style / Theme.AppCompat.Light.Dialog"
Kirill Karmazin

ดูเหมือนว่ามันจะใช้ได้ แต่ก็ไม่เหมาะกับฉัน อืมฉันสงสัยว่าทำไม บางทีทุกอย่างเปลี่ยนไปตั้งแต่ปี 2014
Scott Biggs

53

ฉันแค่ต้องการเติมเพียง 80% ของหน้าจอสำหรับที่ฉันทำเช่นนี้ด้านล่าง

        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

มันทำงานเฉพาะเมื่อฉันใส่ getwindow (). setLayout ... บรรทัดด้านล่าง setContentView (.. )

ขอบคุณ @Matthias


11

ห่อdialog_custom_layout.xmlของคุณไว้ในRelativeLayoutแทนเลย์เอาต์อื่น ๆ ซึ่งใช้ได้สำหรับฉัน


1
เช่นเดียวกันที่นี่ความกว้างและความสูงผิดอย่างสมบูรณ์และไม่สามารถหาวิธีแก้ไขได้ การแปลงเลย์เอาต์รากเป็น RelativeLayout ได้แก้ไขปัญหาของฉันเช่นกัน!
SharpMobileCode

8

สำหรับการโต้ตอบ นี้อาจเป็นประโยชน์สำหรับใครบางคน ฉันต้องการไดอะล็อกที่จะเต็มความกว้างของหน้าจอ ค้นหามาก แต่ไม่มีอะไรที่เป็นประโยชน์ ในที่สุดมันก็ใช้ได้สำหรับฉัน:

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

หลังจากเพิ่มสิ่งนี้แล้วกล่องโต้ตอบของฉันจะปรากฏเต็มความกว้างของหน้าจอ


5

คำตอบนี้เป็นวิธีการแก้ปัญหาสำหรับผู้ที่ใช้ "Theme.AppCompat.Dialog" หรือลูกหลาน "Theme.AppCompat.Dialog" อื่น ๆเช่น "Theme.AppCompat.Light.Dialog", "Theme.AppCompat.DayogDialog" อื่น ๆ ฉันเองต้องใช้กล่องโต้ตอบ AppCompat เพราะฉันใช้ AppCompatActivity เป็นส่วนขยายสำหรับกิจกรรมทั้งหมดของฉัน จะมีปัญหาที่ทำให้กล่องโต้ตอบมีช่องว่างภายในทุกด้าน (ด้านบนขวาล่างและซ้าย) หากเราใช้คำตอบที่ยอมรับ

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

    setContentView(R.layout.your_layout);

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

ในสไตล์ของกิจกรรมของคุณให้เพิ่มรหัสเหล่านี้

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

อย่างที่คุณอาจสังเกตเห็นปัญหาที่สร้างช่องว่างภายในกับกล่องโต้ตอบของเราคือ "android: windowBackground" ดังนั้นที่นี่ฉันทำให้พื้นหลังหน้าต่างเป็นโมฆะ


2

ตั้งค่าความกว้างต่ำสุดที่เค้าโครงส่วนใหญ่ด้านบน

android:minWidth="300dp"

ตัวอย่างเช่น:

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

คำตอบของ Matthias นั้นถูกต้อง แต่ส่วนใหญ่ยังไม่เต็มหน้าจอเนื่องจากมันมีช่องว่างขนาดเล็กในแต่ละด้าน (ชี้โดย @Holmes) นอกจากรหัสของเขาเราสามารถแก้ไขได้โดยขยาย Theme.Dialog style และเพิ่มคุณสมบัติบางอย่างเช่นนี้

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

จากนั้นเราก็ประกาศกิจกรรมที่มีชุดรูปแบบเป็นMyDialog:

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

1

สิ่งนี้จะเป็นประโยชน์สำหรับคนอย่างฉัน สร้างสไตล์การโต้ตอบที่กำหนดเอง:

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

ในAndroidManifest.xmlชุดรูปแบบไฟล์สำหรับกิจกรรมที่ต้องการ:

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

นั่นคือทั้งหมดที่ไม่จำเป็นต้องเรียกวิธีการเขียนโปรแกรม


ยังคงแสดงการขยายในแต่ละด้าน (ด้านบนขวาล่างและจากซ้าย) และถ้าเราต้องการที่จะแสดงแถบสถานะเกินไปการแก้ปัญหานี้จะล้มเหลว
HendraWD

ตรวจสอบstackoverflow.com/a/39590004/3940133หากคุณมีช่องว่างภายในแต่ละด้าน
HendraWD

0

ในไฟล์รายการที่กิจกรรมของเราถูกกำหนดไว้

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

ไม่มีแถบการกระทำ

<activity android:name=".YourPopUpActivity"
            android:theme="@android:style/Theme.Holo.Dialog.NoActionBar"/>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.