2016-09-22 96 views
4

我正在使用xamarin表單。我在xaml中設計了一個登錄表單頁面。我想在出現鍵盤時向上移動登錄表單視圖,以便在平臺AndroidIOS的情況下都可以看到文本字段和登錄按鈕。如何計算鍵盤高度並通過動態計算鍵盤高度來向上移動登錄表單視圖。xamarin表格:根據鍵盤高度向上移動視圖

enter image description here

下面是我的XAML代碼:

<ContentPage> 
    <ScrollView> 
     <AbsoluteLayout HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand"> 
      <Grid Padding="20, 30, 20, 20" RowSpacing="20" AbsoluteLayout.LayoutFlags="All" AbsoluteLayout.LayoutBounds="0,0,1,1"> 
       <Grid.RowDefinitions> 
        <RowDefinition Height="Auto" /> 
        <RowDefinition Height="Auto" /> 
        <RowDefinition Height="Auto" /> 
        <RowDefinition Height="Auto" /> 
        <RowDefinition Height="Auto" /> 
        <RowDefinition Height="Auto" /> 
       </Grid.RowDefinitions> 

       <Image Grid.Row="0" Source="login.png" HorizontalOptions="Center" VerticalOptions="Center"/> 

       <Entry Grid.Row="2" x:Name="entryUserName" HorizontalOptions="Fill" Placeholder="Username" PlaceholderColor="#707070" Text="{Binding UserName,Mode=TwoWay}" Margin="5"/> 

       <BoxView Grid.Row="2" HeightRequest="1" HorizontalOptions="Fill" BackgroundColor="#707070" VerticalOptions="End"/> 

       <Entry Grid.Row="3" x:Name="entryPassword" Text="{Binding Password,Mode=TwoWay}" Placeholder="Password" PlaceholderColor="#707070" Margin="5" HorizontalOptions="Fill" IsPassword="True"/> 

       <BoxView Grid.Row="3" HeightRequest="1" HorizontalOptions="Fill" BackgroundColor="#707070" VerticalOptions="End"/> 

       <Button Grid.Row="5" HorizontalOptions="Center" VerticalOptions="Center" Text="Login" Command="{Binding doLoginCommand}" CommandParameter="entryUserName,entryPassword" /> 

      </Grid>   
     </AbsoluteLayout> 
    </ScrollView> 
</ContentPage> 

我不想執行任何種類的頁面定製渲染。是否有任何資源可以通過它編寫依賴項服務來計算不同移動視圖跨平臺的鍵盤高度。 我經歷了this,但它有一些我不想要的自定義渲染。

+0

滾動視圖應該自動處理這爲你 – Jason

+0

不,滾動視圖不會自動向上移動視圖。我需要滾動,然後滾動。我希望視圖自動切換而不滾動。 –

+0

滾動視圖應該自動調整視圖,使焦點文本框不被鍵盤覆蓋。它可能不會調整整個視圖 – Jason

回答

3

選項1:

安卓 添加到您的清單:

<activity //Your MainActivity 
     android:windowSoftInputMode="stateVisible|adjustResize" ... > 
     ... 
</activity> 

iOS設備上: 加入這個NuGet包: https://www.nuget.org/packages/Xam.Plugins.Forms.KeyboardOverlap/

和初始化它:

Xamarin.Forms.Init();//platform specific init 
KeyboardOverlapRenderer.Init(); 

選項2:

將此代碼添加到您的網頁類:

 protected override void OnAppearing() 
     { 
      base.OnAppearing(); 
      entryUserName.Focused += InputFocused; 
      entryPassword.Focused += InputFocused; 
      entryUserName.Unfocused += InputUnfocused; 
      entryPassword.Unfocused += InputUnfocused; 
     } 

     protected override void OnDisappearing() 
     { 
      base.OnDisappearing(); 
      entryUserName.Focused -= InputFocused; 
      entryPassword.Focused -= InputFocused; 
      entryUserName.Unfocused -= InputUnfocused; 
      entryPassword.Unfocused -= InputUnfocused; 
     } 
     void InputFocused(object sender, EventArgs args){ 
      Content.LayoutTo(new Rectangle(0,-360, Content.Bounds.Width, Content.Bounds.Height)); 
     } 

     void InputUnfocused(object sender, EventArgs args){ 
      Content.LayoutTo(new Rectangle(0,0, Content.Bounds.Width, Content.Bounds.Height)); 
     } 
+0

我希望計算鍵盤出現時的高度,因此我想要移動我的登錄視圖,以便文本字段和按鈕都可見。有沒有辦法做到這一點。 –

+0

'LayoutTo'參數似乎已經改變,你能否偶然更新你的答案? –

2

這裏是一個進入渲染迫使Android上SoftInputMode,希望這有助於:

using System; 
using Xamarin.Forms; 
using Xamarin.Forms.Platform.Android; 
using Android.Widget; 
using Android.Util; 
using Android.OS; 
using Android.Views.InputMethods; 
using System.Threading; 
using Android.Views; 
using Android.App; 

