XamarinCommunityToolkit icon indicating copy to clipboard operation
XamarinCommunityToolkit copied to clipboard

[Bug] TabViewItem content in TabView height is constrained using Android WindowSoftInputMode AdjustResize

Open DanielGlick opened this issue 3 years ago • 0 comments

Description

TabViews are not resizing properly when on Android SoftInputMode is AdjustResize

Stack Trace

Link to Reproduction Sample

Steps to Reproduce

  1. Call this in Xamarin Community Toolkit Sample app Forms.PlatformConfiguration.AndroidSpecific.Application.SetWindowSoftInputModeAdjust(this, Forms.PlatformConfiguration.AndroidSpecific.WindowSoftInputModeAdjust.Resize);

  2. Modify one of the TabView sample pages to have a tab with a lot of items. I used the GettingStartedPage (Clear out all content in the Xaml file)

using Xamarin.Forms;

namespace Xamarin.CommunityToolkit.Sample.Pages.Views.TabView
{
	public partial class GettingStartedPage : BasePage
	{
		public GettingStartedPage()
		{
			Content = GetContent();
			InitializeComponent();
		}

		UI.Views.TabView GetContent()
		{
			var tabView = new UI.Views.TabView()
			{
				IsTabTransitionEnabled = false,
				IsSwipeEnabled = false
			};

			tabView.TabItems.Add(new UI.Views.TabViewItem()
			{
				TabWidth = 60,
				Text = $"Tab 1",
				FontAttributesSelected = FontAttributes.Italic,
				TextColorSelected = Color.Red,
				Content = GetBigContent()
			});

			return tabView;
		}

		ScrollView GetBigContent()
		{
			var content = new ScrollView();

			var stack = new StackLayout();

			stack.Children.Add(new Grid() { HeightRequest = 150, Children = { new Label() { Text = "Tap here to dismiss keyboard", HorizontalOptions = LayoutOptions.Center, VerticalOptions = LayoutOptions.Center } } });
			stack.Children.Add(new Entry() { Text = "Item 1" });
			stack.Children.Add(new Entry() { Text = "Item 2" });
			stack.Children.Add(new Entry() { Text = "Item 3" });
			stack.Children.Add(new Entry() { Text = "Item 4" });
			stack.Children.Add(new Entry() { Text = "Item 5" });
			stack.Children.Add(new Entry() { Text = "Item 6" });
			stack.Children.Add(new Entry() { Text = "Item 7" });
			stack.Children.Add(new Entry() { Text = "Item 8" });
			stack.Children.Add(new Entry() { Text = "Item 9" });
			stack.Children.Add(new Entry() { Text = "Item 10" });
			stack.Children.Add(new Entry() { Text = "Item 11" });
			stack.Children.Add(new Entry() { Text = "Item 12" });
			stack.Children.Add(new Entry() { Text = "Item 13" });
			stack.Children.Add(new Entry() { Text = "Item 14" });
			stack.Children.Add(new Entry() { Text = "Item 15" });
			stack.Children.Add(new Entry() { Text = "Item 16" });
			stack.Children.Add(new Entry() { Text = "Item 17" });
			stack.Children.Add(new Entry() { Text = "Item 18" });
			stack.Children.Add(new Entry() { Text = "Item 19" });
			stack.Children.Add(new Entry() { Text = "Item 20" });
			stack.Children.Add(new Entry() { Text = "Item 21" });
			stack.Children.Add(new Entry() { Text = "Item 22" });
			stack.Children.Add(new Entry() { Text = "Item 23" });
			stack.Children.Add(new Entry() { Text = "Item 24" });
			stack.Children.Add(new Entry() { Text = "Item 25" });
			stack.Children.Add(new Entry() { Text = "Item 26" });
			stack.Children.Add(new Entry() { Text = "Item 27" });
			stack.Children.Add(new Entry() { Text = "Item 28" });

			content.Content = stack;

			return content;
		}
	}
}
  1. Run the app and navigate to the tab view sample page you modified
  2. Click on one of the entries
  3. Tap the dismiss label at the top

Expected Behavior

Things should resize correctly

Actual Behavior

There is space where the keyboard was that is now blank

Basic Information

  • Version with issue: 2.0.1
  • Last known good version: Unknown
  • IDE: Visual studio
  • Platform Target Frameworks:
    • Android: 11
  • Android Support Library Version: Unknown
  • Nuget Packages:
  • Affected Devices:

Workaround

tabView.SizeChanged += TabView_SizeChanged;

void TabView_SizeChanged(object sender, System.EventArgs e)
{
	if (sender is UI.Views.TabView tabView && tabView.SelectedIndex > -1)
	{
		var tab = tabView.TabItems[tabView.SelectedIndex];
		if (tab?.CurrentContent != null)
			tab.CurrentContent.Layout(tabView.Bounds);
	}
}

Reproduction imagery

BugReproduced_Trim

DanielGlick avatar Apr 20 '22 19:04 DanielGlick