webentwicklung-frage-antwort-db.com.de

Vollbild-DialogFragment mit durchscheinender Statusleiste

Ich habe ein DialogFragment, das ich im Vollbild anzeigen möchte. Ich möchte jedoch immer noch eine StatusBar präsentieren, und die Hardwaretasten unten. Ich möchte auch eine Hintergrundfarbe der Statusleiste (für Lollipop) festlegen.

Mein Problem ist, dass ich die folgenden Flags im DialogFragment setze:

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

Sowohl die StatusBar- als auch die Hardwaretastatur werden durchscheinend und das DialogFragment erstreckt sich dahinter.

Hier ist der Code, der stark reduziert wurde, um lesbar zu werden:

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

Das ist das Ergebnis: Screenshot

Wie Sie sehen, erstreckt sich die Toolbar über die StatusBar- und Hardware-Schaltflächen. Ich weiß nicht, ob ich das richtig angehe. Fehlt mir etwas?

EDIT

So sieht die gleiche Ansicht aus, wenn ich sie entferne

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

enter image description here

15
pnit

Verwenden Sie den gleichen Stil aus Ihrer App. Ich habe mit einfachen Dialog ohne Fragment getestet und funktioniert einwandfrei. So sieht es aus:

new Dialog(context, R.style.CardDetailsDialogStyle);
5
tiagotoxa

Für jeden, der dieses Problem noch hat, führen Sie folgende Schritte aus. Dies löst nurdie Hälfte des Problems, d. H. Schwarze Statusleiste

Fügen Sie das folgende Thema zures/value-v21/stylehinzu.

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

Dann wende Style auf DialogFragment in onCreate an

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

Bearbeiten Wenn Sie Probleme mit Ihrem Dialogdesign haben, verwenden Sie diesen Stil, z. colorAccent oder colorControlHighlight etc 

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

 enter image description here

2
Noman Rafique

Sie müssen Fitsystemwindows = true setzen. Eine andere Möglichkeit besteht darin, ein Leerzeichen mit 0 dB hinzuzufügen und seine Höhe in 25 dB zu ändern, wenn das Dialogfeld angezeigt wird.

Um die Speicherplatzgröße zu ändern, verwenden Sie Layout-Parameter. Überprüfen Sie diesen Beitrag: Wie kann ein RelativeLayout programmgesteuert mit zwei Schaltflächen übereinander erstellt werden?

In meinem Fall löste SYSTEM_UI_FLAG_LAYOUT_STABLE ein Problem mit Überlappung 

        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);
        }
2
adray
<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>
0
Chhaya