From 232e2aee393f2010466433781712c8a576d9d803 Mon Sep 17 00:00:00 2001 From: kerams Date: Mon, 26 Jan 2026 11:49:42 +0100 Subject: [PATCH] Fix Android surface recreation (#20538) --- src/Android/Avalonia.Android/AvaloniaView.cs | 10 ++++++++++ .../SkiaPlatform/InvalidationAwareSurfaceView.cs | 3 +++ 2 files changed, 13 insertions(+) diff --git a/src/Android/Avalonia.Android/AvaloniaView.cs b/src/Android/Avalonia.Android/AvaloniaView.cs index 665feb2e2b..86b96772ce 100644 --- a/src/Android/Avalonia.Android/AvaloniaView.cs +++ b/src/Android/Avalonia.Android/AvaloniaView.cs @@ -39,6 +39,7 @@ namespace Avalonia.Android OnConfigurationChanged(); _view.InternalView.SurfaceWindowCreated += InternalView_SurfaceWindowCreated; + _view.InternalView.SurfaceWindowDestroyed += InternalView_SurfaceWindowDestroyed; _accessHelper = new AvaloniaAccessHelper(this); ViewCompat.SetAccessibilityDelegate(this, _accessHelper); @@ -51,9 +52,18 @@ namespace Avalonia.Android if (Visibility == ViewStates.Visible) { OnVisibilityChanged(true); + + _root?.InvalidateMeasure(); + Invalidate(); } } + private void InternalView_SurfaceWindowDestroyed(object? sender, EventArgs e) + { + OnVisibilityChanged(false); + _surfaceCreated = false; + } + internal TopLevelImpl TopLevelImpl => _view; internal TopLevel? TopLevel => _root; diff --git a/src/Android/Avalonia.Android/Platform/SkiaPlatform/InvalidationAwareSurfaceView.cs b/src/Android/Avalonia.Android/Platform/SkiaPlatform/InvalidationAwareSurfaceView.cs index 4a6058e078..3cdda52764 100644 --- a/src/Android/Avalonia.Android/Platform/SkiaPlatform/InvalidationAwareSurfaceView.cs +++ b/src/Android/Avalonia.Android/Platform/SkiaPlatform/InvalidationAwareSurfaceView.cs @@ -18,6 +18,8 @@ namespace Avalonia.Android private double _scaling = 1; public event EventHandler? SurfaceWindowCreated; + public event EventHandler? SurfaceWindowDestroyed; + public PixelSize Size => _size; public double Scaling => _scaling; @@ -61,6 +63,7 @@ namespace Avalonia.Android .Log(this, "InvalidationAwareSurfaceView Destroyed"); ReleaseNativeWindowHandle(); _size = new PixelSize(1, 1); + SurfaceWindowDestroyed?.Invoke(this, EventArgs.Empty); } public virtual void SurfaceRedrawNeeded(ISurfaceHolder holder)