Android webview在xamarin表单中删除键盘后会创建一个空白
在xamarin社区找到一个帖子,但没有提到解决方法/答案。 我使用的是Xamarin表单版本:4.5.0.36。 尝试了window.softInput的所有方法。他们都没有工作。当键盘关闭时,视图会向上推,并且不会调整大小 我附上我的主要活动如下:Android webview在xamarin表单中删除键盘后会创建一个空白,xamarin,xamarin.forms,xamarin.android,xamarin.ios,android-webview,Xamarin,Xamarin.forms,Xamarin.android,Xamarin.ios,Android Webview,在xamarin社区找到一个帖子,但没有提到解决方法/答案。 我使用的是Xamarin表单版本:4.5.0.36。 尝试了window.softInput的所有方法。他们都没有工作。当键盘关闭时,视图会向上推,并且不会调整大小 我附上我的主要活动如下: namespace MyApp1.Droid { [Activity(Label = “App”1, Icon = "@drawable/Icon", Theme = "@style/MainTheme&q
namespace MyApp1.Droid
{
[Activity(Label = “App”1, Icon = "@drawable/Icon", Theme = "@style/MainTheme",
ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
private App _app;
TextView msgText;
protected override void OnCreate(Bundle bundle)
{
TabLayoutResource = MyApp1.Droid.Resource.Layout.Tabbar;
ToolbarResource = MyApp1.Droid.Resource.Layout.Toolbar;
base.OnCreate(bundle);
Xamarin.Essentials.Platform.Init(this, bundle);
Current = this;
Window.SetSoftInputMode(SoftInput.AdjustNothing);
if (Build.VERSION.SdkInt >= BuildVersionCodes.Lollipop)
{
// Bug in Android 5+, this is an adequate workaround
AndroidBug5497WorkaroundForXamarinAndroid.assistActivity(this, WindowManager);
}
var info = Intent.Extras?.GetString("CommandId", "");
global::Xamarin.Forms.Forms.Init(this, bundle);
Xamarin.FormsMaps.Init(this, bundle);
global::Xamarin.Auth.Presenters.XamarinAndroid.AuthenticationConfiguration.Init(this, bundle);
//FormsVideoPlayer.Init(ConfigurationManager.Instance.Config.AndroidVidoPlayerId);
UserDialogs.Init(this);
RegisterDependencyServices();
DependencyService.Get<IAnalyticsService>().AnalyticsInit();
//-----------------------------------------------------------------------------------------------
// Xamarin.Auth initialization
// Presenters Initialization
global::Xamarin.Auth.Presenters.XamarinAndroid.AuthenticationConfiguration.Init(this, bundle);
// Xamarin.Auth CustomTabs Initialization/Customisation
global::Xamarin.Auth.CustomTabsConfiguration.ActionLabel = null;
global::Xamarin.Auth.CustomTabsConfiguration.MenuItemTitle = null;
global::Xamarin.Auth.CustomTabsConfiguration.AreAnimationsUsed = true;
global::Xamarin.Auth.CustomTabsConfiguration.IsShowTitleUsed = false;
global::Xamarin.Auth.CustomTabsConfiguration.IsUrlBarHidingUsed = false;
global::Xamarin.Auth.CustomTabsConfiguration.IsCloseButtonIconUsed = false;
global::Xamarin.Auth.CustomTabsConfiguration.IsActionButtonUsed = false;
global::Xamarin.Auth.CustomTabsConfiguration.IsActionBarToolbarIconUsed = false;
global::Xamarin.Auth.CustomTabsConfiguration.IsDefaultShareMenuItemUsed = false;
global::Android.Graphics.Color color_xamarin_blue;
color_xamarin_blue = new global::Android.Graphics.Color(0x34, 0x98, 0xdb);
global::Xamarin.Auth.CustomTabsConfiguration.ToolbarColor = color_xamarin_blue;
// ActivityFlags for tweaking closing of CustomTabs
// please report findings!
global::Xamarin.Auth.CustomTabsConfiguration.
ActivityFlags =
global::Android.Content.ActivityFlags.NoHistory
|
global::Android.Content.ActivityFlags.SingleTop
|
global::Android.Content.ActivityFlags.NewTask
;
global::Xamarin.Auth.CustomTabsConfiguration.IsWarmUpUsed = true;
global::Xamarin.Auth.CustomTabsConfiguration.IsPrefetchUsed = true;
DependencyService.Register<ITwilioMessenger, TwilioMessenger>();
this.Window.AddFlags(WindowManagerFlags.Fullscreen);
_app = new App();
if (System.String.IsNullOrEmpty(info))
{
LoadApplication(_app);
AndroidX.AppCompat.Widget.Toolbar toolbar = this.FindViewById<AndroidX.AppCompat.Widget.Toolbar>(Resource.Id.toolbar);
SetSupportActionBar(toolbar);
}
else
{
LoadApplication(new App());
AndroidX.AppCompat.Widget.Toolbar toolbar = this.FindViewById<AndroidX.AppCompat.Widget.Toolbar>(Resource.Id.toolbar);
SetSupportActionBar(toolbar);
}
}
public class AndroidBug5497WorkaroundForXamarinAndroid
{
private readonly Android.Views.View mChildOfContent;
private int usableHeightPrevious;
private FrameLayout.LayoutParams frameLayoutParams;
public static void assistActivity(Activity activity, IWindowManager windowManager)
{
new AndroidBug5497WorkaroundForXamarinAndroid(activity, windowManager);
}
private AndroidBug5497WorkaroundForXamarinAndroid(Activity activity, IWindowManager windowManager)
{
var softButtonsHeight = getSoftbuttonsbarHeight(windowManager);
var content = (FrameLayout)activity.FindViewById(Android.Resource.Id.Content);
mChildOfContent = content.GetChildAt(0);
var vto = mChildOfContent.ViewTreeObserver;
vto.GlobalLayout += (sender, e) => possiblyResizeChildOfContent(softButtonsHeight);
frameLayoutParams = (FrameLayout.LayoutParams)mChildOfContent.LayoutParameters;
}
private void possiblyResizeChildOfContent(int softButtonsHeight)
{
var usableHeightNow = computeUsableHeight();
if (usableHeightNow != usableHeightPrevious)
{
var usableHeightSansKeyboard = mChildOfContent.RootView.Height - softButtonsHeight;
var heightDifference = usableHeightSansKeyboard - usableHeightNow;
if (heightDifference > (usableHeightSansKeyboard / 4))
{
// keyboard probably just became visible
frameLayoutParams.Height = usableHeightSansKeyboard - heightDifference + (softButtonsHeight / 2);
}
else
{
// keyboard probably just became hidden
frameLayoutParams.Height = usableHeightSansKeyboard;
}
mChildOfContent.RequestLayout();
usableHeightPrevious = usableHeightNow;
}
}
private int computeUsableHeight()
{
var r = new Rect();
mChildOfContent.GetWindowVisibleDisplayFrame(r);
return (r.Bottom - r.Top);
}
private int getSoftbuttonsbarHeight(IWindowManager windowManager)
{
if (Build.VERSION.SdkInt >= BuildVersionCodes.Lollipop)
{
var metrics = new DisplayMetrics();
windowManager.DefaultDisplay.GetMetrics(metrics);
int usableHeight = metrics.HeightPixels;
windowManager.DefaultDisplay.GetRealMetrics(metrics);
int realHeight = metrics.HeightPixels;
if (realHeight > usableHeight)
return realHeight - usableHeight;
else
return 0;
}
return 0;
}
}
public override void OnRequestPermissionsResult(int requestCode, string[] permissions, Android.Content.PM.Permission[] grantResults)
{
Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);
Plugin.Permissions.PermissionsImplementation.Current.OnRequestPermissionsResult(requestCode, permissions, grantResults);
base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
}
private void RegisterDependencyServices()
{
DependencyService.Register<IAnalyticsService, AnalyticsService>();
DependencyService.Register<IOrientationHandler, OrientationHandler>();
DependencyService.Register<IPlatformSpecific, PlatformSpecific>();
DependencyService.Register<IAppRating, AppRating>();
DependencyService.Register<IGetThumbnail, GetThumbnail>();
}
protected async override void OnResume()
{
base.OnResume();
}
protected override void OnSaveInstanceState(Bundle outState)
{
//outState.PutInt("click_count", _counter);
Console.Write(GetType().FullName, "Activity A - Saving instance state");
// always call the base implementation!
base.OnSaveInstanceState(outState);
}
// Field, properties, and method for Video Picker
public static MainActivity Current { private set; get; }
public static readonly int PickImageId = 1000;
}
}
名称空间MyApp1.Droid
{
[活动(Label=“App”1,Icon=“@drawable/Icon”,Theme=“@style/MainTheme”,
ConfigurationChanges=ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
公共类MainActivity:全局::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
私人应用程序(u App),;
文本视图msgText;
创建时受保护的覆盖无效(捆绑包)
{
TabLayoutResource=MyApp1.Droid.Resource.Layout.Tabbar;
ToolbarResource=MyApp1.Droid.Resource.Layout.Toolbar;
base.OnCreate(bundle);
Xamarin.Essentials.Platform.Init(这个包);
电流=这个;
Window.SetSoftInputMode(软输入。无调整);
如果(Build.VERSION.SdkInt>=BuildVersionCodes.Lollipop)
{
//Android 5+中的Bug,这是一个足够的解决方法
AndroidBug5497 Xamariandroid.assistativity的变通方法(此,WindowManager);
}
var info=Intent.Extras?.GetString(“CommandId”,即“”);
全局::Xamarin.Forms.Forms.Init(这个,bundle);
Xamarin.formsmap.Init(this,bundle);
global::Xamarin.Auth.Presenters.xamariandroid.AuthenticationConfiguration.Init(这个包);
//FormsVideoPlayer.Init(ConfigurationManager.Instance.Config.AndroidVidoPlayerId);
UserDialogs.Init(this);
RegisterDependencyServices();
DependencyService.Get().AnalyticsInit();
//-----------------------------------------------------------------------------------------------
//Xamarin.Auth初始化
//演示者初始化
global::Xamarin.Auth.Presenters.xamariandroid.AuthenticationConfiguration.Init(这个包);
//Xamarin.Auth CustomTabs初始化/自定义
全局::Xamarin.Auth.CustomTabsConfiguration.ActionLabel=null;
全局::Xamarin.Auth.CustomTabsConfiguration.MenuItemTitle=null;
全局::Xamarin.Auth.CustomTabsConfiguration.AreAnimationsUsed=true;
全局::Xamarin.Auth.CustomTabsConfiguration.IsShowTitleUsered=false;
全局::Xamarin.Auth.CustomTabsConfiguration.isurlbaridingused=false;
全局::Xamarin.Auth.CustomTabsConfiguration.isCloseButtonNiconUsed=false;
全局::Xamarin.Auth.CustomTabsConfiguration.IsActionButtonUsed=false;
全局::Xamarin.Auth.CustomTabsConfiguration.IsActionBarToolbarIconUsed=false;
全局::Xamarin.Auth.CustomTabsConfiguration.IsDefaultShareMenuItemUsed=false;
全局::Android.Graphics.Color\u xamarin\u blue;
color_xamarin_blue=new global::Android.Graphics.color(0x34、0x98、0xdb);
全局::Xamarin.Auth.CustomTabsConfiguration.Toolbar color=color\u Xamarin\u blue;
//用于调整自定义选项卡关闭的ActivityFlags
//请报告调查结果!
全局::Xamarin.Auth.CustomTabsConfiguration。
活动标志=
全局::Android.Content.ActivityFlags.NoHistory
|
全局::Android.Content.ActivityFlags.SingleTop
|
全局::Android.Content.ActivityFlags.NewTask
;
全局::Xamarin.Auth.CustomTabsConfiguration.IsWarmUpUsed=true;
全局::Xamarin.Auth.CustomTabsConfiguration.IsPrefetchUsed=true;
DependencyService.Register();
this.Window.AddFlags(WindowManagerFlags.Fullscreen);
_app=新app();
if(System.String.IsNullOrEmpty(info))
{
LoadApplication(_-app);
AndroidX.AppCompat.Widget.Toolbar-Toolbar=this.findviewbyd(Resource.Id.Toolbar);
设置支持操作栏(工具栏);
}
其他的
{
加载应用程序(新应用程序());
AndroidX.AppCompat.Widget.Toolbar-Toolbar=this.findviewbyd(Resource.Id.Toolbar);
设置支持操作栏(工具栏);
}
}
公共类AndroidBug5497 XamarinAndroid的解决方法
{
私有只读Android.Views.View mChildOfContent;
私人使用高度;
私有FrameLayout.LayoutParams frameLayoutParams;
公共静态无效辅助功能(活动活动,iWindows管理器windowManager)
{
新的AndroidBug5497 Xamariandroid(活动,windowManager)解决方案;
}
私有AndroidBug5497 XamarinAndRoid的变通方法(活动活动,iWindows管理器windowManager)
{
var softButtonsHeight=getSoftbuttonsbarHeight(windowManager);
var content=(FrameLayout)activity.findviewbyd(Android.Resource.Id.content);
mChildOfContent=content.GetChildAt(0);
var vto=mChildOfContent.ViewTreeObserver;
vto.GlobalLayout+=(发送方,e)=>可能的ResizeChildOfContent(软按钮显示);
frameLayoutParams=(FrameLayout.LayoutParams)mChildOfContent.LayoutParameters;
}
私有无效可能ResizeChildOfContent(int软按钮大小)
{
var usableHeightNow=computeusableheightnow();
如果(usableHeightNow!=usableHeightPrevious)
{
var usableheightsanskiboard=mChildOfContent.RootView.Height-softButtonsHeight;
var heightDifference=usableHeightSansKeyboard-usableHeightNow;
如果(高度差>(usableHeightSansKeyboard/4))
{
//键盘可能刚刚变得可见
frameLayoutParams.Height=usableHeightSansKeyboard-heightDifference+(软按钮高度/2);
<?xml version="1.0" encoding="UTF-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:components="clr-namespace:MyApp1.CustomRenders"
x:Class=“MyApp1.Pages.NewChat.ChatPage">
<ContentPage.Content>
<StackLayout Orientation="Vertical" VerticalOptions="FillAndExpand" HorizontalOptions="FillAndExpand" Padding="0,0,0,0" Spacing="0">
<components:HybridWebView x:Name="webview" VerticalOptions="FillAndExpand" HorizontalOptions="FillAndExpand" />
</StackLayout>
</ContentPage.Content>
</ContentPage>