13

Ich habe ein DialogFragment, das ich im Vollbildmodus anzeigen möchte. Ich möchte jedoch immer noch eine Statusleiste und die Hardwaretasten unten sehen. Ich möchte auch eine Hintergrundfarbe der Statusleiste (für Lollipop) festlegen.Fullscreen DialogFragment mit transluzenten StatusBar

Mein Problem ist, dass wenn ich die folgenden Flags in der DialogFragment gesetzt:

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

Sowohl die StatusBar und Hardware-Tastatur wird durchlässig, und die DialogFragment dahinter erstreckt.

Hier ist der Code, der stark reduziert lesbar geworden ist:

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

Hier ist das genannte Thema:

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

Und der Stil des Fragments:

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

Dies ist das Ergebnis: Screenshot

Wie Sie sehen können, erstreckt sich die ToolBar über die StatusBar und Hardwaretasten. Ich weiß nicht, ob ich mich dem richtig annähere. Fehle ich etwas?

EDIT

Dies ist, was die gleiche Ansicht Blick mag, wenn ich

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

enter image description here

Antwort

2

Sie setzen müssen fitsystemwindows = true entfernen. Eine andere Möglichkeit besteht darin, einen Space mit 0dp hinzuzufügen und seine Höhe auf 25dp zu ändern, wenn das Dialogfeld angezeigt wird.

Um die Raumgröße zu ändern, das Layout params verwenden, lesen Sie in diesem Beitrag: How to create a RelativeLayout programmatically with two buttons one on top of the other?

+0

Vielleicht kann sein, dass die Höhe des Dialogs ist kleiner als die Werkzeugleiste. – Dahnark

+0

Ich folge nicht, könnten Sie bitte erarbeiten? – pnit

+0

In Appcompat 21 für Lollipop können Sie die Höhe in der XML-Datei festlegen. Wenn Sie eine Symbolleiste verwenden, hat sie möglicherweise mehr Höhe als das Dialogfeld. – Dahnark

4

Versuchen Sie, die gleiche Art von Ihrer App verwenden. Ich habe mit einem einfachen Dialog ohne Fragment getestet und funktioniert gut. wie folgt aus:

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

Was ist der "CardDetailsDialogStyle"? –

+0

@ThangBA CardDetailsDialogStyle ist ein Stil, der auf Aktivität angewendet wird –

2

Für alle, die dieses Problem nach wie vor hat das Sie wie folgt vor. Dies löst nur Hälfte des Problems, das gebucht wird, d. H. Schwarze Statusleiste.

In folgendem Thema res/Wert-v21/style

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

Und dann Stil anwenden auf DialogFragment in onCreate

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

bearbeitet , wenn Sie‘ Problem mit Ihrem Dialog Thema dann uns e dieser Stil z.B.colorAccent oder colorControlHighlight etc

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

enter image description here

0

In meinem Fall SYSTEM_UI_FLAG_LAYOUT_STABLE gelöstes Problem mit

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