android adjustNothing 获取键盘高度

作者 : 开心源码 本文共2502个字,预计阅读时间需要7分钟 发布时间: 2022-05-12 共201人阅读

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

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源码

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » android adjustNothing 获取键盘高度

发表回复