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

Tolga E.
quelle

Antworten:

301

Versuchen

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

in Ihrem DialogFragment‚sonCreateView

CD
quelle
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();
Sahar
quelle
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);
}
}
Ameen Maheen
quelle
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

Sanghyun Byun
quelle
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

user3193413
quelle
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;
   }
Nanda Gopal
quelle
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);
    }
NickUnuchek
quelle
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();
    }
Hesam
quelle
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);
}
Kitesurfer
quelle
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
}
the_prole
quelle