ไม่สามารถทำให้ DialogFragment แบบกำหนดเองโปร่งใสเหนือ Fragment ได้


102

ฉันต้องการสร้างไดอะล็อกบนส่วนย่อย (ที่ใช้ทั้งหน้าจอ) กล่องโต้ตอบจะต้องเป็นกล่องโต้ตอบแบบลอยที่จะวางตำแหน่งเหนือส่วนโดยที่ส่วนที่มืดออกมานอกส่วนนั้น ..

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

สำหรับ DialogFragment นี่คือสิ่งที่ฉันมีสำหรับ 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 เป็นเพียง LinearLayout ที่มี android: backgroung ตั้งค่าเป็น # 000000

นี่คือสไตล์ของฉันสำหรับ Dialog ที่กำหนดเอง

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

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

ฉันใช้เวลา 3-4 ชั่วโมงอย่างแท้จริงฉันหวังว่าจะมีคนอื่นช่วยได้ ...

คำตอบ:


309

ลอง

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

ในของคุณDialogFragment'sonCreateView


5
คุณอาจต้องการลบพื้นหลังสีดำโปร่งใสครึ่งหนึ่ง (ลดแสง) ตรวจสอบคำตอบนี้: stackoverflow.com/a/33800422/2115904
Andriy Bas

4
ลบระยะขอบทั้งหมดด้วย .. กล่องโต้ตอบถูกขยายเป็นแบบเต็มความกว้าง
Uday

1
และจะทำให้เกิดข้อยกเว้น: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.Window android.app.Dialog.getWindow()' on a null object reference.
CoolMind

1
นอกจากนี้คุณสามารถโทรgetDialog().getWindow().setBackgroundDrawableResource(android.R.color.transparent);แทนได้ ในคำสั่งนี้จะไม่ก่อให้เกิดข้อยกเว้นคุณควรเรียกDialogFragmentจากกิจกรรมหรือ Fragment ผ่านdialogFragment.show(...);วิธีการไม่ addFragmentTransaction
CoolMind

2
ในกรณีที่มีคนที่กำลังมองหา Kotlin ข้อมูลโค้ด, dialog?.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))นี่มันคือ
Francis Laclé

24

ลองใช้สิ่งนี้ ( ฉันจะสร้าง DialogFragment แบบกำหนดเอง 100% ได้อย่างไร ) สำหรับกล่องโต้ตอบ

    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

ตั้งธีมของคุณแบบนี้ได้ผลสำหรับฉัน

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

และในส่วนโต้ตอบของคุณตั้งค่าเช่นนี้

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

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

เพื่อDialogFragmentความโปร่งใส


8

เพื่อการใช้งานที่โปร่งใสอย่างสมบูรณ์: setStyle (DialogFragment.STYLE_NO_FRAME, android.R.style.Theme_Translucent_NoTitleBar_Fullscreen);

สำหรับพื้นหลังแบบกำหนดเอง - สร้างไฟล์สไตล์ในโฟลเดอร์ค่าของคุณ (values ​​/ style.xml) และใช้: setStyle (DialogFragment.STYLE_NO_FRAME, yourpackagename.R.style.YOURE_CUSTOM_STYLE);

ในไฟล์สไตล์ของคุณแทนที่ atribute: android: windowBackgroundเป็น@ color / DialogBackgroundBlackSemiTransparent


7

คุณสามารถทำได้โดยเพิ่มสิ่งนี้ใน Dialog FragmentหรือBottomSheetDialogFragment

ในonCreateDialogวิธีการ

@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;
   }

setBackgroundDrawableResourceและclearFlagsใช้ได้กับฉัน (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

ผู้ที่ใช้ตัวสร้าง AlertDialog onCreateDialogแทนonCreateViewสามารถกำหนดธีมเช่นโค้ดต่อไปนี้ ชุดที่สมบูรณ์ของรูปแบบที่สามารถพบได้จากR.style อย่าลืมว่าบางรุ่นได้รับการสนับสนุนเมื่อเร็ว ๆ นี้และไม่สามารถใช้ได้กับโทรศัพท์รุ่นเก่า

@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();
    }

ขอบคุณนี่คือสิ่งที่ฉันกำลังค้นหา
Milad Faridnia


0

ตามคำตอบที่ยอมรับใน 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
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.