กล่องโต้ตอบที่มีพื้นหลังโปร่งใสใน Android


247

ฉันจะลบพื้นหลังสีดำออกจากกล่องโต้ตอบใน Android ได้อย่างไร รูปแสดงให้เห็นถึงปัญหา

ป้อนคำอธิบายรูปภาพที่นี่

final Dialog dialog = new Dialog(Screen1.this);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(R.layout.themechanger); 

โปรดแสดงรหัสสำหรับการสร้างการโต้ตอบ
MByD

สถานการณ์นี้ใช้ได้ในรหัสสองบรรทัดนี้ที่นี่: stackoverflow.com/questions/16186818//
DeePanShu

ค้นหาคำตอบที่ดีที่สุดที่นี่ป้อนคำอธิบายลิงก์ที่นี่
Collins Ushi

คำตอบ:


696

เพิ่มรหัสนี้

 dialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));

หรืออันนี้แทน:

dialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent);

16
ขอบคุณ! อย่างไรก็ตามฉันชอบที่จะใช้dialog.getWindow().setBackgroundDrawable(new ColorDrawableResource(R.color.transparent));
RileyE

6
วิธีนี้ช่วยได้ ปัญหาคือความกว้างจะพอดีกับหน้าจอ จะไม่มีการขยายเมื่อเทียบกับกล่องโต้ตอบปกติ แต่ Android 4.1 จัดการโดยค่าเริ่มต้น
Basavaraj Hampali

1
จะเป็นอย่างไรถ้าฉันใช้ ALERT Dialog?
Ahmad Arslan

1
หากคุณอยู่ใน DialogFragment เพียงโทรหา getDialog (). getWindow () ... (หลังจากมุมมองถูกสร้างขึ้นเช่นในการโทรกลับบน onViewCreated)
akohout

14
ฉันชอบที่จะใช้dialog.getWindow().setBackgroundDrawableResource(R.color.transparent);
Peter Zhao

82
<style name="NewDialog">
    <item name="android:windowFrame">@null</item>
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowIsFloating">true</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowTitleStyle">@null</item>
    <item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>
    <item name="android:windowSoftInputMode">stateUnspecified|adjustPan</item>
    <item name="android:backgroundDimEnabled">false</item>
    <item name="android:background">@android:color/transparent</item>
</style>

ใช้ในจาวา

Dialog dialog = new Dialog(this, R.style.NewDialog);

ฉันหวังว่าจะช่วยคุณ!


มันจะทำงานได้ แต่ถ้าคุณคลิกที่บทสนทนาพื้นที่โปร่งใสจะไม่ปิดวิธีการจัดการนี้
John

2
@John คุณสามารถใช้: dialog.setCanceledOnTouchOutside (true);
LongLv

คุณสามารถใช้ parent = "Theme.AppCompat.Dialog" เพื่อออกจากการสัมผัสจากภายนอกเป็นค่าเริ่มต้น
Dark Leonhart

31

ฉันได้พบกับปัญหาที่ง่ายขึ้นและวิธีการแก้ปัญหาที่ฉันเกิดขึ้นก็คือการใช้ชุดรูปแบบ bachground ที่โปร่งใส เขียนบรรทัดเหล่านี้ในสไตล์ของคุณ

    <item name="android:windowBackground">@drawable/blue_searchbuttonpopupbackground</item>
</style>
<style name="Theme.Transparent" parent="android:Theme">
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowIsFloating">true</item>
    <item name="android:backgroundDimEnabled">false</item>
</style>

แล้วเพิ่ม

android:theme="@style/Theme.Transparent"

ในไฟล์รายการหลักของคุณภายในบล็อกของกิจกรรมโต้ตอบ

รวมอยู่ในชุด XML กิจกรรมการโต้ตอบของคุณ

 android:background= "#00000000"

2
หรือใช้สิ่งนี้หากคุณต้องการตั้งค่าสไตล์ของกล่องโต้ตอบ: <style name = "Theme.Transparent" parent = "@ android: style / Theme.Dialog">
Roosevelt

16

วิธีแก้ปัญหา Zacharias ไม่ได้ผลสำหรับฉันดังนั้นฉันได้ใช้ชุดรูปแบบด้านล่างเพื่อแก้ไขปัญหานี้ ...

<style name="DialogCustomTheme" parent="android:Theme.Holo.Dialog.NoActionBar">
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:colorBackgroundCacheHint">@null</item>
</style>

หนึ่งสามารถตั้งค่าชุดรูปแบบนี้เพื่อโต้ตอบดังนี้

final Dialog dialog = new Dialog(this, R.style.DialogCustomTheme); 

สนุก!!


