editText android:windowSoftInputMode="adjustPan"模式下第二次点击editText软键盘覆盖输入框的解决方案

//调用方式,在所要监听的Activity onCreate()加入如下代码
SoftHideKeyBoardUtil.assistActivity(this);
public class SoftHideKeyBoardUtil {
    private final Activity mActivity;
    private int mScreenHeight;
    private boolean isFirst;


    public static void assistActivity(Activity activity) {
        new SoftHideKeyBoardUtil(activity);
    }


    private SoftHideKeyBoardUtil(Activity activity) {
        mActivity = activity;
        activity.getWindow().getDecorView().getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
                if (imm != null && imm.isActive()) {
                    View view = mActivity.getWindow().getDecorView().findFocus();
                    if (view != null && view instanceof EditText) {
                        NestedScrollView nestedScrollView = getNestedScrollView(view);
                        if (nestedScrollView == null) {
                            ScrollView scrollView = getScrollView(view);
                            if (scrollView != null && !isFirst) {
                                isFirst = true;
                                ViewGroup.LayoutParams layoutParams = scrollView.getLayoutParams();
                                layoutParams.height = (int) (scrollView.getHeight() - view.getX() - view.getHeight());
                                scrollView.setLayoutParams(layoutParams);
                            } else {
                                isFirst = false;
                            }
                        } else if (!isFirst) {
                            isFirst = true;
                            ViewGroup.LayoutParams layoutParams = nestedScrollView.getLayoutParams();
                            layoutParams.height = (int) (nestedScrollView.getHeight() - view.getX() - view.getHeight());
                            nestedScrollView.setLayoutParams(layoutParams);
                        } else {
                            isFirst = false;
                        }
                    }
                }
            }
        });
    }

    private ScrollView getScrollView(View view) {
        if (view.getParent() instanceof ScrollView) {
            return (ScrollView) view.getParent();
        }
        if (view.getParent().equals(view.getRootView())) {
            return null;
        }
        return getScrollView((View) view.getParent());
    }

    private NestedScrollView getNestedScrollView(View view) {

        if (view.getParent() instanceof NestedScrollView) {
            return (NestedScrollView) view.getParent();
        }
        if (view.getParent().equals(view.getRootView())) {
            return null;
        }
        return getNestedScrollView((View) view.getParent());
    }

    private EditText getFocusEditText() {
        for (EditText editText : mEditTexts) {
            if (editText.isFocused()) {
                return editText;
            }
        }
        return null;
    }


    List<EditText> mEditTexts = new ArrayList<>();


    private int getScreenHeight() {
        if (mScreenHeight > 0) {
            return mScreenHeight;
        }
        mScreenHeight = ((WindowManager) mActivity.getSystemService(Context.WINDOW_SERVICE))
                .getDefaultDisplay().getHeight();
        return mScreenHeight;
    }

}
说下实现思路,获得ViewTreeObserver然后addOnGlobalLayoutListener该listener在每次布局变化时(如键盘的显示隐藏,布局高度的更改)调用,当在回调时,是指获得焦点的editText外层的scrollView高度变为原高度减掉该editText以下的部分,就实现了输入法总在editText下面
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值