[assembly: ExportRenderer(typeof(FormsEntry), typeof(DroidEntryRenderer))] 
namespace XXX 
{ 
    public class DroidEntryRenderer : EntryRenderer, IEntryMessages 
    { 
     private bool _inititialized = false; 
     EditText editText; 

     protected override void OnElementChanged(ElementChangedEventArgs<Entry> e) 
     { 
      base.OnElementChanged(e); 
      if (e.OldElement != null) 
      { 
       // unhook old events 
      } 
      if (e.NewElement != null) 
      { 
       // hook new events 
       editText = (EditText)Control; 
       var entry = e.NewElement as FormsEntry; 

       (this.Element as FormsEntry).OnShowKeyboard += DroidEntryRenderer_showKeyboard; 
       (this.Element as FormsEntry).OnChangeIme += DroidEntryRenderer_changeIme; 

       if(entry.KeyboardInputMode == SoftInputMode.AdjustNothing) 
        (Forms.Context as Activity).Window.SetSoftInputMode(SoftInput.AdjustNothing); 
       else if(entry.KeyboardInputMode == SoftInputMode.AdjustResize) 
        (Forms.Context as Activity).Window.SetSoftInputMode(SoftInput.AdjustResize); 
       else 
        (Forms.Context as Activity).Window.SetSoftInputMode(SoftInput.AdjustPan); 

       if(entry.SetImeToNext){ 
        Control.ImeOptions = Android.Views.InputMethods.ImeAction.Next; 
        Control.SetImeActionLabel("Next", Android.Views.InputMethods.ImeAction.Next); 

        switch(entry.CustomImeAction){ 
         case ImeAction.Email: 
          editText.EditorAction += (object sender, TextView.EditorActionEventArgs args) => 
          { 
           MessagingCenter.Send<IEntryMessages>(this, "Email"); 
          }; 
          break; 
         case ImeAction.Password: 
          editText.EditorAction += (object sender, TextView.EditorActionEventArgs args) => 
          { 
           MessagingCenter.Send<IEntryMessages>(this, "Password"); 
          }; 
          break; 
        } 
       } 

       if (entry.HasBorder) 
       { 
        editText.SetBackgroundResource(Resource.Drawable.BorderEntry); 
       } 

       // edit properties 
       if (entry.Font != Font.Default) 
       { 
        RendererHelper.SetTextViewFont(editText, entry.Font); 
       } 
       if (entry.PlaceholderColor != Color.Default) 
        editText.SetHintTextColor(entry.PlaceholderColor.ToAndroid()); 

       switch (entry.XAlign) 
       { 
       case Xamarin.Forms.TextAlignment.Start: 
        editText.Gravity = Android.Views.GravityFlags.CenterVertical | Android.Views.GravityFlags.Left; 
        break; 

       case Xamarin.Forms.TextAlignment.Center: 
        editText.Gravity = Android.Views.GravityFlags.Center; 
        break; 

       case Xamarin.Forms.TextAlignment.End: 
        editText.Gravity = Android.Views.GravityFlags.CenterVertical | Android.Views.GravityFlags.Right; 
        editText.SetPadding(0, editText.PaddingTop, 0, editText.PaddingBottom); 
        break; 
       } 

       if (entry.ReturnKeyType == KeyboardType.Done) 
        editText.ImeOptions = global::Android.Views.InputMethods.ImeAction.Done; 
       else if (entry.ReturnKeyType == KeyboardType.Next) 
        editText.ImeOptions = global::Android.Views.InputMethods.ImeAction.Next; 

      } 
     } 

     void DroidEntryRenderer_showKeyboard() 
     { 
      ShowKeyboard(); 
     } 

     void DroidEntryRenderer_changeIme() 
     { 
      ChangeIme(); 
     } 

     public void ChangeIme(){ 
      Control.ImeOptions = Android.Views.InputMethods.ImeAction.Next; 
      Control.SetImeActionLabel("Next", Android.Views.InputMethods.ImeAction.Next); 
     } 

     public void ShowKeyboard() 
     { 
      Device.BeginInvokeOnMainThread(() => 
      { 
       this.Control.RequestFocus(); 
       InputMethodManager inputMethodManager = this.Control.Context. 
       GetSystemService(Android.Content.Context.InputMethodService) as InputMethodManager; 
       inputMethodManager.ShowSoftInput(this.Control, ShowFlags.Forced); 
       inputMethodManager.ToggleSoftInput(ShowFlags.Forced, HideSoftInputFlags.ImplicitOnly); 
      }); 
     } 

    } 
} 
+0

我希望計算鍵盤顯示時的高度,並相應地移動我的視圖,以便文本字段和按鈕都可見。你能提出一些想法嗎? –

+0

系統爲你做。 –

+0

不,我需要以編程方式計算高度並移動視圖。系統只是移動入口單元格而不是我登錄表單的整個視圖。我不想讓用戶向下滾動輸入密碼和按鈕字段,只要他觸摸用戶名輸入單元格,它就應該可見 –

相關問題