android 弹出软键盘相关坑的解决方法

demo下载,请点我

重要代码:

//1、此layout作为最外层的layout;
//2、设置需要调整的view: setAdjustView(View view);
//3、如果需要控制输入框的显示与隐藏,可以实现OnInputViewVisibleListener接口;
public class SoftInputAdjustLayout extends RelativeLayout {
    private static final String TAG = SoftInputAdjustLayout.class.getSimpleName();

    private View adjustView;

    public SoftInputAdjustLayout(Context context) {
        this(context, null);
    }

    public SoftInputAdjustLayout(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public SoftInputAdjustLayout(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        this.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                try {
                    Rect r = new Rect();
                    getWindowVisibleDisplayFrame(r);
                    int heightDiff = getRootView().getHeight() - (r.bottom - r.top);
                    if (heightDiff > 100) {
                        if (onInputViewVisibleListener != null) {
                            onInputViewVisibleListener.onShowInputView();
                        }
                    } else {
                        if (onInputViewVisibleListener != null) {
                            onInputViewVisibleListener.onHideInputView();
                        }

                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * 需要调整的view
     *
     * @param adjustView
     */
    public void setAdjustView(View adjustView) {
        this.adjustView = adjustView;
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        if (adjustView != null) {
            Rect rect = new Rect();
            getWindowVisibleDisplayFrame(rect);
            int totalHeight = getHeight();
            int nowHeight = rect.bottom - rect.top;
            int keyBoardHeight = totalHeight - nowHeight;

            if (keyBoardHeight > totalHeight / 4) {
                super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(totalHeight, MeasureSpec.EXACTLY));
                LayoutParams params = (LayoutParams) adjustView.getLayoutParams();
                params.bottomMargin = keyBoardHeight;
            } else {
                super.onMeasure(widthMeasureSpec, heightMeasureSpec);
                LayoutParams params = (LayoutParams) adjustView.getLayoutParams();
                params.bottomMargin = 0;
            }
        } else {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        }
    }

    private OnInputViewVisibleListener onInputViewVisibleListener;

    public void setOnInputViewVisibleListener(OnInputViewVisibleListener listener) {
        onInputViewVisibleListener = listener;
    }

    public interface OnInputViewVisibleListener {
        void onShowInputView();

        void onHideInputView();
    }
}

备注:
全屏模式:
1、通过style或者setFlags(…)来设置全屏;
2、AndroidManifest.xml中activity设置:android:windowSoftInputMode=”adjustResize”;
3、此layout必须作为布局的最外层layout;
4、一定要在布局中添加一个view,如下:

 <!--此view用于获取焦点,当软件盘弹出时,根据此view来弹出,而此view在最顶部,且大小为0,所以软件盘弹出,不会把背景顶上去-->
    <View
        android:layout_width="0px"
        android:layout_height="0px"
        android:focusable="true"
        android:focusableInTouchMode="true" />

5、通过setAdjustView(View view)来设置需要调整的view;
6、在全屏模式下,输入框开始是未显示的,直到弹出软键盘,才会显示输入框。因为如果输入框一开始就显示,那软键盘就会根据输入框来弹出,且输入框在底部,那就可能造成把整个view顶上去。所以这时我们应该实现OnInputViewVisibleListener这个接口来控制输入框的显示与隐藏。

非全屏模式
1、AndroidManifest.xml中activity设置:android:windowSoftInputMode=”adjustResize”;
2、此layout必须作为布局的最外层layout;
3、通过setAdjustView(View view)来设置需要调整的view;
4、如果需要控制输入框的显示与隐藏,就实现OnInputViewVisibleListener这个接口。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值