转载-键盘弹出后,导致底部布局被顶上去

博客针对Android页面中,软键盘弹出时底部悬浮控件不随之上移的需求,指出android:windowSoftInputMode属性中类似“adjust...”值无法实现该效果。提出解决方案,将中间部分设为可滑动,设置windowSoftInputMode属性,通过监听软键盘状态控制底部按钮显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

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

图一:软键盘隐藏

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

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

          

 

我们知道页面上软键盘弹出的时候页面的显示效果跟android:windowSoftInputMode属性中的类似"adjust..."值有关,类似adjust...的值有三个,adjustUnspecified、adjustResize、adjustPan,三个属性值都实现不了想要的效果(详见https://blog.youkuaiyun.com/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

              </div>
当我们在使用手机或平板电脑时,点击输入框时,系统会自动弹出软键盘软键盘弹出时,输入框被键盘遮挡住,导致我们无法继续输入或者查看我们输入的内容。这时,页面会自动上移,将输入框移到可视范围内,以便我们继续输入。 页面顶部被软键盘遮挡是因为系统默认情况下,软键盘弹出在页面底部。为了解决这个问题,可以通过调整页面布局或使用特定的技术手段来解决。 一种常见的解决方案是使用特定的组件或库来处理输入框被键盘遮挡的问题。这些组件或库可以自动监听软键盘弹出事件,并在软键盘弹出时,自动调整页面布局,使输入框上移,从而避免输入框被遮挡。这种方式可以使页面的用户体验更好,避免用户在输入时受到干扰。 另一种解决方案是通过手动调整页面布局来解决输入框被键盘遮挡的问题。这种方式需要开发人员手动监听软键盘弹出事件,在软键盘弹出时,通过改变页面布局,将输入框上移,使其显示在软键盘上方,从而避免被遮挡。这种方式相对复杂一些,需要开发人员对页面布局软键盘事件有一定的了解。 总的来说,无论是使用特定的组件或库,还是通过手动调整布局,都可以解决输入框被键盘遮挡的问题。通过这些解决方案,我们可以确保输入框在软键盘弹出时能够被正常显示,从而提供更好的用户体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值