android - 带有半透明状态栏的全屏 DialogFragment

标签 android android-5.0-lollipop statusbar android-dialogfragment

我有一个想要全屏显示的 DialogFragment。然而,我仍然想要一个状态栏,以及底部的硬件按钮。我还想设置 StatusBar 的背景颜色(用于 Lollipop)。

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

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

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

这里是引用的主题:

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

以及 fragment 的样式:

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

这是结果:Screenshot

如您所见,工具栏延伸到状态栏和硬件按钮之上。我不知道我是否正确地处理了这个问题。我错过了什么吗?

编辑

这就是我删除时相同 View 的样子

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

enter image description here

最佳答案

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

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

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

然后在onCreate

中的DialogFragment上应用Style
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setStyle(DialogFragment.STYLE_NO_TITLE, R.style.DialogTheme);
}

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

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

enter image description here

关于android - 带有半透明状态栏的全屏 DialogFragment,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28284608/

相关文章:

java - 定位用户当前位置并在 Google map 中显示

android - 使用 actionLayout 触摸菜单项的反馈

java - 如何打开关闭应用程序后打开的最后一个 fragment 并使用抽屉导航和导航组件重新打开它

java - 如何使用 OS Lollipop 在 Android 中裁剪 Java 图像

安卓电视偏好标准

cocoa - LSUIElement 的行为与 activateIgnoringOtherApps 不一致

android - 牛轧糖状态栏上的抽屉导航?

ios - 即使使用 UIModalPresentationOverFullScreen 也更改 UIStatusbarStyle

java - Android:使用带有动态 url 的 Retrofit

android - 自动 gradle 下载而不是 cordova 中的本地 gradle