解决EditText被软盘遮挡和键盘弹出布局不上移

一开始我遇到过这个也在网上找了很多例子,都是在说在AndroidManifest文件对应activity中加上

android:windowSoftInputMode=”stateVisible|adjustPan”这属性就可以了,但是这个会有包含一个问题那就是布局会上移,那么如果你的顶上布局是一个视屏播放键或者其他的,那么就会看不见,导致用户体验度不好。如果不设置这个属性的话,那么就会出现你的EidtText被输入法挡住,当用户输入文字的时候看不见输入的字,导致用户体验度也不好,所以这里给出我自己的解决思路,希望对你有所帮助。

解决思路:1.如果你的头布局可以选择可要可不要的情况你可一直在你的AndroidManifest对应的activity中加入android:windowSoftInputMode=”stateVisible|adjustPan”这段代码就可以解决Edittext被挡住的问题,

2.不想整体布局上移,当时又要Eidttext在输入法的上面,那么用上面的方法是不可能的了,这里我的解决思路是,算出键盘的高度,然后根据这个来整体设置包裹EidtText的父view的marginBottom就可以解决这个问题,话不多说直接上代码:

 

<LinearLayout
        android:id="@+id/lyo_content"
        android:background="@color/white"
        android:layout_marginTop="@dimen/dp_4"
        android:layout_alignParentBottom="true"
        android:layout_width="match_parent"
        android:layout_height="45dp">
        <EditText
            android:id="@+id/edit_content"
            android:layout_width="0dp"
            android:textColor="@color/tv_222222"
            android:textSize="14sp"
            android:theme="@style/myEidtText"
            android:layout_marginLeft="@dimen/dp_10"
            android:layout_weight="1"
            android:layout_height="match_parent" />
        <com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton
            android:id="@+id/btn_send_msg"
            app:qmui_radius="2dp"
            app:qmui_backgroundColor="@color/login_btn_2ecc71"
            app:qmui_borderColor="@color/tv_3cee87"
            android:padding="10dp"
            android:textSize="13sp"
            android:textColor="@color/white"
            android:layout_marginRight="@dimen/dp_10"
            android:layout_marginLeft="@dimen/dp_10"
            android:text="@string/text29"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </LinearLayout>

这里我只是给出部分xml文件中的代码,其实在这个LinearLayout上可能还有很多的布局,反正不管你的布局怎么样都是一个样子那就是你的输入框是在布局的下面,在手机上显示的话就是在手机屏幕的下方。

 

3.然后获取到这个LinearLayout的控件,为什么要获取到这个控件呢,原因就是Edittext在这个view的包裹中,所以我只要算出键盘的高度来直接设置这个LinearLayout的marginBottom不就可以让EidtText永远在输入法的上面了吗?键盘消失直接他的marginBottom为0就可以了下面看代码。

4获取输入法的高度获取键盘高度的时候请把对应的activity中的android:windowSoftInputMode=”stateVisible|adjustPan属性删除掉可能获取不到键盘的高度哦尽量(没有测过),把你的布局文件的跟布局设置为RelativeLayout否则设置在外边距的时候也会使布局变形

 

 View decorView = getActivity().getWindow().getDecorView();
        //这个可以获取键盘的高度
        decorView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                Rect rect = new Rect();
                decorView.getWindowVisibleDisplayFrame(rect);
                //计算出可见屏幕的高度
                int displayHight = rect.bottom - rect.top;
                //获取屏幕整体高度
                int height = decorView.getHeight();
                //判断键盘是否显示和消失
                boolean visible = (double) displayHight / height < 0.8;
                int statusBarHeight = 0;
                //获取键盘的输入法工具条的高度,否则设置的lyoContent的高度将会多出一点
                try {
                    Class<?> c = Class.forName("com.android.internal.R$dimen");
                    Object obj = c.newInstance();
                    Field field = c.getField("status_bar_height");
                    int x = Integer.parseInt(field.get(obj).toString());
                    statusBarHeight = getContext().getResources().getDimensionPixelSize(x);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                keyboardHeight = height - displayHight-statusBarHeight;
                onSoftKeyBoardVisible(visible, keyboardHeight);
            }
        });
        //获取键盘的高度

    }

    private void onSoftKeyBoardVisible(boolean visible, int keyboardHeight) {
        //如果键盘显示那么获取到他的高度设置lyoContent的marginBottom 这里lyoContent就是包裹EditText的那个view
        if (visible){
            LinearLayout.LayoutParams lp=new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,
                    LinearLayout.LayoutParams.WRAP_CONTENT);
            lp.setMargins(0,0,0,keyboardHeight);
            lyoContent.setLayoutParams(lp);
        }else {
            //消失直接设置lyoContent的marginBottom 为0让其恢复到原来的布局
            LinearLayout.LayoutParams lp=new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,
                    LinearLayout.LayoutParams.WRAP_CONTENT);
            lp.setMargins(0,0,0,0);
            lyoContent.setLayoutParams(lp);
        }

    }

在这里差不多可以解决布局上移的问题了,但是这里也有一个不好地方就是这种做法导致界面在不断回调OnGlobalLayoutListener方法,很不好,如果不考虑的这种方法的话,我这里有一个巧妙的方法,就是在你的EidtText布局下方设置一个高度和软盘一样的高度的View开始隐藏,通过监听软盘的显示和消失相应隐藏或者显示这个 View,Edittext也会出现在软盘上方了。

ok!代码就这么多希望多你有所帮助



 

 

  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
当 RecyclerView 中的 EditText 获取焦点并弹起软键盘时,可能会出现软键盘遮挡EditText 的情况,这个问题可以通过以下几种方式解决: 1. 使用 adjustResize 属性 在 Activity 的 AndroidManifest.xml 文件中,将 Activity 的 windowSoftInputMode 属性设置为 adjustResize,即可在软键盘弹出自动调整布局,将 EditText 上移以避免被遮挡。 ```xml <activity android:name=".YourActivity" android:windowSoftInputMode="adjustResize"> ... </activity> ``` 2. 使用 android:fitsSystemWindows 属性 在 RecyclerView 的父布局中添加 android:fitsSystemWindows="true" 属性,这样可以让 RecyclerView 的布局留出足够的空间来显示软键盘,避免 EditText遮挡。 ```xml <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true"> <androidx.recyclerview.widget.RecyclerView android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="match_parent"/> </RelativeLayout> ``` 3. 使用 scrollToPosition 或 scrollToPositionWithOffset 方法 在 RecyclerView 中的 EditText 获取焦点时,手动将 RecyclerView 滚动到 EditText 所在的位置,这样就可以避免 EditText遮挡。 ```java // 获取 EditText 在 RecyclerView 中的位置 int position = mAdapter.getPosition(editText); // 滚动 RecyclerView 到指定位置 mRecyclerView.scrollToPosition(position); // 或者使用 scrollToPositionWithOffset 方法,更精确地定位到 EditText 的位置 int offset = 100; // 偏移量,可根据实际情况调整 mLayoutManager.scrollToPositionWithOffset(position, offset); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值