Impossible de rendre le DialogFragment personnalisé transparent sur le fragment

99

J'ai besoin de créer une boîte de dialogue sur un fragment (qui occupe tout l'écran). La boîte de dialogue doit être une boîte de dialogue flottante qui sera positionnée sur le fragment avec le fragment assombri à l'extérieur du fragment.

Pour la boîte de dialogue personnalisée, j'ai une mise en page linéaire qui a des bords incurvés, peu importe ce que je fais, la boîte de dialogue a une bordure noire de tous les côtés (très petite). J'ai tout essayé pour le rendre transparent et disparaître (pour que toute la boîte de dialogue soit juste la disposition linéaire - boîte courbe)

Pour le DialogFragment, voici ce que j'ai pour 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 est juste un LinearLayout qui a android: backgroung défini sur # 000000

C'est mon style pour la boîte de dialogue personnalisée

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

J'ai essayé toutes sortes de combinaisons dans ce style (d'après ce que j'ai vu en ligne) et je ne peux pas me débarrasser de cette bordure noire ennuyeuse, je peux la peindre en blanc ou dans toute autre couleur si je règle cet arrière-plan LinearLayout sur autre chose que # 000000 ...

J'ai passé littéralement 3-4 heures là-dessus, j'espère que quelqu'un d'autre pourra m'aider ...

Tolga E
la source

Réponses:

304

Essayer

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

dans vos DialogFragment« sonCreateView

CD
la source
5
vous pouvez également supprimer la moitié du fond noir transparent (gradation), vérifiez cette réponse: stackoverflow.com/a/33800422/2115904
Andriy Bas
4
Supprime également toutes les marges. La boîte de dialogue est agrandie en pleine largeur.
Uday
1
Et il fera une exception: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.Window android.app.Dialog.getWindow()' on a null object reference.
CoolMind
1
Vous pouvez également appeler à la getDialog().getWindow().setBackgroundDrawableResource(android.R.color.transparent);place. Pour ne pas invoquer d'exception, vous devez appeler une méthode DialogFragmentfrom Activity ou Fragment through dialogFragment.show(...);, pas celle de FragmentTransaction add.
CoolMind
2
Dans le cas où une personne est à la recherche de l'extrait Kotlin, la voici: dialog?.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)).
Francis Laclé
24

Essayez ceci ( Comment créer un DialogFragment personnalisé à 100% ) ce travail pour le dialogue

    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();
sahar
la source
15

Définissez votre thème comme cela a fonctionné pour moi

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

Et dans votre ensemble de fragments de dialogue comme ceci

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);
}
}
Ameen Maheen
la source
11

Dans 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

pour DialogFragmenttransparent

Sanghyun Byun
la source
8

Pour une utilisation totalement transparente: setStyle (DialogFragment.STYLE_NO_FRAME, android.R.style.Theme_Translucent_NoTitleBar_Fullscreen);

Pour un arrière-plan personnalisé, créez un fichier de style dans votre dossier de valeurs (values ​​/ style.xml) et utilisez-le: setStyle (DialogFragment.STYLE_NO_FRAME, yourpackagename.R.style.YOURE_CUSTOM_STYLE);

dans votre fichier de style, remplacez l'attribut: android: windowBackground to be @ color / DialogBackgroundBlackSemiTransparent

user3193413
la source
7

Vous pouvez y parvenir en ajoutant ceci dans Dialog Fragment ou BottomSheetDialogFragment

Dans la onCreateDialogméthode

@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;
   }
Nanda Gopal
la source
setBackgroundDrawableResourceet clearFlagsfonctionne pour moi (kotlin, api android 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);
    }
NickUnuchek
la source
4

Ceux qui utilisent le générateur AlertDialog au onCreateDialoglieu de onCreateViewpeuvent attribuer un thème comme le code suivant. Un ensemble complet de thèmes peut être trouvé à partir de R.style . N'oubliez pas que certains d'entre eux ont récemment pris en charge et ne sont pas disponibles sur les anciens téléphones.

@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();
    }
Hesam
la source
Merci, c'est ce que je cherchais.
Milad Faridnia
3

Essayez ceci si vous aimez:

public TransparentDialog()
{
    super();
    setStyle(STYLE_NO_FRAME, R.style.AppTheme);
}
Kitesurfer
la source
0

Par réponse acceptée, à 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
}
le_prole
la source