【问题标题】:Set status bar color from DialogFragment从 DialogFragment 设置状态栏颜色
【发布时间】:2015-07-29 12:39:00
【问题描述】:

我正在创建一个动态更改状态栏颜色的应用程序。

从任何片段调用时,我在主 Activity 类中的方法都可以正常工作。片段被放置在 Activity pager 中:

public void setStatusBarColorIfPossible(int color) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        getWindow().setStatusBarColor(color);
    }
}

但是,在任何片段中创建并全屏显示的 DialogFragment 中,调用我的方法无效。状态栏立即变黑(在 styles.xml 中设置),我无法更改它。

public class AddOrEditWeekPlanDialog extends DialogFragment {

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

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

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View root = inflater.inflate(R.layout.fragment_dialog, container, false);
        Button button = (Button)root.findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ((ThermostatActivity) getActivity()).setStatusBarColorIfPossible(0xFF0D47A1);
            }
        });

        return root;
    }

    @Override
    public void onResume() {
        super.onResume();

    }
}

styles.xml:

// Set in manifest for main activity
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
</style>

// Set in dialog class
<style name="MyDialog" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:windowIsFloating">false</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
</style>

resources.xml:

<resources>
    <color name="colorPrimary">#FFB72020</color>
    <color name="colorPrimaryDark">#000</color>
    <color name="textColor">#fff</color>
    <color name="tabsScrollColor">#fff</color>
</resources>

谁能解释一下为什么?

【问题讨论】:

    标签: android android-fragments android-dialogfragment


    【解决方案1】:

    为了设置StatusBarColor,您需要设置标志:FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS

    “标志表明此窗口负责为系统栏绘制背景。” (Google API 级别 21)

    试试这个代码:

    public void setStatusBarColorIfPossible(int color) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
           getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
           getWindow().setStatusBarColor(color);
        }
    }
    

    【讨论】:

    • 这会导致对话框也在导航栏下绘制内容。对于那些使用 BottomSheetDialog 的人来说,这尤其成问题,因为它将导航栏按钮放置在您的对话框上。
    • 您找到解决方案了吗?谢谢@Brian
    • 在添加标志 FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS 对话框后停止在键盘打开时调整大小,有任何关于问题的想法吗?
    【解决方案2】:

    这对我有用。

     @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
    
    
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            Objects.requireNonNull(Objects.requireNonNull(getDialog()).getWindow()).addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
            Objects.requireNonNull(Objects.requireNonNull(getDialog()).getWindow()).setStatusBarColor(getResources().getColor(R.color.light_green_400));
        }
    
    }
    

    【讨论】:

      【解决方案3】:

      使用 FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS 并在 getDecorView 中更改索引 0 中的 hight child。

      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
             if (getDialog().getWindow() != null) {
      
                    // Flag
                    getDialog().getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); 
      
                    // DeviceScreenHeight
                    WindowManager windowManager = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
                    DisplayMetrics displayMetrics = new DisplayMetrics();
                    windowManager.getDefaultDisplay().getMetrics(displayMetrics);
                    int deviceScreenHeight = displayMetrics.heightPixels;
      
                    // Change height child At index zero 
                    ((ViewGroup) getDialog().getWindow().getDecorView().getRootView()).getChildAt(0).getLayoutParams().height = deviceScreenHeight;
      
              }
      }
      

      【讨论】:

        【解决方案4】:
        <style name="MyDialogStyle" parent="Theme.AppCompat.Dialog">
            <item name="android:windowNoTitle">true</item>
            <item name="android:windowFullscreen">false</item>
            <item name="android:windowIsFloating">false</item>
            <item name="android:statusBarColor" tools:targetApi="l">@color/white</item>
        
        </style>
        

        你可以通过像这样添加状态栏颜色来改变颜色。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-03-30
          • 1970-01-01
          • 2020-09-12
          • 2019-09-18
          • 2023-01-13
          • 2016-03-06
          • 2020-01-26
          • 2016-11-11
          相关资源
          最近更新 更多