Das benutzerdefinierte DialogFragment kann nicht über das Fragment transparent gemacht werden


97

Ich muss einen Dialog über ein Fragment erstellen (das den gesamten Bildschirm einnimmt). Der Dialog muss ein schwebender Dialog sein, der über dem Fragment positioniert wird, wobei das Fragment außerhalb des Fragments abgedunkelt ist.

Für den benutzerdefinierten Dialog habe ich ein lineares Layout mit gekrümmten Kanten, egal was ich mache, der Dialog hat an allen Seiten einen schwarzen Rand (sehr klein). Ich habe alles versucht, um es transparent zu machen und wegzugehen (so dass der gesamte Dialog nur das lineare Layout ist - gebogenes Feld)

Für das DialogFragment habe ich dies für 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 ist nur ein LinearLayout, für das android: backgroung auf # 000000 gesetzt ist

Dies ist mein Stil für den benutzerdefinierten 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>

Ich habe alle Arten von Kombinationen in diesem Stil ausprobiert (von dem, was ich online gesehen habe) und ich kann diesen nervigen schwarzen Rand nicht loswerden. Ich kann ihn weiß oder in einer anderen Farbe malen, wenn ich diesen LinearLayout-Hintergrund auf etwas anderes als setze # 000000 ...

Ich habe buchstäblich 3-4 Stunden damit verbracht, ich hoffe, jemand anderes kann helfen ...

Antworten:


301

Versuchen

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

in Ihrem DialogFragment‚sonCreateView


5
Vielleicht möchten Sie auch den halbtransparenten schwarzen Hintergrund (Dimmen) entfernen. Überprüfen Sie diese Antwort: stackoverflow.com/a/33800422/2115904
Andriy Bas

4
Entfernt auch alle Ränder. Der Dialog wird auf volle Breite erweitert.
Uday

1
Und es wird eine Ausnahme verursachen : java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.Window android.app.Dialog.getWindow()' on a null object reference.
CoolMind

1
Sie können getDialog().getWindow().setBackgroundDrawableResource(android.R.color.transparent);stattdessen auch anrufen . Damit dies keine Ausnahme auslöst, sollten Sie eine Methode DialogFragmentvon Activity oder Fragment through aufrufen dialogFragment.show(...);, nicht die von FragmentTransaction add.
CoolMind

2
Falls jemand nach dem Kotlin-Snippet sucht, hier ist es : dialog?.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)).
Francis Laclé

24

Versuchen Sie dies ( So erstelle ich ein 100% benutzerdefiniertes DialogFragment ) für diese Arbeit für den 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

Stellen Sie Ihr Thema so ein, dass es für mich funktioniert hat

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

Und in Ihrem Dialogfragment so einstellen

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

Im 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

für DialogFragmenttransparent


8

Für eine vollständig transparente Verwendung: setStyle (DialogFragment.STYLE_NO_FRAME, android.R.style.Theme_Translucent_NoTitleBar_Fullscreen);

Für benutzerdefinierten Hintergrund: Erstellen Sie eine Stildatei in Ihrem Werteordner (values ​​/ style.xml) und verwenden Sie sie: setStyle (DialogFragment.STYLE_NO_FRAME, yourpackagename.R.style.YOURE_CUSTOM_STYLE);

Überschreiben Sie in Ihrer Stildatei atribute: android: windowBackground , um @ color / DialogBackgroundBlackSemiTransparent zu sein


7

Sie können dies erreichen, indem Sie dies in Dialog Fragment oder BottomSheetDialogFragment hinzufügen

In onCreateDialogMethode

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

setBackgroundDrawableResourceund clearFlagsarbeitet für mich (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

Diejenigen, die den AlertDialog-Builder onCreateDialoganstelle von onCreateViewverwenden, können Themen wie den folgenden Code zuweisen. Ein vollständiger Themensatz ist bei R.style erhältlich . Vergessen Sie nicht, dass einige von ihnen kürzlich unterstützt wurden und auf alten Gerätetelefonen nicht verfügbar sind.

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

Danke, das habe ich gesucht.
Milad Faridnia

3

Versuchen Sie dies, wenn Sie möchten:

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

0

Pro akzeptierter Antwort in 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
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.