【问题标题】:the status bar changes it's color to black inside fullscreen dialog fragment android状态栏在全屏对话框片段android中将其颜色更改为黑色
【发布时间】:2017-05-19 00:04:54
【问题描述】:

我正在使用对话框片段。问题是状态栏颜色变为黑色。如何将其更改为其他颜色?这是片段内部的奇怪原因,它工作正常。它在 DialogFragment 中唯一的黑色

        @Override
            public void onStart() {
                super.onStart();    //super.onStart() is where dialog.show() is actually called on the underlying dialog, so we have to do it after this point
                Dialog d = getDialog();
                if (d != null) {

                    int width = ViewGroup.LayoutParams.MATCH_PARENT;
                    int height = ViewGroup.LayoutParams.MATCH_PARENT;
                    d.getWindow().setLayout(width, height);
                    d.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);

                }
            }
     @Override
        public Dialog onCreateDialog(Bundle savedInstanceState) {
            final Dialog dialog = new Dialog(getActivity(), R.style.full_screen_dialog);
            return dialog;

}

【问题讨论】:

    标签: android colors fragment android-dialogfragment android-statusbar


    【解决方案1】:

    你必须设置FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS表示这个Window负责为系统栏绘制背景。

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
            dialog.getWindow().setStatusBarColor(yourColor); 
        }
    

    【讨论】:

    • 这使我能够在显示对话框时设置状态栏颜色,但绘制在透明度的顶部。变暗到与对话框相同的透明度级别可能会很棘手。
    【解决方案2】:

    最好的解决方案是我在这里发布的网站链接

    https://zocada.com/android-full-screen-dialogs-using-dialogfragment/

    我也会在这里上传代码以供参考

    首先在您的样式文件中创建一个样式 FullScreenDialogStyle :

    <style name="FullScreenDialogStyle" parent="Theme.AppCompat.Dialog">
        <item name="android:windowNoTitle">true</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorPrimary">@color/colorPrimary</item>
    
        <!-- Set this to true if you want Full Screen without status bar -->
        <item name="android:windowFullscreen">false</item>
    
        <item name="android:windowIsFloating">false</item>
    
        <!-- This is important! Don't forget to set window background -->
        <item name="android:windowBackground">@color/colorWhite</item>
    
        <!-- Additionally if you want animations when dialog opening -->
        <!--<item name="android:windowEnterAnimation">@anim/slide_up</item>-->
        <!--<item name="android:windowExitAnimation">@anim/slide_down</item>-->
    </style>
    

    在你的 dialogFragment 类中重写 onCreate 方法

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

    然后重写 Onstart 方法,通过它你可以访问 getDialog() 并设置高度和宽度

    @Override
    public void onStart() {
        super.onStart();
        Dialog dialog = getDialog();
        if (dialog != null) {
            int width = ViewGroup.LayoutParams.MATCH_PARENT;
            int height = ViewGroup.LayoutParams.MATCH_PARENT;
            dialog.getWindow().setLayout(width, height);
        }
    }
    

    【讨论】:

      【解决方案3】:

      我刚刚发布了这个问题的解决方案here

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

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

      然后在onCreate 中对DialogFragment 应用样式

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

      【讨论】:

      • 此解决方案所需的最少 sdk 为 19。
      • DialogTheme可以放入res/value-v19/style
      • 有效,但当您在对话框中设置 lp.height = WindowManager.LayoutParams.MATCH_PARENT;getWindow().setAttributes(lp); 时,会导致对话框进入 状态栏。所以不是理想的解决方案,遗憾的是..
      【解决方案4】:

      要更改 DialogFragment 下的状态栏颜色,请在 onCreate 方法下为您的 dialogFragment 设置以下样式。

      喜欢:

      override fun onCreate(savedInstanceState: Bundle?) {
          super.onCreate(savedInstanceState)
          setStyle(DialogFragment.STYLE_NO_TITLE,R.style.FullScreenDialogWithStatusBarColorAccent)
      }
      

      在 style.xml 中添加这个样式

       <style name="FullScreenDialogWithStatusBarColorAccent">
          <item name="android:windowIsTranslucent">true</item>
          <item name="android:windowBackground">@android:color/white</item>
          <item name="android:windowNoTitle">true</item>
          <item name="android:statusBarColor">@color/colorAccent</item>
      
      
          <!--<item name="android:windowAnimationStyle">@style/MateriDocumentAlertsActivityalDialogSheetAnimation</item>-->
      </style>
      

      【讨论】:

        【解决方案5】:

        这是我找到的解决方案:

        将此添加到您的 style.xml 文件中

        <style name="BottomSheetDialogTheme" parent="BaseBottomSheetDialog">
            <item name="android:statusBarColor">@android:color/transparent</item>
        </style>
        
        <!-- set the rounded drawable as background to your bottom sheet -->
        <style name="BottomSheet" parent="@style/Widget.Design.BottomSheet.Modal">
            <item name="android:background">@color/transparent</item>
        </style>
        
        <style name="BaseBottomSheetDialog" parent="@style/Theme.Design.Light.BottomSheetDialog">
            <item name="android:windowIsFloating">false</item>
            <item name="bottomSheetStyle">@style/BottomSheet</item>
        </style>
        

        那么你应该重写BottomSheetDialogFragment 类中的onCreate() 方法并调用:

        @Override
        public void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
        
            setStyle(BottomSheetDialogFragment.STYLE_NORMAL, R.style.BottomSheetDialogTheme);
        
        }
        

        【讨论】:

          【解决方案6】:

          在科特林中

              if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                  window?.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
                  window?.statusBarColor = Color.parseColor("#0173B7")
              }
          

          【讨论】:

            【解决方案7】:

            聚会有点晚了,但设置 IS_FLOATING 标志对我有用。

            <style name="MyTheme.AlertDialog.FullScreen" parent="MyTheme.AlertDialog">
                <item name="windowNoTitle">true</item>
                <item name="android:windowIsFloating">false</item>
                <item name="android:windowAnimationStyle">@style/Animation.AppCompat.Dialog</item>
                <item name="android:windowBackground">@color/white</item>
            </style>
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-08-16
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-09-08
              相关资源
              最近更新 更多