Hộp thoại với nền trong suốt trong Android


247

Làm cách nào để xóa nền đen khỏi hộp thoại trong Android. Các pic cho thấy vấn đề.

nhập mô tả hình ảnh ở đây

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

vui lòng hiển thị mã để tạo hộp thoại
MByD

tình huống này cũng hoạt động trong hai dòng mã này tại đây: stackoverflow.com/questions/16186818/iêu
DeePanShu

Tìm câu trả lời tốt nhất ở đây, nhập mô tả liên kết tại đây
Collins Ushi

Câu trả lời:


696

Thêm mã này

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

Hoặc cái này thay thế:

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

16
Cảm ơn bạn! Tuy nhiên, tôi thích sử dụng hơndialog.getWindow().setBackgroundDrawable(new ColorDrawableResource(R.color.transparent));
RileyE

6
Giải pháp này giúp. Vấn đề là, chiều rộng sẽ phù hợp với màn hình. sẽ không có phần đệm so với hộp thoại bình thường. Nhưng Android 4.1 xử lý nó theo mặc định
Basavaraj Hampali

1
Nếu tôi đang sử dụng Hộp thoại ALert thì sao?
Ahmad Arslan

1
Nếu bạn đang ở trong DialogFragment, chỉ cần gọi getDialog (). GetWindow () ... (sau khi chế độ xem được tạo, ví dụ như trong cuộc gọi lại onViewCreated của bạn).
tham gia

14
Tôi thích sử dụng hơndialog.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>

sử dụng trong java

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

Tôi hy vọng giúp bạn!


Nó sẽ hoạt động nhưng nếu bạn nhấp vào đó, đối thoại khu vực trong suốt sẽ không đóng làm thế nào để xử lý việc này?
Giăng

2
@John Bạn có thể sử dụng: hộp thoại.set HủyedOnTouchOutside (true);
LongLv

Bạn có thể sử dụng Parent = "Theme.AppCompat.Dialog" để thoát khỏi liên lạc bên ngoài như mặc định.
Dark Leonhart

31

Tôi đã phải đối mặt với vấn đề đơn giản hơn và giải pháp tôi đưa ra là áp dụng THEME bachground minh bạch. Viết những dòng này theo phong cách của bạn

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

Và sau đó thêm

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

trong tệp kê khai chính của bạn, bên trong khối hoạt động hộp thoại.

Cộng với bộ XML hoạt động hộp thoại của bạn

 android:background= "#00000000"

2
Hoặc sử dụng tùy chọn này nếu bạn chỉ muốn đặt kiểu của Hộp thoại: <style name = "Theme.Transparent" Parent = "@ android: style / Theme.Dialog">
Roosevelt

16

Bằng cách nào đó, giải pháp Zacharias không hiệu quả với tôi vì vậy tôi đã sử dụng chủ đề dưới đây để giải quyết vấn đề này ...

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

Người ta có thể đặt chủ đề này vào hộp thoại như bên dưới

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

Thưởng thức!!


1
<item name = "android: windowBackground"> ​​@ color / minh bạch </ item> Dòng này sẽ thay thế bằng dòng bên dưới hoặc nếu không bạn phải thêm một giá trị trong suốt trong tệp colors.xml. <item name = "android: windowBackground"> ​​@ android: màu sắc / trong suốt </ item>
AkhilGite

12

Bạn có thể dùng:

setBackgroundDrawable(null);

Phương thức. Và sau đây là tài liệu:

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

điều này sẽ hoạt động, nhưng chỉ khi bạn mở rộng hộp thoại, không phải là giải pháp nhanh mà là giải pháp tốt ....
Lập trình viên

11

Hộp thoại bật lên điền màu nền đen mặc định hoặc màu chủ đề để bạn cần đặt TRANSPARENTnền vào Hộp thoại. Hãy thử mã dưới đây: -

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

Nếu bạn muốn phá hủy nền tối của hộp thoại, hãy sử dụng cái này

dialog.getWindow().setDimAmount(0);

Cảm ơn bạn. Đó là những gì tôi đã tìm kiếm nó. Thật tuyệt vời.
Farruh Habibullaev

1
Điều này làm công việc theo cách đơn giản nhất, cảm ơn bạn! Tuy nhiên, nếu bạn muốn ứng dụng của mình chạy trên 100% thiết bị ngoài đó (tôi đã đặt phiên bản SDK tối thiểu thành 15), Android gợi ý như sau: if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { Objects.requireNonNull(alertDialog.getWindow()).setDimAmount(0); }
Danny EK van der Nikol

8