1
<item name = "android: windowBackground"> ​​@ color / transparent </item> บรรทัดนี้ควรแทนที่ด้วยบรรทัดด้านล่างมิฉะนั้นคุณจะต้องเพิ่มค่าความโปร่งใสในไฟล์ colors.xml <item name = "android: windowBackground"> ​​@ android: color / transparent </item>
AkhilGite

12

คุณสามารถใช้:

setBackgroundDrawable(null);

วิธีการและต่อไปนี้เป็นเอกสาร:

  /**
    * Set the background to a given Drawable, or remove the background. If the
    * background has padding, this View's padding is set to the background's
    * padding. However, when a background is removed, this View's padding isn't
    * touched. If setting the padding is desired, please use
    * {@link #setPadding(int, int, int, int)}.
    *
    * @param d The Drawable to use as the background, or null to remove the
    *        background
    */

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

11

กล่องโต้ตอบป็อปอัพเติมสีพื้นหลังสีดำเริ่มต้นหรือสีธีมดังนั้นคุณต้องตั้งค่าTRANSPARENTพื้นหลังเป็นไดอะล็อก ลองรหัสด้านล่าง: -

final Dialog dialog = new Dialog(this);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));
dialog.setContentView(R.layout.splash);
dialog.show();

10

ถ้าคุณต้องการทำลายพื้นหลังสีเข้มของกล่องโต้ตอบใช้สิ่งนี้

dialog.getWindow().setDimAmount(0);

ขอบคุณ. มันคือสิ่งที่ฉันมองหา มันเยี่ยมมาก
Farruh Habibullaev

1
วิธีนี้ใช้งานได้ง่ายที่สุดขอบคุณ! อย่างไรก็ตามหากคุณต้องการให้แอปของคุณทำงานบนอุปกรณ์ 100% (ฉันได้ตั้งค่า SDK ขั้นต่ำเป็น 15) Android แนะนำต่อไปนี้: if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { Objects.requireNonNull(alertDialog.getWindow()).setDimAmount(0); }
Danny EK van der Kolk

8

ปัญหาหนึ่งที่ฉันพบพร้อมกับคำตอบที่มีอยู่ทั้งหมดคือขอบจะไม่ถูกรักษาไว้ นี่เป็นเพราะพวกเขาทั้งหมดแทนที่android:windowBackgroundคุณลักษณะซึ่งเป็นผู้รับผิดชอบต่อระยะขอบด้วยสีทึบ อย่างไรก็ตามฉันทำการขุดใน Android SDK และพบว่าพื้นหลังหน้าต่างเริ่มต้นเป็นไปได้และปรับเปลี่ยนเล็กน้อยเพื่อให้มีกล่องโต้ตอบโปร่งใส

ก่อนอื่นให้คัดลอก /platforms/android-22/data/res/drawable/dialog_background_material.xml ไปยังโครงการของคุณ หรือเพียงแค่คัดลอกบรรทัดเหล่านี้ไปยังไฟล์ใหม่:

<inset xmlns:android="http://schemas.android.com/apk/res/android"
    android:inset="16dp">
    <shape android:shape="rectangle">
        <corners android:radius="2dp" />
        <solid android:color="?attr/colorBackground" />
    </shape>
</inset>

ขอให้สังเกตว่ามีการตั้งค่าandroid:color ?attr/colorBackgroundนี่เป็นค่าเริ่มต้นสีเทา / ขาวทึบที่คุณเห็น ที่จะช่วยให้สีที่กำหนดไว้ในandroid:backgroundในสไตล์ของคุณเองให้เกิดความโปร่งใสและแสดงความโปร่งใสทั้งหมดที่เราต้องทำคือการเปลี่ยนแปลงไป?attr/colorBackground @android:color/transparentตอนนี้มันจะเป็นดังนี้:

<inset xmlns:android="http://schemas.android.com/apk/res/android"
    android:inset="16dp">
    <shape android:shape="rectangle">
        <corners android:radius="2dp" />
        <solid android:color="@android:color/transparent" />
    </shape>
</inset>

หลังจากนั้นไปที่ธีมของคุณและเพิ่มสิ่งนี้:

<style name="MyTransparentDialog" parent="@android:style/Theme.Material.Dialog">
    <item name="android:windowBackground">@drawable/newly_created_background_name</item>
    <item name="android:background">@color/some_transparent_color</item>
</style>

ตรวจสอบให้แน่ใจว่าได้แทนที่newly_created_background_nameด้วยชื่อจริงของไฟล์ drawable ที่คุณเพิ่งสร้างขึ้นและแทนที่some_transparent_colorด้วยพื้นหลังโปร่งใสที่ต้องการ

หลังจากนั้นสิ่งที่เราต้องทำคือกำหนดธีม ใช้สิ่งนี้เมื่อสร้างAlertDialog.Builder:

    AlertDialog.Builder builder = new AlertDialog.Builder(this, R.style.MyTransparentDialog);

