如何获得Android软键盘高度?

时间:2013-08-26 00:36:10

标签: android android-softkeyboard

我知道我可以使用“android:windowSoftInputMode =”adjustPan“做一些自动偏移。但我真的想要获得软件键盘高度以达到特殊目的。

我发现这里有一个类似的话题:Getting the dimensions of the soft keyboard。但显然,这不是一个通用的解决方案。

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

非常感谢

2 个答案:

答案 0 :(得分:1)

在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
            }
        }
    }
}        

答案 1 :(得分: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
    }
    });