13

Ho un oggetto DialogFragment che voglio mostrare a schermo intero. Tuttavia, desidero comunque che sia presente un StatusBar e i pulsanti hardware in basso. Voglio anche impostare un colore di sfondo dello StatusBar (per Lollipop).DialogFragment schermo intero con StatusBar traslucido

Il mio problema è che se ho impostato i seguenti flag nel DialogFragment:

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

Sia la barra di stato e la tastiera hardware diventa traslucida, e il DialogFragment si estende dietro questi.

Ecco il codice, che è stato notevolmente ridotto per diventare leggibile:

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

Qui è il tema di cui:

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

E lo stile del frammento:

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

Questo è il risultato: Screenshot

Come si può vedere, la barra degli strumenti si estende oltre i pulsanti StatusBar e hardware. Non so se mi sto avvicinando correttamente. Mi sto perdendo qualcosa?

EDIT

Questo è ciò che la stessa vista sguardo piace quando ho rimuovere

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

enter image description here

risposta

2

È necessario impostare fitsystemwindows = true. L'altro modo è aggiungere uno spazio con 0dp e modificarne l'altezza a 25dp quando la finestra di dialogo verrà mostrata.

Per cambiare le dimensioni dello spazio, utilizzare params di layout, controllare questo post: How to create a RelativeLayout programmatically with two buttons one on top of the other?

+0

Forse può essere che l'elevazione della finestra di dialogo è inferiore alla barra degli strumenti. – Dahnark

+0

Non sto seguendo, potresti per favore elaborare? – pnit

+0

In appclat 21 per il lecca-lecca, è possibile impostare l'elevazione in xml. Se stai usando una barra degli strumenti, forse ha più altezza della finestra di dialogo. – Dahnark

4

Prova Usa lo stesso stile dalla tua app. Ho provato con un semplice dialogo senza frammenti e funziona perfettamente. Come quella:

new Dialog(context, R.style.CardDetailsDialogStyle); 
+0

Che cos'è il "CardDetailsDialogStyle"? –

+0

@ThangBA CardDetailsDialogStyle è lo stile che viene applicato all'attività –

2

Per chi sta ancora avendo questo problema, procedere come segue. Questo risolve solo il problema di , ovvero la barra di stato nera.

Add seguente tema per res/valore-V21/stile

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

e quindi applicare Stile sulla DialogFragment in onCreate

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

Modifica se' problema con il tuo tema di dialogo quindi noi e questo stile per es.colorAccent o colorControlHighlight ecc

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

enter image description here

0

Nel mio caso SYSTEM_UI_FLAG_LAYOUT_STABLE problema risolto con sovrapposizione

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