android заменяет строку состояния и запрещает доступ к существующей строке состояния

#c# #android #xamarin #statusbar

#c# #Android #xamarin #Строка состояния

Вопрос:

Я прочитал несколько сообщений здесь, и ни одно из них не является именно тем, что я ищу. Они помогли мне пройти долгий путь, но у меня есть одна проблема, которую мне все еще нужно решить.

Я использую Xamarin для Android и в настоящее время ориентируюсь на API уровня 14 и выше.

У меня есть следующий код (C # и Xamarin)

 IWindowManager windowManager;
WindowManagerLayoutParams parm = null;

View statusBarView = new View(this);

windowManager = GetSystemService(Context.WindowService).JavaCast<IWindowManager>();

statusBarView.SetBackgroundColor(Color.Green);

parm = new WindowManagerLayoutParams(WindowManagerLayoutParams.FillParent, 400,
                                     WindowManagerTypes.SystemOverlay, 
                                     WindowManagerFlags.LayoutNoLimits,
                                     Format.Transparent);

parm.Gravity = GravityFlags.Top;

windowManager.AddView(statusBarView, parm); 
  

Примечание: 400 — это просто число, которое я ввел туда для тестирования, я фактически получу фактическую высоту строки состояния.

Это отображается просто отлично, но пользователь все равно может перейти к панели уведомлений. Существует несколько приложений, которые делают то, что я ищу, мне просто нужна помощь с последним кусочком головоломки.

Эта часть о том, как предотвратить попадание событий касания в текущую строку состояния.

Мы высоко ценим любую помощь!

Ответ №1:

Вы хотите скрыть строку состояния? Если да, https://developer.android.com/training/system-ui/status.html

Комментарии:

1. Это по-прежнему позволяет пользователю получить доступ к строке по умолчанию. Мне нужно заменить существующую.

2. Я не думаю, что вы можете удалить его без root (для этого nova требуется root, если я правильно помню).

Ответ №2:

Если вы хотите отключить строку состояния, используйте это

 protected override void OnCreate(Bundle bundle)

{
customViewGroup view = new customViewGroup(this);

            WindowManagerLayoutParams localLayoutParams = new WindowManagerLayoutParams();
            localLayoutParams.Type = WindowManagerTypes.SystemError;
            localLayoutParams.Gravity = GravityFlags.Top;
            localLayoutParams.Flags = WindowManagerFlags.NotFocusable |
            WindowManagerFlags.NotTouchModal | WindowManagerFlags.LayoutInScreen;
            localLayoutParams.Width = WindowManagerLayoutParams.MatchParent;
            localLayoutParams.Height = (int)(50 * Resources.DisplayMetrics.ScaledDensity);
            localLayoutParams.Format = Format.Transparent;

            manager.AddView(view, localLayoutParams);

}


public class customViewGroup : ViewGroup
        {
            public customViewGroup(Context context) : base(context)
            {
            }
            public override bool OnTouchEvent(MotionEvent ev)
            {
                return true;
            }
            protected override void OnLayout(bool changed, int l, int t, int r, int b)
            {
                // throw new NotImplementedException();
            }
        }
  

Для повторного включения используйте

 manager.RemoveView(view);