6

我知道我可以使用“android:windowSoftInputMode="adjustPan" 来做一些自动偏移。但我真的想为一些特殊目的获取软件键盘高度。

我发现这里有一个类似的主题:获取软键盘的尺寸。但显然,这不是一个通用的解决方案。

是否有常用方法或内置方法来获取软键盘高度?(或者如何获得当前光标位置和软件键盘顶部位置之间的偏移值?)

非常感谢

4

2 回答 2

2

在 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
            }
        }
    }
}        
于 2017-09-22T17:26:13.450 回答
0

这是我的解决方案,它也很hacky,但可以解决问题。

  1. 我在屏幕底部有透明背景的临时视图。
  2. android:windowSoftInputMode="adjustResize"在清单中的活动标签中添加了标志,就像@bill 建议的那样。
  3. 现在主要故事在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
    }
    });
    
于 2014-05-06T07:04:49.920 回答