解决EditText被软盘遮挡和键盘弹出布局不上移

一开始我遇到过这个也在网上找了很多例子,都是在说在AndroidManifest文件对应activity中加上

android:windowSoftInputMode=”stateVisible|adjustPan”这属性就可以了,但是这个会有包含一个问题那就是布局会上移,那么如果你的顶上布局是一个视屏播放键或者其他的,那么就会看不见,导致用户体验度不好。如果不设置这个属性的话,那么就会出现你的EidtText被输入法挡住,当用户输入文字的时候看不见输入的字,导致用户体验度也不好,所以这里给出我自己的解决思路,希望对你有所帮助。

解决思路:1.如果你的头布局可以选择可要可不要的情况你可一直在你的AndroidManifest对应的activity中加入android:windowSoftInputMode=”stateVisible|adjustPan”这段代码就可以解决Edittext被挡住的问题,

2.不想整体布局上移,当时又要Eidttext在输入法的上面,那么用上面的方法是不可能的了,这里我的解决思路是,算出键盘的高度,然后根据这个来整体设置包裹EidtText的父view的marginBottom就可以解决这个问题,话不多说直接上代码:

 


        
        
    

这里我只是给出部分xml文件中的代码,其实在这个LinearLayout上可能还有很多的布局,反正不管你的布局怎么样都是一个样子那就是你的输入框是在布局的下面,在手机上显示的话就是在手机屏幕的下方。

 

3.然后获取到这个LinearLayout的控件,为什么要获取到这个控件呢,原因就是Edittext在这个view的包裹中,所以我只要算出键盘的高度来直接设置这个LinearLayout的marginBottom不就可以让EidtText永远在输入法的上面了吗?键盘消失直接他的marginBottom为0就可以了下面看代码。

4获取输入法的高度获取键盘高度的时候请把对应的activity中的android:windowSoftInputMode=”stateVisible|adjustPan属性删除掉可能获取不到键盘的高度哦尽量(没有测过),把你的布局文件的跟布局设置为RelativeLayout否则设置在外边距的时候也会使布局变形

 

 View decorView = getActivity().getWindow().getDecorView();
        //这个可以获取键盘的高度
        decorView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                Rect rect = new Rect();
                decorView.getWindowVisibleDisplayFrame(rect);
                //计算出可见屏幕的高度
                int displayHight = rect.bottom - rect.top;
                //获取屏幕整体高度
                int height = decorView.getHeight();
                //判断键盘是否显示和消失
                boolean visible = (double) displayHight / height < 0.8;
                int statusBarHeight = 0;
                //获取键盘的输入法工具条的高度,否则设置的lyoContent的高度将会多出一点
                try {
                    Class c = Class.forName("com.android.internal.R$dimen");
                    Object obj = c.newInstance();
                    Field field = c.getField("status_bar_height");
                    int x = Integer.parseInt(field.get(obj).toString());
                    statusBarHeight = getContext().getResources().getDimensionPixelSize(x);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                keyboardHeight = height - displayHight-statusBarHeight;
                onSoftKeyBoardVisible(visible, keyboardHeight);
            }
        });
        //获取键盘的高度

    }

    private void onSoftKeyBoardVisible(boolean visible, int keyboardHeight) {
        //如果键盘显示那么获取到他的高度设置lyoContent的marginBottom 这里lyoContent就是包裹EditText的那个view
        if (visible){
            LinearLayout.LayoutParams lp=new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,
                    LinearLayout.LayoutParams.WRAP_CONTENT);
            lp.setMargins(0,0,0,keyboardHeight);
            lyoContent.setLayoutParams(lp);
        }else {
            //消失直接设置lyoContent的marginBottom 为0让其恢复到原来的布局
            LinearLayout.LayoutParams lp=new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,
                    LinearLayout.LayoutParams.WRAP_CONTENT);
            lp.setMargins(0,0,0,0);
            lyoContent.setLayoutParams(lp);
        }

    }

在这里差不多可以解决布局上移的问题了,但是这里也有一个不好地方就是这种做法导致界面在不断回调OnGlobalLayoutListener方法,很不好,如果不考虑的这种方法的话,我这里有一个巧妙的方法,就是在你的EidtText布局下方设置一个高度和软盘一样的高度的View开始隐藏,通过监听软盘的显示和消失相应隐藏或者显示这个 View,Edittext也会出现在软盘上方了。

ok!代码就这么多希望多你有所帮助



 

 

你可能感兴趣的:(技巧)