实现效果如下,获取键盘高度后,手动移动输入框:
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当成一个工具类来用。
网友评论