No se puede hacer que el DialogFragment personalizado sea transparente sobre el Fragmento


98

Necesito crear un diálogo sobre un fragmento (que ocupa toda la pantalla). El cuadro de diálogo debe ser un cuadro de diálogo flotante que se colocará sobre el fragmento con el fragmento oscurecido fuera del fragmento.

Para el diálogo personalizado, tengo un diseño lineal que tiene bordes curvos, no importa lo que haga, el diálogo tiene un borde negro en todos los lados (muy pequeño). He intentado todo para hacerlo transparente y desaparecer (de modo que todo el diálogo sea solo el diseño lineal: cuadro curvo)

Para DialogFragment, esto es lo que tengo para 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 es solo un LinearLayout que tiene android: backgroung configurado en # 000000

Este es mi estilo para el diálogo personalizado

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

Probé todo tipo de combinaciones en este estilo (por lo que he visto en línea) y no puedo deshacerme de ese molesto borde negro, puedo pintarlo de blanco o de cualquier otro color si configuro ese fondo de LinearLayout en cualquier otra cosa que no sea # 000000 ...

He pasado literalmente de 3 a 4 horas en esto, espero que alguien más pueda ayudar ...

Respuestas:


302

Tratar

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

en sus DialogFragment'sonCreateView


5
es posible que también desee eliminar el fondo negro medio transparente (atenuación), verifique esta respuesta: stackoverflow.com/a/33800422/2115904
Andriy Bas

4
También elimina todos los márgenes. El cuadro de diálogo se amplía al ancho completo.
Uday

1
Y provocará una excepción: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.Window android.app.Dialog.getWindow()' on a null object reference.
CoolMind

1
También puedes llamar en su getDialog().getWindow().setBackgroundDrawableResource(android.R.color.transparent);lugar. Para que esto no invoque una excepción, debe llamar a un método DialogFragmentfrom Activity o Fragment through dialogFragment.show(...);, no a FragmentTransaction add.
CoolMind

2
En caso de que alguien está buscando el fragmento Kotlin, aquí está: dialog?.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)).
Francis Laclé

24

Pruebe esto ( Cómo crear un DialogFragment 100% personalizado ) este trabajo para el diálogo

    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

Establecer su tema de esta manera funcionó para mí

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

Y en su fragmento de diálogo configurado así

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

En 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

para DialogFragmenttransparente


8

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

Para un fondo personalizado, cree un archivo de estilo en su carpeta de valores (values ​​/ style.xml) y utilícelo: setStyle (DialogFragment.STYLE_NO_FRAME, yourpackagename.R.style.YOURE_CUSTOM_STYLE);

en su archivo de estilo anule el atributo: android: windowBackground para ser @ color / DialogBackgroundBlackSemiTransparent


7

Puede lograrlo agregando esto en Dialog Fragment o BottomSheetDialogFragment

En onCreateDialogmétodo

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

setBackgroundDrawableResourcey clearFlagsfunciona para mí (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

Aquellos que usan el constructor AlertDialog en onCreateDialoglugar de onCreateViewpueden asignar un tema como el siguiente código. El conjunto completo de temas se puede encontrar en R.style . No olvide que algunos de ellos son compatibles recientemente y no están disponibles en teléfonos con dispositivos antiguos.

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

Gracias, esto es lo que estaba buscando.
Milad Faridnia

3

Prueba esto si quieres:

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

0

Por respuesta aceptada, en 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
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.