Tidak dapat membuat DialogFragment kustom menjadi transparan di atas Fragmen


98

Saya perlu membuat dialog di atas sebuah fragmen (yang menempati seluruh layar). Dialog tersebut harus berupa dialog mengambang yang akan ditempatkan di atas fragmen dengan fragmen digelapkan di luar fragmen ..

Untuk Dialog kustom, saya memiliki linearLayout yang memiliki tepi melengkung, apa pun yang saya lakukan, dialog tersebut memiliki batas hitam di semua sisi (sangat kecil). Saya sudah mencoba segalanya untuk membuatnya transparan dan pergi (sehingga semua dialog hanyalah tata letak linier - kotak melengkung)

Untuk DialogFragment, inilah yang saya miliki untuk 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 hanyalah LinearLayout yang memiliki android: backgroung disetel ke # 000000

Ini adalah gaya saya untuk Dialog kustom

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

Saya mencoba semua jenis kombinasi dalam gaya ini (dari apa yang pernah saya lihat secara online) dan saya tidak dapat menghilangkan batas hitam yang mengganggu itu, saya dapat mengecatnya dengan warna putih atau warna lain jika saya mengatur latar belakang LinearLayout itu ke apa pun selain # 000000 ...

Saya telah menghabiskan waktu 3-4 jam untuk ini, saya harap orang lain dapat membantu ...

Jawaban:


302

Mencoba

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

di DialogFragmentmilikmuonCreateView


5
Anda mungkin juga ingin menghapus latar belakang hitam setengah transparan (peredupan), periksa jawaban ini: stackoverflow.com/a/33800422/2115904
Andriy Bas

4
Menghapus semua margin juga .. Dialog diperluas menjadi lebar penuh.
Uday

1
Dan itu akan menyebabkan pengecualian: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.Window android.app.Dialog.getWindow()' on a null object reference.
CoolMind

1
Anda juga bisa menelepon getDialog().getWindow().setBackgroundDrawableResource(android.R.color.transparent);sebagai gantinya. Agar ini tidak meminta pengecualian, Anda harus memanggil DialogFragmentdari Activity atau Fragment through dialogFragment.show(...);method, bukan FragmentTransaction's add.
CoolMind

2
Dalam hal seseorang mencari Kotlin potongan, di sini adalah: dialog?.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)).
Francis Laclé

24

Coba ini ( Cara membuat DialogFragment kustom 100% ) ini berfungsi untuk dialog

    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

Setel tema Anda seperti ini berhasil untuk saya

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

Dan dalam fragmen dialog Anda atur seperti ini

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

Di 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

untuk DialogFragmenttransparan


8

Untuk penggunaan yang sepenuhnya transparan: setStyle (DialogFragment.STYLE_NO_FRAME, android.R.style.Theme_Translucent_NoTitleBar_Fullscreen);

Untuk latar belakang kustom -buat file gaya di folder nilai Anda (values ​​/ style.xml) dan gunakan: setStyle (DialogFragment.STYLE_NO_FRAME, nama paketAnda.R.style.YOURE_CUSTOM_STYLE);

dalam file gaya Anda, timpa atribute: android: windowBackground menjadi @ color / DialogBackgroundBlackSemiTransparent


7

Anda dapat melakukannya dengan menambahkan ini di Dialog Fragment atau BottomSheetDialogFragment

Dalam onCreateDialogMetode

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

setBackgroundDrawableResourcedan clearFlagsbekerja untuk saya (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

Mereka yang menggunakan pembuat AlertDialog onCreateDialogalih-alih onCreateViewdapat menetapkan tema seperti kode berikut. Kumpulan tema lengkap dapat ditemukan dari R.style . Jangan lupa bahwa beberapa di antaranya didukung baru-baru ini dan tidak tersedia di ponsel perangkat lama.

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

Terima kasih, ini yang saya cari.
Milad Faridnia

3

Coba ini jika Anda suka:

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

0

Sesuai jawaban yang diterima, di 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
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.