美文网首页程序员Android技术知识Android开发
android adjustNothing 获取键盘高度

android adjustNothing 获取键盘高度

作者: 空手接白刀 | 来源:发表于2019-04-03 15:56 被阅读43次

    实现效果如下,获取键盘高度后,手动移动输入框:


    20190402144716388.gif

    虽然输入框的弹出不够顺滑,显得有些僵硬,但是大家可以自己加上适当的动画来完善。

    方法是给当前的activity覆盖一个宽度为0,高度为match_parent的PopupWindow,设置PopupWindow的mSoftInputMode为SOFT_INPUT_ADJUST_RESIZE,键盘弹出后,根据PopupWindow内容区高度的变化,来计算键盘弹出的高度。

    核心代码如下:

    public class HeightProvider extends PopupWindow implements OnGlobalLayoutListener {
        private Activity mActivity;
        private View rootView;
        private HeightListener listener;
        private int heightMax; // 记录popup内容区的最大高度
    
        public HeightProvider(Activity activity) {
            super(activity);
            this.mActivity = activity;
    
            // 基础配置
            rootView = new View(activity);
            setContentView(rootView);
    
            // 监听全局Layout变化
            rootView.getViewTreeObserver().addOnGlobalLayoutListener(this);
            setBackgroundDrawable(new ColorDrawable(0));
    
            // 设置宽度为0,高度为全屏
            setWidth(0);
            setHeight(LayoutParams.MATCH_PARENT);
    
            // 设置键盘弹出方式
            setSoftInputMode(LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
            setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED);
        }
    
        public HeightProvider init() {
            if (!isShowing()) {
                final View view = mActivity.getWindow().getDecorView();
                // 延迟加载popupwindow,如果不加延迟就会报错
                view.post(new Runnable() {
                    @Override
                    public void run() {
                        showAtLocation(view, Gravity.NO_GRAVITY, 0, 0);
                    }
                });
            }
            return this;
        }
    
        public HeightProvider setHeightListener(HeightListener listener) {
            this.listener = listener;
            return this;
        }
    
        @Override
        public void onGlobalLayout() {
            Rect rect = new Rect();
            rootView.getWindowVisibleDisplayFrame(rect);
            if (rect.bottom > heightMax) {
                heightMax = rect.bottom;
            }
    
            // 两者的差值就是键盘的高度
            int keyboardHeight = heightMax - rect.bottom;
            if (listener != null) {
                listener.onHeightChanged(keyboardHeight);
            }
        }
    
        public interface HeightListener {
            void onHeightChanged(int height);
        }
    }
    

    使用方式代码如下:

    public class MainActivity extends AppCompatActivity {
        private EditText etBottom;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            etBottom = findViewById(R.id.etBottom);
    
            new HeightProvider(this).init().setHeightListener(new HeightProvider.HeightListener() {
                @Override
                public void onHeightChanged(int height) {
                    etBottom.setTranslationY(-height);
                }
            });
        }
    }
    
    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <ImageView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:scaleType="centerCrop"
            android:src="@drawable/test" />
    
        <EditText
            android:id="@+id/etBottom"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:layout_alignParentBottom="true"
            android:background="#ffabcdef" />
    
    </RelativeLayout>
    
    在这里插入图片描述

    使用起来还是非常简单的,可以把HeightProvider当成一个工具类来用。

    github源码

    相关文章

      网友评论

        本文标题:android adjustNothing 获取键盘高度

        本文链接:https://www.haomeiwen.com/subject/vdezbqtx.html