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

Réponses:


304

Essayer

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

dans vos DialogFragment« sonCreateView


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

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

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


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


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

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

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

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

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
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.