2017-05-22 2 views
0

간단한 레이아웃이 Entry와 Button으로 구성되어 있습니다. 목표는 Button을 맨 아래에 배치하고 Entry를 나머지 공간의 가운데에 배치하는 것입니다. 모든 것은 처음부터 작동합니다. 다음은 레이아웃과 스크린 샷입니다.소프트 키보드가 표시/숨길 때 ScrollView의 레이아웃이 잘못 업데이트됩니다.

<?xml version="1.0" encoding="utf-8"?> 
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" 
      xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
      NavigationPage.HasNavigationBar="False" 
      x:Class="ParentAdda.Pages.Test"> 
    <ScrollView x:Name="Qq" Orientation="Vertical" VerticalOptions="FillAndExpand" HorizontalOptions="FillAndExpand"> 
     <StackLayout x:Name="Ww" Orientation="Vertical" VerticalOptions="FillAndExpand" 
        HorizontalOptions="FillAndExpand"> 
      <BoxView VerticalOptions="FillAndExpand" HeightRequest="0" BackgroundColor="Aquamarine" /> 
      <Entry 
       FontSize="Medium" 
       Placeholder="+111111111" 
       HorizontalOptions="FillAndExpand" 
       Keyboard="Telephone" /> 
      <BoxView VerticalOptions="FillAndExpand" HeightRequest="0" BackgroundColor="Coral" /> 
      <Button Text="Update" Clicked="Button_OnClicked" 
        HorizontalOptions="Fill" 
        BorderRadius="20" 
        BackgroundColor="Lime" 
        TextColor="White" 
        FontSize="Large" 
        FontAttributes="Bold" /> 
     </StackLayout> 
    </ScrollView> 
</ContentPage> 

enter image description here

나는 또한 태그가 FormsAppCompatActivity를 사용하는 경우 매니페스트에 설정하면 이동하려면 재설정되면 계정에 Xamarin.Forms의 버그를 고려하여 코드에서 (안드로이드 프로젝트에 크기를 조정할 수 WindowSoftInputMode을 설정하고)

protected override void OnCreate(Bundle bundle) 
    { 
     base.OnCreate(bundle); 

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

     //https://bugzilla.xamarin.com/show_bug.cgi?id=39765 
     App.Current.On<Xamarin.Forms.PlatformConfiguration.Android>().UseWindowSoftInputModeAdjust(WindowSoftInputModeAdjust.Resize); 
     //https://bugzilla.xamarin.com/show_bug.cgi?id=39765 
     //Remove the status bar underlay in API 21+ 
     if (Build.VERSION.SdkInt >= BuildVersionCodes.Lollipop) 
     { 
      Window.DecorView.SystemUiVisibility = 0; 
      var statusBarHeightInfo = typeof(FormsAppCompatActivity).GetField("_statusBarHeight", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic); 
      statusBarHeightInfo?.SetValue(this, 0); 
      Window.SetStatusBarColor(Android.Graphics.Color.Black); 
     } 
    } 
항목 이익이 집중하면 소프트 키보드가 표시 될 때 내가) 맨 아래로 스크롤 할 수 있지만, 페이지가 (크기가 조정되지

,

enter image description here

소프트 키보드가 숨겨지면 내용의 크기가 잘못 조정되어 화면의 일부만 차지합니다. enter image description here

소프트 키보드가 보이지 않거나 보이지 않게되기 전에 경계를 기반으로 레이아웃 프로세스가 수행되는 것처럼 보입니다. 그러나 모든 Bounds 속성 (Page, ScrollView 및 StackLayout)뿐만 아니라 ContentSize ScrollView 속성이 정확한 숫자 값을 가지고있는 것으로 보입니다 (버튼 클릭 처리기에서 해당 값을 추적했습니다). 나는 행운을 내지 않고 동일한 버튼 클릭 핸들러에서 다른 요소에 ForceLayout()을 호출하려고 시도했다.

누구든지이 문제를 해결하는 방법을 알고 있습니까?

답변

0

FillAndExpandVerticalOptions 인 것처럼 생각합니다. 부모 레이아웃에서 Y 축을 따라 초과 공간이있는 경우 요소 레이아웃은 입니다. 레이아웃의 자식이 여러 개 펼쳐 지도록 설정된 경우 추가 공간은 비례하여 분산됩니다.

고정 크기가 없기 때문에 키보드가 사라지면 레이아웃 크기가 조정됩니다. FillAndExpand은 먼저 축을 따라 몇 개의 추가 공간을 측정 한 다음 어린이를위한 공간을 분배 할 것입니다. 문제를 해결하기

아주 간단한 해결 방법은 당신의 StackLayout에 고정 된 크기를 제공하는 것입니다,하지만 당신은 목표는 나머지 공간의 중심에있는 항목 하단에있는 버튼을 배치하고

말했다 .

protected override void OnAppearing() 
{ 
    base.OnAppearing(); 
    Ww.HeightRequest = Ww.Height; 
} 
:

당신이 여기에 원래 크기를 유지하려면, 당신이 나타나고있다 StackLayout에 높이를 설정할 수 있습니다 예를 들어, 뒤에 코드에서 OnAppearing() 메소드를 오버라이드 (override) 의미

관련 문제