จากนั้นเพียงสร้างสร้างและแสดงข้อความโต้ตอบตามปกติ!


ฉันติดตามสิ่งนี้ด้วย AppCompat AlertDialog แต่แทนที่จะใช้ android: พื้นหลังฉันเลือกที่จะตั้งค่าสีโปร่งใสโดยตรงกับ android ของ drawable พื้นหลัง: สีตัวเอง จำเป็นต้องทำเช่นนี้เพราะการตั้งค่า android: พื้นหลังปล่อยให้บางพื้นที่ยังคงไม่โปร่งใส แต่ขอขอบคุณที่แบ่งปันเทคนิค!
Dileep PG


3

ลองในรหัสของคุณ:

getWindow().setBackgroundDrawableResource(android.R.color.transparent);

มันจะทำงานได้อย่างแน่นอน ... ในกรณีของฉัน ... ! frend ของฉัน


3

นี่คือสิ่งที่ฉันทำเพื่อให้เกิดความโปร่งใสด้วย AlertDialog

สร้างสไตล์ที่กำหนดเอง:

<style name="TranslucentDialog" parent="@android:style/Theme.DeviceDefault.Dialog.Alert">
    <item name="android:colorBackground">#32FFFFFF</item>
</style>

จากนั้นสร้างกล่องโต้ตอบด้วย:

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), R.style.TranslucentDialog);
AlertDialog dialog = builder.create();

1

ในโซลูชันเคสของฉันทำงานเช่นนี้:

dialog_AssignTag.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));

และนอกจากนี้ใน Xml ของกล่องโต้ตอบแบบกำหนดเอง:

android:alpha="0.8"

1

ใช้รหัสนี้ใช้งานได้กับฉัน:

    Dialog dialog = new Dialog(getActivity(),android.R.style.Theme_Translucent_NoTitleBar);
    dialog.show();

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

1

ตั้งรหัสสไตล์เหล่านี้ในสไตล์

<style name="Theme.Transparent" parent="android:Theme">
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowIsFloating">true</item>
    <item name="android:backgroundDimEnabled">false</item>
</style>

และเพียงแค่เปลี่ยน false เป็นจริงด้านล่างบรรทัด

<item name="android:backgroundDimEnabled">true</item>

มันจะหรี่พื้นหลังของคุณ


1

ข้อควรระวัง:อย่าใช้ตัวสร้างสำหรับการเปลี่ยนพื้นหลัง

Dialog dialog = new Dialog.Builder(MainActivity.this)
                                .setView(view)
                                .create();
dialog.show();dialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent);

เปลี่ยนไป

Dialog dialog = new Dialog(getActivity());
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(view);
dialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent);
dialog.show();

เมื่อใช้ Dialog.builder จะไม่มีgetWindow()ตัวเลือกให้


0
Window window = d.getWindow();
window.setFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND,WindowManager.LayoutParams.FLAG_BLUR_BEHIND);

นี่คือวิธีของฉันคุณสามารถลอง!


1
สิ่งนี้เลิกใช้แล้วในตอนนี้: @deprecated Blurring ไม่รองรับอีกต่อไป
arberg

0

ในกรณีที่คุณขยายDialogFramentคลาสคุณสามารถกำหนดธีมด้วย:

setStyle(DialogFragment.STYLE_NORMAL, R.style.customDialogTheme);

จากนั้นสร้างธีมที่กำหนดเองในไฟล์ styles.xml ของคุณ (ดูคำตอบของ @ LongLv สำหรับพารามิเตอร์)

อย่าลืมเพิ่ม<item name="android:windowCloseOnTouchOutside">true</item>ถ้าคุณต้องการให้กล่องโต้ตอบปิดถ้าผู้ใช้สัมผัสนอกกล่องโต้ตอบ


0

สำหรับทุกคนที่ใช้ไดอะล็อกที่กำหนดเองพร้อมคลาสที่กำหนดเองคุณต้องเปลี่ยนความโปร่งใสในคลาสเพิ่มบรรทัดนี้ใน onCreate ():

getWindow().setBackgroundDrawableResource(android.R.color.transparent);


0

ตรวจสอบให้แน่ใจว่าR.layout.themechangerไม่มีสีพื้นหลังเพราะโดยค่าเริ่มต้นกล่องโต้ตอบจะมีสีพื้นหลังเริ่มต้น

คุณต้องเพิ่ม dialog.getWindow().setBackgroundDrawable(newColorDrawable(Color.TRANSPARENT));

และในที่สุดก็

<style name="TransparentDialog">
    <item name="android:windowIsFloating">true</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowTitleStyle">@null</item>
</style>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.