Почему мое приложение Xamarin Forms находится поверх всего остального в Android 4.4 — API 19 (Samsung Galaxy S3)?

#android #xamarin

#Android #xamarin

Вопрос:

У меня такая странная ситуация с моим приложением Xamarin Forms (версия 2.3.2.127) на Android 4.4 API 19, запущенным на Samsung Galaxy S3. При запуске приложения (по крайней мере, в режиме отладки) оно находится поверх всего интерфейса Android, включая программную клавиатуру, выдвижную строку состояния и оповещения. В основном просто все. Как вы можете себе представить, это очень плохо, потому что я не вижу программную клавиатуру при фокусировке поля ввода. Когда я нажимаю на место, где обычно отображается программная клавиатура, оно вводит затронутые буквы. Это указывает на то, что клавиатура находится там, но только визуально за интерфейсом приложения.

Когда я тестирую приложение на Android API 21 (Galaxy S7 Edge), все работает так, как ожидалось. Также на WP 8.1 и iOS (iPhone 4s и iPhone 6) оно работает просто отлично.

Splashscreen.cs

Сначала приложение открывает экран-заставку, на этом этапе оно не накладывается на Android OS jet:

 [Activity(Label = "Mett Login", MainLauncher = true, NoHistory = true, Theme = "@style/Theme.Splash", Icon = "@drawable/icon", ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation, ScreenOrientation = ScreenOrientation.Portrait)]
public class SplashScreen : Activity
{
    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);

        var intent = new Intent(this, typeof(MainActivity));
        StartActivity(intent);
    }
}
  

MainActivity.cs

После этого он запускает основной класс activity. Здесь начинают происходить странные вещи:

 [Activity(Label = "Mett Login", Theme = "@android:style/Theme.DeviceDefault", ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsApplicationActivity
{
    protected static ActionBar mActionBar;
    protected static Window mWindow;

    protected override void OnCreate (Bundle bundle)
    {
        Window.AddFlags(WindowManagerFlags.DrawsSystemBarBackgrounds);

        base.OnCreate (bundle);

        global::Xamarin.Forms.Forms.Init (this, bundle);
        LoadApplication (new MettAuthenticator.App ());

        ActionBar.SetIcon(Android.Resource.Color.Transparent);

        mActionBar = ActionBar;
        mWindow = Window;

        if(IsPlayServicesAvailable())
        {
            Intent intent = new Intent(this, typeof(RegistrationIntentService));
            StartService(intent);
        }
    }

    [Some extra code...]
}
  

Единственное, что я мог найти в приложениях, которые всегда были на высоте, было связано с тем, что люди хотели использовать (часть) своего приложения в качестве системного оповещения, используя разрешение SYSTEM_ALERT_WINDOW. Я пытался использовать некоторые вещи, которые я нашел в этой теме, чтобы отменить функциональность always on top, но, к сожалению, ничего не помогло.

Пожалуйста, дайте мне знать, если вам нужна дополнительная информация, чтобы дать мне правильный ответ.

Ответ №1:

Я сам нашел решение!

Проблема, вызывающая это, заключается в следующей строке:

 Window.AddFlags(WindowManagerFlags.DrawsSystemBarBackgrounds);
  

Этот флаг недоступен до SDK 21. Каким-то образом это приводит к наложению приложения на весь интерфейс Android. Я исправил это, добавив одну строку:

 if ((int)Build.VERSION.SdkInt >= 21)
    Window.AddFlags(WindowManagerFlags.DrawsSystemBarBackgrounds);