Không thể làm cho DialogFragment tùy chỉnh trong suốt trên Fragment


98

Tôi cần tạo một hộp thoại trên một phân đoạn (chiếm toàn bộ màn hình). Hộp thoại cần phải là hộp thoại nổi sẽ được định vị trên phân đoạn với phân đoạn được làm tối bên ngoài mảnh ..

Đối với Hộp thoại tùy chỉnh, tôi có một LineLayout có các cạnh cong, bất kể tôi làm gì, hộp thoại có viền đen ở tất cả các bên (rất nhỏ). Tôi đã thử mọi cách để làm cho nó trong suốt và biến mất (để tất cả hộp thoại chỉ là bố cục tuyến tính - hộp cong)

Đối với DialogFragment, đây là những gì tôi có cho onCreateView

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
    LinearLayout layout =(LinearLayout)inflater.inflate(R.layout.custom_dialog, null);
    LinearLayout item = (LinearLayout)layout.findViewById(R.id.display_item);
    populateItemData(item, inflater);
    return layout;
}

custom_dialog chỉ là một LinearLayout có android: backgroung được đặt thành # 000000

Đây là phong cách của tôi cho Hộp thoại tùy chỉnh

<style name="CustomDialog" parent="android:style/Theme.Dialog">
    <item name="android:windowBackground">@null</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowIsFloating">true</item>
    <item name="android:windowIsTranslucent">true</item> 
    <item name="android:alwaysDrawnWithCache">false</item>
    <item name="android:windowContentOverlay">@null</item>
</style>

Tôi đã thử tất cả các kiểu kết hợp theo phong cách này (từ những gì tôi đã thấy trực tuyến) và tôi không thể loại bỏ viền đen khó chịu đó, tôi có thể sơn nó màu trắng hoặc bất kỳ màu nào khác nếu tôi đặt nền LinearLayout đó thành bất kỳ thứ gì khác ngoài # 000000 ...

Tôi thực sự đã dành 3-4 giờ cho việc này, tôi hy vọng ai đó có thể giúp đỡ ...

Câu trả lời:


302

Thử

getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));

trong của bạn DialogFragment'sonCreateView


5
bạn cũng có thể muốn xóa một nửa nền đen trong suốt (làm mờ), hãy kiểm tra câu trả lời sau: stackoverflow.com/a/33800422/2115904
Andriy Bas

4
Loại bỏ tất cả các lề .. Hộp thoại được mở rộng đến toàn bộ chiều rộng.
Uday

1
Và nó sẽ gây ra một ngoại lệ: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.Window android.app.Dialog.getWindow()' on a null object reference.
CoolMind

1
Ngoài ra bạn có thể gọi getDialog().getWindow().setBackgroundDrawableResource(android.R.color.transparent);thay thế. Để điều này không gọi ra một ngoại lệ, bạn nên gọi một phương thức DialogFragmenttừ Activity hoặc Fragment dialogFragment.show(...);, chứ không phải FragmentTransaction add.
CoolMind

2
Trong trường hợp ai đó đang tìm kiếm các đoạn Kotlin, ở đây nó là: dialog?.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)).
Francis Laclé

24

Hãy thử điều này ( Làm thế nào để tôi tạo một DialogFragment tùy chỉnh 100% ) công việc này cho hộp thoại

    Dialog dialog = new Dialog(getActivity());

    dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);

    dialog.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);      

        // layout to display
    dialog.setContentView(R.layout.add_edit);

    // set color transpartent
    dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));

    dialog.show();

15

Đặt chủ đề của bạn như thế này phù hợp với tôi

<style name="MyDialog" parent="Base.Theme.AppCompat.Light.Dialog">
    <item name="android:windowBackground">@android:color/transparent</item>
</style>

Và trong phân đoạn hộp thoại của bạn được đặt như thế này

public class Progress extends DialogFragment {


int style = DialogFragment.STYLE_NO_TITLE;
int theme = R.style.MyDialog;

public Progress() {
}

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setStyle(style, theme);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    return inflater.inflate(R.layout.progress, container, false);
}
}

11

Trong onActivityCreated

getDialog().getWindow().getAttributes().alpha = 0.9f; // An alpha value to apply to this entire window. An alpha of 1.0 means fully opaque and 0.0 means fully transparent

cho DialogFragmentminh bạch


8

Để sử dụng hoàn toàn minh bạch: setStyle (DialogFragment.STYLE_NO_FRAME, android.R.style.Theme_Translucent_NoTitleBar_Fullscreen);

Đối với nền tùy chỉnh -tạo tệp kiểu trong thư mục giá trị của bạn (giá trị / style.xml) và sử dụng nó: setStyle (DialogFragment.STYLE_NO_FRAME, yourpackagename.R.style.YOURE_CUSTOM_STYLE);

trong tệp kiểu của bạn ghi đè atribute: android: windowBackground thành @ color / DialogBackgroundBlackSemiTransparent


7

Bạn có thể đạt được điều này bằng cách thêm nó vào Dialog Fragment hoặc BottomSheetDialogFragment

Trong onCreateDialogphương pháp

@Override
   public Dialog onCreateDialog(Bundle savedInstanceState) {
       Dialog dialog = super.onCreateDialog(savedInstanceState);
       dialog.getWindow().setGravity(Gravity.BOTTOM);
       dialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent);
       dialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
       return dialog;
   }

setBackgroundDrawableResourceclearFlagshoạt động cho tôi (kotlin, android api v28)
Wesely

6
<style name="BaseDialogTheme" parent="Base.Theme.AppCompat.Light.Dialog">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="colorControlNormal">@color/colorAccent</item>
    <item name="colorControlActivated">@color/colorAccent</item>

    <item name="android:windowFullscreen">true</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:colorBackgroundCacheHint">@null</item>
    <item name="android:colorBackground">@android:color/transparent</item>
    <item name="android:windowIsTranslucent">true</item>


    <item name="android:windowIsFloating">true</item>
    <item name="android:windowSoftInputMode">stateUnspecified|adjustPan</item>
    <item name="android:windowActionModeOverlay">false</item>
    <item name="android:windowCloseOnTouchOutside">true</item>
    <item name="android:backgroundDimAmount">.00</item>//this line is changed alpha from 1.0 to 0.0(full transparent) 

</style>



@Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setStyle(STYLE_NO_FRAME, R.style.BaseDialogTheme);
    }

4

Những người đang sử dụng trình tạo AlertDialog onCreateDialogthay vì onCreateViewcó thể gán chủ đề như mã sau. Bạn có thể tìm thấy bộ chủ đề hoàn chỉnh từ R.style . Đừng quên rằng một số trong số chúng được hỗ trợ gần đây và không khả dụng trên điện thoại thiết bị cũ.

@Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {

        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), android.R.style.Theme_Translucent);
        View view = getActivity().getLayoutInflater().inflate(R.layout.dialog_album, null);
        builder.setView(view);

        return builder.create();
    }

Cảm ơn, Đây là những gì tôi đã tìm kiếm.
Milad Faridnia

3

Hãy thử điều này nếu bạn muốn:

public TransparentDialog()
{
    super();
    setStyle(STYLE_NO_FRAME, R.style.AppTheme);
}

0

Mỗi câu trả lời được chấp nhận, trong Kotlin

override fun onCreateView(
    inflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    var v = super.onCreateView(inflater, container, savedInstanceState)
    dialog?.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
    return v
}
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.