Установите цвет строки состояния из диалогового окна "Диалог"
Я создаю приложение, которое динамически изменяет цвет строки состояния.
Мой метод в основном классе Activity отлично работает при вызове из любого фрагмента. Фрагменты помещаются в пейджер активности:
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>
Кто-нибудь может объяснить мне, почему?
Ответы
Ответ 1
Чтобы установить SetStatusBarColor, вам нужно установить флаг: FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS
"Флаг, указывающий, что это окно отвечает за рисование фона для системных баров." (Уровень API Google 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);
}
}
Ответ 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 и измените hight child в индексе 0 в getDecorView.
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;
}
}