具有半透明StatusBar的全屏DialogFragment

pni*_*nit 17 android statusbar android-dialogfragment android-5.0-lollipop

我有一个DialogFragment,我想全屏显示.但我仍然想要一个StatusBar,以及底部的硬件按钮.我还想设置StatusBar的背景颜色(对于Lollipop).

我的问题是,如果我在DialogFragment中设置以下标志:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);   
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
Run Code Online (Sandbox Code Playgroud)

StatusBar和Hardware键盘都变得半透明,DialogFragment在这些后面延伸.

这是代码,它已经大大减少,变得可读:

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;
}
}
Run Code Online (Sandbox Code Playgroud)

这是推荐的主题:

<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>
Run Code Online (Sandbox Code Playgroud)

和片段的风格:

<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>
Run Code Online (Sandbox Code Playgroud)

这是结果: 截图

如您所见,ToolBar扩展了StatusBar和硬件按钮.我不知道我是否正确接近这一点.我错过了什么吗?

编辑

这是删除时相同视图的样子

getDialog().getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

小智 6

尝试使用您应用中的相同样式.我用简单的对话框测试没有片段,工作正常.像那样:

new Dialog(context, R.style.CardDetailsDialogStyle);
Run Code Online (Sandbox Code Playgroud)


Nom*_*que 5

对于仍然遇到此问题的任何人,请执行以下操作。这只是解决了发布的问题的一半,即黑色状态栏

将以下主题添加到res/value-v21/style

<style name="DialogTheme" parent="@style/Base.Theme.AppCompat.Light.Dialog">
     <item name="android:windowTranslucentStatus">true</item>
</style>
Run Code Online (Sandbox Code Playgroud)

然后在DialogFragment中应用样式onCreate

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

如果您的对话框主题有问题,请进行编辑,然后使用此样式,例如colorAccentcolorControlHighlight

<style name="DialogTheme" parent="@style/ThemeOverlay.AppCompat.Dialog">
     <item name="android:windowTranslucentStatus">true</item>
</style>
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明


adr*_*ray 5

就我而言,SYSTEM_UI_FLAG_LAYOUT_STABLE解决了重叠问题

        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);
        }
Run Code Online (Sandbox Code Playgroud)


Jav*_*oba 2

您必须设置 fitsystemwindows = true。另一种方法是添加一个 0dp 的空间,并在对话框显示时将其高度更改为 25dp。

要更改空间大小,请使用布局参数,请查看这篇文章:如何以编程方式创建一个相对布局,其中两个按钮一个在另一个之上?