Android软键盘遮挡布局问题;

布局被软键盘遮挡虽然不是什么大问题,但还是比较影响用户体验的;最让人恼火的是当前输入框被软键盘被遮挡,来看一下解决方法;

1、当前输入框被软键盘遮挡,仅把输入框显示出来,不改变整体布局;

设置Manifest: 

android:windowSoftInputMode="adjustPan"

代码设置:要在setContentView之前

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

2、如果需求这样告诉你,输入框下面的登录按钮也要显示出来;那么用第一种方式就不行了;

这个是测试给提出的BUG:说在左边的这个手机 登录按钮、忘记密码、账号注册,这几个地方被软键盘遮挡了;右边的手机显示正常;

我回复他:你手机屏幕小,我能有什么办法;

然后需求告诉我:兼容性问题,开发请修改;



无奈```开始修改吧!

我的思路是这样的:1、这个登录界面的最外层布局使用ScrollView,因为它可以上下滚动;

2、如果输入框EditText被触摸或焦点发生变化,这时软键盘会弹出,键盘弹出后改变ScrollView的位置,让其显示最下面;

代码如下:

       etMobile.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                initlist();
            }
        });
        etMobile.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                initlist();
                return false;
            }
        });
        etCodePassword.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                initlist();
            }
        });
        etCodePassword.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                initlist();
                return false;
            }
        });
private void initlist() {
        getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
        sc.postDelayed(new Runnable() {
            @Override
            public void run() {
                sc.smoothScrollTo(0,sc.getHeight());
            }
        }, 300);
    }

效果图如下:

             

但是,如果这个界面是全屏显示,沉浸式的话,ScrollView改变位置就不能使用了;

3、改变布局,让登录按钮显示出来;

大致思路:监听软键盘是否显示,如果软键盘显示,就把输入框以上的布局隐藏GONE了;

代码实现:(监听界面发生改变的使用最外层的布局)

//监听界面是否发生改变(如果发生改变我们我认为软键盘有变化)
        sc.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                sc.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        //判断现在软键盘的开关状态
                       if(SoftKeyboardUtils.isSoftShowing(LoginActivity.this)){
                           rl.setVisibility(View.GONE);
                           StatusBarCompat.setLightStatusBarColor(LoginActivity.this); //关闭沉浸式
                       }else{
                           rl.setVisibility(View.VISIBLE);
                           StatusBarCompat.translucentStatusBar(LoginActivity.this, true); //开启沉浸式
                       }
                    }
                },100L);
            }
        });

SoftKeyboardUtils是我抽取监听软键盘的工具类:https://blog.csdn.net/qq_35605213/article/details/80763863

效果如下:(可以做一个隐藏的动画,效果会好一点)

              

猜你喜欢

转载自blog.csdn.net/qq_35605213/article/details/81005187