2015-07-29 2 views
9

Я создаю приложение, которое динамически изменяет цвет строки состояния.Установить цвет строки состояния из DialogFragment

Мой метод в основном классе активности отлично работает при вызове из любого фрагмента. Фрагменты помещаются в активность пейджера:

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> 

Любой человек может объяснить мне, почему?

ответ

11

Для setStatusBarColor вам нужно установить флаг: 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); 
    } 
} 
+5

Это заставляет диалоговое окно рисовать содержимое под навигационной панелью. Для тех, кто использует BottomSheetDialog, это особенно проблематично, потому что он помещает кнопки навигационной панели в ваш диалог. – Brian

+1

Вы найдете решение? Спасибо @Brian – UserNameYo

0

использование FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS и изменить высоту ребенок в индексе 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; 

     } 
} 
Смежные вопросы