实现QQ聊天输入框下的工具栏不被软键盘遮挡

一般情况下,输入法弹起来都在获取焦点的输入框下面,这样的情况就会把输入框下面的内容给遮挡住,但是发现QQ的聊天页面不会,工具栏一样显示在输入框下面。可以下下面图效果

QQ效果.png
一般情况下.png

实现方式应该有很多种的,在这里我实验下自己的想法,就是当软键盘弹起时,会把布局顶上去的,在这里监听软键盘是否弹起,如果弹起,就把布局向上移动一个工具栏的高度就可以显示了。
下面直接撸码,代码毕竟简单,加上快下班了,就不解释了。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:background="#27b1fc">

    </LinearLayout>

    <EditText
        android:id="@+id/edit"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="我是输入框"/>

    <TextView
        android:layout_width="match_parent"
        android:layout_height="30dp"
        android:background="#ff0"
        android:gravity="center"
        android:text="我是工具栏"/>

    <LinearLayout
        android:id="@+id/line1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"/>
</LinearLayout>
public class MainActivity extends AppCompatActivity {

    EditText mEditText;
    LinearLayout mLinearLayout;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mEditText = findViewById(R.id.edit);
        mLinearLayout = findViewById(R.id.line1);
        init();
    }

    private void init() {
        mEditText.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            //当键盘弹出隐藏的时候会 调用此方法。
            @Override
            public void onGlobalLayout() {
                Rect r = new Rect();
                //获取当前界面可视部分
                MainActivity.this.getWindow().getDecorView().getWindowVisibleDisplayFrame(r);
                //获取屏幕的高度
                int screenHeight = MainActivity.this.getWindow().getDecorView().getRootView().getHeight();
                //此处就是用来获取键盘的高度的, 在键盘没有弹出的时候 此高度为0 键盘弹出的时候为一个正数
                int heightDifference = screenHeight - r.bottom;
                Log.e("keb Size", "screenHeight: " + screenHeight);
                Log.e("keb Size", "r.bottom: " + r.bottom);
                Log.e("keb Size", "Size: " + heightDifference);
                pang(heightDifference);
            }

        });
    }
//把工具栏最下面的布局,当软键盘弹窗就显示,收起软键盘就隐藏
    public void pang(int heightDifference) {
        if (heightDifference == 0) {
            mLinearLayout.setVisibility(View.GONE);
        } else {
            mLinearLayout.setVisibility(View.VISIBLE);
        }
        LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) mLinearLayout.getLayoutParams();
        params.height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 30, getResources().getDisplayMetrics());
        Log.e("keb Size","mLinearLayout.height = "+mLinearLayout.getLayoutParams().height);
    }
}

最后上效果图,目前只在模拟器试验过,真机还没有试过。如有错误,轻喷


image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容