Попробуйте
using (Image image = Image.FromFile(Path))
{
using (MemoryStream m = new MemoryStream())
{
image.Save(m, image.RawFormat);
byte[] imageBytes = m.ToArray();
// Convert byte[] to Base64 String
string base64String = Convert.ToBase64String(imageBytes);
return base64String;
}
}
Мне не удалось воспроизвести проблему, которую вы описали, используя ваш пример проекта. Я могу показать и удалить фрагмент независимо от того, переключаю я цвет строки состояния или нет.
Также возможно, что причина, по которой это вызывает ошибки, заключается в том, что вы не применяете / не удаляете другие флаги, упомянутые в документации setStatusBarColor()
. Попробуйте это:
// clear FLAG_TRANSLUCENT_STATUS flag:
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
// add FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS flag to the window
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
// finally change the color
window.setStatusBarColor(ContextCompat.getColor(activity,R.color.my_statusbar_color));
Как ни странно, я смог воспроизвести проблему, которую вы описали после попытки кода выше, что делает его еще более запутанным.
Поэтому я рекомендую альтернативный подход - использовать CoordinatorLayout вместо окна для рисования цвета строки состояния. Сделайте CoordinatorLayout прямым потомком DrawerLayout и добавьте к нему android:fitsSystemWindows="true"
. Тогда вместо того, чтобы звонить window.setStatusBarColor()
, звоните coordinatorLayout.setStatusBarBackgroundColor()
. Это решение не требует каких-либо специальных оконных флагов, но обратите внимание, что для того, чтобы это работало, вам также необходимо добавить следующую строку в тему:
<item name="android:statusBarColor">@android:color/transparent</item>
Я также использую CoordinatorLayout в большом проекте для динамического изменив цвет строки состояния, так что, надеюсь, она подойдет и вам. Это определенно работает в примере проекта.