Một vấn đề tôi tìm thấy với tất cả các câu trả lời hiện có là lề không được bảo tồn. Điều này là do tất cả chúng ghi đè lên android:windowBackgroundthuộc tính, chịu trách nhiệm cho các lề, với một màu sắc vững chắc. Tuy nhiên, tôi đã thực hiện một số thao tác đào trong SDK Android và tìm thấy nền cửa sổ mặc định có thể vẽ được và sửa đổi nó một chút để cho phép các hộp thoại trong suốt.

Đầu tiên, sao chép / pl Platforms / android-22 / data /res /drawable / dialog_background_m vật liệu vào dự án của bạn. Hoặc, chỉ cần sao chép các dòng này vào một tệp mới:

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

Lưu ý rằng android:colorđược đặt thành ?attr/colorBackground. Đây là màu xám / trắng mặc định mà bạn nhìn thấy. Để cho phép màu được xác định trong android:backgroundkiểu tùy chỉnh của bạn trong suốt và hiển thị độ trong suốt, tất cả những gì chúng ta phải làm là thay đổi ?attr/colorBackgroundthành @android:color/transparent. Bây giờ nó sẽ trông như thế này:

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

Sau đó, đi đến chủ đề của bạn và thêm điều này:

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

Đảm bảo thay thế newly_created_background_namebằng tên thật của tệp có thể vẽ bạn vừa tạo và thay thế some_transparent_colorbằng nền trong suốt mong muốn.

Sau đó, tất cả những gì chúng ta cần làm là thiết lập chủ đề. Sử dụng cái này khi tạo AlertDialog.Builder:

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

Sau đó, chỉ cần xây dựng, tạo và hiển thị hộp thoại như bình thường!


Tôi đã làm theo điều này với AppCompat AlertDialog nhưng thay vì sử dụng android: nền, tôi đã chọn đặt màu trong suốt trực tiếp với chính màu nền của android drawable. Cần phải làm điều này bởi vì, thiết lập android: nền bằng cách nào đó để lại một số khu vực vẫn không trong suốt. Nhưng cảm ơn vì đã chia sẻ kỹ thuật!
Dileep PG

3

Giải pháp tương tự như zGnep nhưng sử dụng xml:

android:background="@null"

3

Hãy thử điều này trong mã của bạn:

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

nó chắc chắn sẽ hoạt động ... trong trường hợp của tôi ...! quyền tự do của tôi


3

Đây là những gì tôi đã làm để đạt được độ trong mờ với AlertDialog.

Tạo một phong cách tùy chỉnh:

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

Và sau đó tạo hộp thoại với:

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

1

Trong trường hợp của tôi, giải pháp hoạt động như thế này:

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

Và ngoài ra trong Xml của hộp thoại tùy chỉnh:

android:alpha="0.8"

1

sử dụng mã này nó hoạt động với tôi:

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

2
Tôi nghĩ rằng sẽ có ích hơn cho OP và khách truy cập xa hơn, khi bạn thêm một số giải thích cho cường độ của bạn.
Phóng viên

1

Đặt các mã kiểu này theo kiểu

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

Và chỉ cần thay đổi sai thành đúng bên dưới dòng

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

Nó sẽ làm mờ nền của bạn.


1

Chú ý: Không sử dụng trình xây dựng để thay đổi nền.

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

thay đổi thành

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

Khi sử dụng Dialog.builder, nó không cung cấp getWindow()tùy chọn trong đó.


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

đây là cách của tôi, bạn có thể thử!


1
Điều này không được chấp nhận ngay bây giờ: @deprecated Blurring không còn được hỗ trợ.
arberg

0

Trong trường hợp bạn mở rộng DialogFramentlớp, bạn có thể đặt chủ đề với:

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

Và sau đó tạo chủ đề tùy chỉnh trong tệp tệp kiểu tệp của bạn (xem câu trả lời của @ LongLv để biết thông số)

Đừng quên thêm <item name="android:windowCloseOnTouchOutside">true</item>nếu bạn muốn hộp thoại đóng nếu người dùng chạm bên ngoài hộp thoại.


0

Đối với bất kỳ ai sử dụng hộp thoại tùy chỉnh với lớp tùy chỉnh, bạn cần thay đổi độ trong suốt của lớp, thêm dòng này vào onCreate ():

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

0

hộp thoại.getWindow (). setBackgroundDrawable (new ColorDrawable (ContextCompat.getColor (ctx, android.R.color.transparent)));


0

Đảm bảo R.layout.themechangerkhông có màu nền vì theo mặc định, hộp thoại có màu nền mặc định.

Bạn cũng cần thêm dialog.getWindow().setBackgroundDrawable(newColorDrawable(Color.TRANSPARENT));

Và cuối cùng

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