我知道我可以使用“android:windowSoftInputMode="adjustPan" 来做一些自动偏移。但我真的想为一些特殊目的获取软件键盘高度。
我发现这里有一个类似的主题:获取软键盘的尺寸。但显然,这不是一个通用的解决方案。
是否有常用方法或内置方法来获取软键盘高度?(或者如何获得当前光标位置和软件键盘顶部位置之间的偏移值?)
非常感谢
我知道我可以使用“android:windowSoftInputMode="adjustPan" 来做一些自动偏移。但我真的想为一些特殊目的获取软件键盘高度。
我发现这里有一个类似的主题:获取软键盘的尺寸。但显然,这不是一个通用的解决方案。
是否有常用方法或内置方法来获取软键盘高度?(或者如何获得当前光标位置和软件键盘顶部位置之间的偏移值?)
非常感谢
在 Xamarin.Android 中获取软键盘高度,使用 ViewTreeObserver.IOnGlobalLayoutListener 监听 GlobalLayout Change 事件,并计算根视图前后的变化差异,以获得键盘高度。您可以在 Native Android Code 中执行类似操作。
这是代码:
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsApplicationActivity
{
public static Android.Views.View RootView = null;
public void DetectSoftKeyboardHeight()
{
RootView = this.FindViewById(Android.Resource.Id.Content);
if(RootView!=null)
RootView.ViewTreeObserver.AddOnGlobalLayoutListener(new MyLayoutListener());
}
}
/// <summary>
/// My layout listener.
/// Detect Android Soft keyboard height
/// </summary>
public class MyLayoutListener : Java.Lang.Object, ViewTreeObserver.IOnGlobalLayoutListener
{
public void OnGlobalLayout()
{
// do stuff here
Android.Graphics.Rect r = new Android.Graphics.Rect();
if (Mobibranch.Droid.MainActivity.RootView != null)
{
Mobibranch.Droid.MainActivity.RootView.GetWindowVisibleDisplayFrame(r);
int screenHeight = Mobibranch.Droid.MainActivity.RootView.RootView.Height;
int keyboardHeight = screenHeight - (r.Bottom);
if (keyboardHeight > 0)
{
//Keyboard is up on screen
Android.Util.Log.Verbose("[[[[MyLayoutListener]]]]", "Keyboard is up on screen, Height: "+keyboardHeight);
}
else
{
//Keyboard is hidden
}
}
}
}
这是我的解决方案,它也很hacky,但可以解决问题。
android:windowSoftInputMode="adjustResize"
在清单中的活动标签中添加了标志,就像@bill 建议的那样。现在主要故事在onGlobalLayout()
。y axis
在那里我计算了临时视图和高度之间的差异root view
final View view = findViewById(R.id.base);
view.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
int rootViewHeight = view.getRootView().getHeight();
View tv = findViewById(R.id.temp_view);
int location[] = new int[2];
tv.getLocationOnScreen(location);
int height = (int) (location[1] + tv.getMeasuredHeight());
deff = rootViewHeight - height;
// deff is the height of soft keyboard
}
});