Tengo un DialogFragment que quiero mostrar en pantalla completa. Yo, no obstante quiero una barra de Estado presentes, y los botones de hardware en la parte inferior. También quiero establecer un color de fondo de la barra de Estado (para Lollipop).

Mi problema es que si puedo configurar los siguientes parámetros en el DialogFragment:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);   
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);

Tanto la barra de Estado y teclado de Hardware se vuelve translúcido, y la DialogFragment se extiende detrás de estos.

Aquí está el código, que se ha reducido considerablemente a ser legible:

public class CardDetailsDialog extends DialogFragment {

Setup parameters...

public static CardDetailsDialog newInstance(final long cardId, final long projectId){
    CardDetailsDialog frag = new CardDetailsDialog();
    frag.setStyle(DialogFragment.STYLE_NORMAL, R.style.CardDetailsDialogStyle);
    return frag;
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    if(getDialog() != null) {
        getDialog().getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
        getDialog().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        getDialog().getWindow().getAttributes().windowAnimations = R.style.DialogSlideAnimation;
        getDialog().getWindow().setLayout(LinearLayout.LayoutParams.MATCH_PARENT,
                LinearLayout.LayoutParams.MATCH_PARENT);
        getDialog().getWindow().setStatusBarColor(Color.RED);
    }
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    super.onCreateView(inflater, container, savedInstanceState);
    View view = inflater.inflate(R.layout.card_details, container, false);

    Handle everything that happens inside the view...

    return view;
}
}

Aquí es el referido tema:

<style name="CardDetailsDialogStyle" parent="@style/Theme.AppCompat.Light.Dialog" >
    <item name="android:windowBackground">@null</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowFrame">@null</item>
    <item name="android:windowIsFloating">true</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>
    <item name="android:windowSoftInputMode">stateUnspecified|adjustPan</item>
</style>

Y el estilo del fragmento:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/pp.whiteBackgroundColor" >

<android.support.v7.widget.Toolbar xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/card_details_toolbar"
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    android:layout_alignParentTop="true"
    app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
    app:popupTheme="@style/PopupMenutheme">
</android.support.v7.widget.Toolbar>

    <ScrollView
        android:id="@+id/details_scrollview"
        android:layout_height="wrap_content"
        android:layout_width="match_parent">

        All subview elements here...

    </ScrollView>

</RelativeLayout>

Este es el resultado: Pantalla completa DialogFragment con la barra de Estado translúcido

Como se puede ver, la Barra de herramientas se extiende sobre la barra de Estado y los botones de hardware. No sé si me estoy acercando esto correctamente. Me estoy perdiendo algo?

EDITAR

Esto es lo que el mismo aspecto de la vista le gusta cuando me quite

getDialog().getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);

Pantalla completa DialogFragment con la barra de Estado translúcido

OriginalEl autor pnit | 2015-02-02

5 Comentarios

  1. 6

    Tratar de usar el mismo Estilo de su Aplicación. He probado con un simple cuadro de diálogo sin fragmento y funciona bien.
    Como que:

    new Dialog(context, R.style.CardDetailsDialogStyle);
    ¿Qué es el «CardDetailsDialogStyle» ?
    CardDetailsDialogStyle es el estilo que se aplica a la actividad

    OriginalEl autor tiagotoxa

  2. 3

    Para cualquier persona que sigue teniendo este problema, haga lo siguiente. Esto sólo se soluciona la mitad del problema que se ha publicado es decir, barra de estado negra.

    Agregar el siguiente tema a res/valor-v21/estilo

    <style name="DialogTheme" parent="@style/Base.Theme.AppCompat.Light.Dialog">
         <item name="android:windowTranslucentStatus">true</item>
    </style>

    Y, a continuación, aplicar el Estilo en DialogFragment en onCreate

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setStyle(DialogFragment.STYLE_NO_TITLE, R.style.DialogTheme);
    }

    Editar
    si has problema con el tema del diálogo, a continuación, utilizar este estilo, por ejemplo, colorAccent o colorControlHighlight etc

    <style name="DialogTheme" parent="@style/ThemeOverlay.AppCompat.Dialog">
         <item name="android:windowTranslucentStatus">true</item>
    </style>

    Pantalla completa DialogFragment con la barra de Estado translúcido

    OriginalEl autor Noman Rafique

  3. 3

    En mi caso SYSTEM_UI_FLAG_LAYOUT_STABLE solucionado el problema con la superposición de

            int width = ViewGroup.LayoutParams.MATCH_PARENT;
    
            int height = ViewGroup.LayoutParams.MATCH_PARENT;
    
            dialog.getWindow().setLayout(width,height);
    
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
                dialog.getWindow().setStatusBarColor(getResources().getColor(R.color.darkGrayTransp));
                dialog.getWindow().getDecorView().setSystemUiVisibility(SYSTEM_UI_FLAG_LAYOUT_STABLE);//solves issue with statusbar
                dialog.getWindow().setGravity(Gravity.CENTER_HORIZONTAL| Gravity.TOP);
            }
    Esta solución funcionó para mí… sin la línea de diálogo.getWindow().getDecorView().setSystemUiVisibility(SYSTEM_UI_FLAG_LAYOUT_STABLE); Gracias!!

    OriginalEl autor adray

  4. 2

    Tiene que establecer fitsystemwindows = true. Otra forma es agregar un Espacio con 0dp y cambiar su altura a 25dp cuando el diálogo se va a mostrar.

    Para cambiar el tamaño del espacio, el uso de diseño de parámetros, consulte este post: Cómo crear un RelativeLayout de la programación con dos botones en la parte superior de la otra?

    Tal vez puede ser que la elevación de la ventana es menor que el de la barra de herramientas.
    No estoy siguiendo, por favor podría elaborar?
    En appcompat 21 para lollipop, puede establecer la elevación en el xml. Si usted está utilizando una barra de herramientas, tal vez tiene más desnivel que el cuadro de diálogo.
    Gracias que funcionó! Aquí está una parte de la documentación: developer.android.com/reference/android/view/…

    OriginalEl autor JavierSegoviaCordoba

  5. 0
    <style name="DialogTheme" parent="Theme.AppCompat.Light.NoActionBar">
            <item name="android:windowTranslucentStatus">true</item>
            <item name="android:windowNoTitle">true</item>
            <item name="android:windowFullscreen">true</item>
            <item name="android:windowIsFloating">false</item>
        </style>

    OriginalEl autor Chhaya

Dejar respuesta

Please enter your comment!
Please enter your name here