#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);