Non è possibile rendere trasparente il DialogFragment personalizzato sul frammento


98

Devo creare una finestra di dialogo su un frammento (che occupa l'intero schermo). La finestra di dialogo deve essere una finestra di dialogo mobile che verrà posizionata sul frammento con il frammento oscurato all'esterno del frammento ..

Per la finestra di dialogo personalizzata, ho un layout lineare con bordi curvi, indipendentemente da quello che faccio, la finestra di dialogo ha un bordo nero su tutti i lati (molto piccolo). Ho provato di tutto per renderlo trasparente e andare via (in modo che tutta la finestra di dialogo sia solo il layout lineare - scatola curva)

Per DialogFragment, questo è quello che ho per 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 è solo un LinearLayout con android: backgroung impostato su # 000000

Questo è il mio stile per la finestra di dialogo personalizzata

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

Ho provato tutti i tipi di combinazioni in questo stile (da quello che ho visto online) e non riesco a sbarazzarmi di quel fastidioso bordo nero, posso dipingerlo di bianco o di qualsiasi altro colore se imposto lo sfondo LinearLayout su qualcosa di diverso da # 000000 ...

Ho passato letteralmente 3-4 ore su questo, spero che qualcun altro possa aiutare ...

Risposte:


302

Provare

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

nei tuoi DialogFragment'sonCreateView


5
potresti anche voler rimuovere lo sfondo nero semitrasparente (oscuramento), controlla questa risposta: stackoverflow.com/a/33800422/2115904
Andriy Bas

4
Rimuove anche tutti i margini. La finestra di dialogo viene espansa a tutta larghezza.
Uday

1
E causerà un'eccezione: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.Window android.app.Dialog.getWindow()' on a null object reference.
CoolMind

1
Inoltre puoi chiamare getDialog().getWindow().setBackgroundDrawableResource(android.R.color.transparent);invece. Per non richiamare un'eccezione, è necessario chiamare un metodo DialogFragmentfrom Activity o Fragment through dialogFragment.show(...);, non FragmentTransaction's add.
CoolMind

2
Nel caso in cui qualcuno sta cercando il Kotlin frammento, qui è: dialog?.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)).
Francis Laclé

24

Prova questo ( Come creare un DialogFragment personalizzato al 100% ) questo lavoro per il dialogo

    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

Imposta il tuo tema in questo modo ha funzionato per me

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

E nel frammento di dialogo impostato in questo modo

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

Nel 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

per DialogFragmenttrasparente


8

Per un uso completamente trasparente: setStyle (DialogFragment.STYLE_NO_FRAME, android.R.style.Theme_Translucent_NoTitleBar_Fullscreen);

Per uno sfondo personalizzato, crea un file di stile nella tua cartella dei valori (values ​​/ style.xml) e usalo : setStyle (DialogFragment.STYLE_NO_FRAME, yourpackagename.R.style.YOURE_CUSTOM_STYLE);

nel tuo file di stile sovrascrivi l'attributo: android: windowBackground in modo che sia @ color / DialogBackgroundBlackSemiTransparent


7

Puoi ottenere ciò aggiungendo questo in Dialog Fragment o BottomSheetDialogFragment

In onCreateDialogMethod

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

setBackgroundDrawableResourcee clearFlagsfunziona per me (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

Coloro che utilizzano AlertDialog builder onCreateDialoginvece di onCreateViewpossono assegnare un tema come il codice seguente. Il set completo di temi può essere trovato da R.style . Non dimenticare che alcuni di essi sono supportati di recente e non sono disponibili sui vecchi telefoni dei dispositivi.

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

Grazie, questo è quello che stavo cercando.
Milad Faridnia

3

Prova questo se ti piace:

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

0

Per risposta accettata, a 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
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.