Android 键盘遮挡视图问题解决方案

2020-08-28  本文已影响0人  旺仔爸

效果图

image.png

方法一

设置Activity android:windowSoftInputMode 属性

<activity android:name=".module.write.activity.WriteActivity" android:windowSoftInputMode="adjustResize"/>

方法二

当方法一设置无效的时候实现思路
1,监听键盘打开关闭状态

监听键盘打开关闭状态代码

public class SoftKeyBoardListener {

    private View rootView;//activity的根视图
    int rootViewVisibleHeight;//纪录根视图的显示高度
    private OnSoftKeyBoardChangeListener onSoftKeyBoardChangeListener;

    public SoftKeyBoardListener(Activity activity) {
        //获取activity的根视图
        rootView = activity.getWindow().getDecorView();

        //监听视图树中全局布局发生改变或者视图树中的某个视图的可视状态发生改变
        rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                //获取当前根视图在屏幕上显示的大小
                Rect r = new Rect();
                rootView.getWindowVisibleDisplayFrame(r);

                int visibleHeight = r.height();
                System.out.println(""+visibleHeight);
                if (rootViewVisibleHeight == 0) {
                    rootViewVisibleHeight = visibleHeight;
                    return;
                }

                //根视图显示高度没有变化,可以看作软键盘显示/隐藏状态没有改变
                if (rootViewVisibleHeight == visibleHeight) {
                    return;
                }

                //根视图显示高度变小超过200,可以看作软键盘显示了
                if (rootViewVisibleHeight - visibleHeight > 200) {
                    if (onSoftKeyBoardChangeListener != null) {
                        onSoftKeyBoardChangeListener.keyBoardShow(rootViewVisibleHeight - visibleHeight);
                    }
                    rootViewVisibleHeight = visibleHeight;
                    return;
                }

                //根视图显示高度变大超过200,可以看作软键盘隐藏了
                if (visibleHeight - rootViewVisibleHeight > 200) {
                    if (onSoftKeyBoardChangeListener != null) {
                        onSoftKeyBoardChangeListener.keyBoardHide(visibleHeight - rootViewVisibleHeight);
                    }
                    rootViewVisibleHeight = visibleHeight;
                    return;
                }

            }
        });
    }

    private void setOnSoftKeyBoardChangeListener(OnSoftKeyBoardChangeListener onSoftKeyBoardChangeListener) {
        this.onSoftKeyBoardChangeListener = onSoftKeyBoardChangeListener;
    }

    public interface OnSoftKeyBoardChangeListener {
        void keyBoardShow(int height);

        void keyBoardHide(int height);
    }

    public static void setListener(Activity activity, OnSoftKeyBoardChangeListener onSoftKeyBoardChangeListener) {
        SoftKeyBoardListener softKeyBoardListener = new SoftKeyBoardListener(activity);
        softKeyBoardListener.setOnSoftKeyBoardChangeListener(onSoftKeyBoardChangeListener);
    }

}

2,键盘打开关闭时候动态设置要位于键盘之上View的layout_marginBottom 值

        SoftKeyBoardListener.setListener(requireActivity(), object : SoftKeyBoardListener.OnSoftKeyBoardChangeListener{
            override fun keyBoardShow(height: Int) {
                var toolViewLayout:RelativeLayout.LayoutParams = toolView.layoutParams as RelativeLayout.LayoutParams
                var fablayout:RelativeLayout.LayoutParams = fab.layoutParams as RelativeLayout.LayoutParams
                toolViewLayout.bottomMargin = height
                fablayout.bottomMargin = height+ SizeUtils.dp2px(24f)
                toolView.requestLayout()
                fab.requestLayout()
                LogTools.d("keyBoardShow$height")
            }

            override fun keyBoardHide(height: Int) {
                LogTools.d("keyBoardShow$height")
                var toolViewLayout:RelativeLayout.LayoutParams = toolView.layoutParams as RelativeLayout.LayoutParams
                var fablayout:RelativeLayout.LayoutParams = fab.layoutParams as RelativeLayout.LayoutParams
                toolViewLayout.bottomMargin = 0
                fablayout.bottomMargin = SizeUtils.dp2px(24f)
                toolView.requestLayout()
                fab.requestLayout()
            }

        })

布局文件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.smart.journal.module.write.WriteFragment">
    
    <include layout="@layout/toolbar" />

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/writeRecycleView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@+id/toolView"
        android:layout_below="@+id/toolbar"
        android:background="@color/write"
        android:padding="12dp" />

    <com.smart.journal.module.write.views.ToolView
        android:id="@+id/toolView"
        android:layout_width="match_parent"
        android:layout_height="48dp"
        android:layout_alignParentBottom="true"
        />

    <com.google.android.material.floatingactionbutton.FloatingActionButton
        android:id="@+id/fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_alignParentBottom="true"
        android:layout_margin="16dp"
        android:layout_marginBottom="24dp"
        android:backgroundTint="@android:color/holo_red_light"
        android:tint="#FFFFFF"
        android:visibility="visible"
        app:borderWidth="0dp"
        app:srcCompat="@drawable/ic_journal_save" />
</RelativeLayout>

上一篇 下一篇

猜你喜欢

热点阅读