Android通过监听软键盘弹起与关闭实现软键盘弹起时底部按钮消失、关闭时底部按钮显示

现在有一个需求,在一个页面中,顶部有一个悬浮的控件一直显示,中间是可滑动的,即使软键盘弹出;底部也有一个悬浮的控件,软键盘弹出的时候,底部悬浮控件不随着软键盘的弹出而上移显示。显示效果如图:

图一:软键盘隐藏

图二:软键盘显示-第一条获取焦点

图三:软键盘显示-最后一条获取焦点

Android通过监听软键盘弹起与关闭实现软键盘弹起时底部按钮消失、关闭时底部按钮显示_第1张图片    Android通过监听软键盘弹起与关闭实现软键盘弹起时底部按钮消失、关闭时底部按钮显示_第2张图片      Android通过监听软键盘弹起与关闭实现软键盘弹起时底部按钮消失、关闭时底部按钮显示_第3张图片

 

我们知道页面上软键盘弹出的时候页面的显示效果跟android:windowSoftInputMode属性中的类似"adjust..."值有关,类似adjust...的值有三个,adjustUnspecified、adjustResize、adjustPan,三个属性值都实现不了想要的效果(详见https://blog.csdn.net/qiutiandepaomo/article/details/84028558)。

想到的解决方案是:中间部分设置成可滑动的(例如加一个ScrollView或者RecyclerView等),设置windowSoftInputMode属性为adjustUnspecified或adjustResize,来保证顶部标题行一直展示,通过监听软键盘的弹出与隐藏来控制底部按钮的显示,软键盘弹出的时候,底部按钮隐藏,软键盘隐藏的时候,底部按钮展示。

具体实现步骤是:

1、为当前页面最外层的layout设置一个OnLayoutChangeListener监听器监听当前页面变化的高度,认为Activity变化的高度超过屏幕的1/3,就是软键盘弹起或关闭了。

public class MainActivity extends Activity {

    RelativeLayout mRlTest;
    RelativeLayout mRlCommit;

    //屏幕高度
    private int screenHeight = 0;
    //软件盘弹起后所占高度阀值
    private int keyHeight = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //获取屏幕高度
        screenHeight = this.getWindowManager().getDefaultDisplay().getHeight();
        //阀值设置为屏幕高度的1/3
        keyHeight = screenHeight / 3;

        mRlTest = findViewById(R.id.rl_test);
        mRlCommit = findViewById(R.id.rl_commit);

        mRlTest.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
            @Override
            public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
                if (oldBottom != 0 && bottom != 0 && (oldBottom - bottom > keyHeight)) {//认为软键盘将Activity向上推的高度超过了屏幕高度的1/3,就是软键盘弹起了,这个时候隐藏底部的提交按钮
                    //延迟100ms设置不可见性是避免view还没计算好自己的宽高,设置可见不可见性失效。
                    mRlCommit.postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            mRlCommit.setVisibility(View.GONE);
                        }
                    }, 100);

                } else if (oldBottom != 0 && bottom != 0 && (bottom - oldBottom > keyHeight)) {//认为软键盘将Activity向下推的高度超过了屏幕高度的1/3,就是软键盘隐藏了,这个时候显示底部的提交按钮

                    mRlCommit.postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            mRlCommit.setVisibility(View.VISIBLE);
                        }
                    }, 100);
                }
            }
        });
    }

完整代码:https://github.com/ruxing1102/SoftKeyboardTest/tree/master

你可能感兴趣的:(Android通过监听软键盘弹起与关闭实现软键盘弹起时底部按钮消失、关闭时底部按钮显示)