软键盘挡住WebView中输入框解决方法

博客指出EditText输入时软键盘会自动顶起输入框,而WebView中输入框被软键盘遮挡问题较难处理。介绍这是Android的一个bug,给出两种解决方法:一是去掉Activity全屏模式;二是借助填坑类AndroidBug5497Workaround,还给出了该类代码及在Activity中的使用方法。

如果是EditText,弹出软键盘好处理,会自动把输入框顶上来。

但如果输入框实在WebView中,那就不好处理了。

什么设置android:windowSoftInputMode属性啊,什么套一层ScrollView布局之类的都无效,最后再这里找到了终极解决方法,测试过有效。

附上链接:https://www.jianshu.com/p/306482e17080,感谢博主分享。

里面已经描述听详细的了,这里我也把该方法记录下来。

其实这是Android本身的一个issue 5497的bug。

解决方法有两种:

一、不用全屏模式,包含WebView的Activity使用了全屏模式,比如说没有标题栏之类的,就会出现这种遮挡的问题,如果可以的话去掉全屏就没问题了。

二、一定要全屏的Activity,那么也很简单,借助一个填坑类就可以了:

1、填坑的类AndroidBug5497Workaround:

import android.app.Activity;
import android.graphics.Rect;
import android.view.View;
import android.view.ViewTreeObserver;
import android.widget.FrameLayout;
 
/**
 * 解决WebView中输入时弹出软键盘,挡住输入框的问题
 * copy from https://www.jianshu.com/p/306482e17080
 * Created by ldw on 2018/5/23.
 */
 
public class AndroidBug5497Workaround {
 
    // For more information, see https://code.google.com/p/android/issues/detail?id=5497
    // To use this class, simply invoke assistActivity() on an Activity that already has its content view set.
 
    public static void assistActivity (Activity activity) {
        new AndroidBug5497Workaround(activity);
    }
 
    private View mChildOfContent;
    private int usableHeightPrevious;
    private FrameLayout.LayoutParams frameLayoutParams;
 
    private AndroidBug5497Workaround(Activity activity) {
        FrameLayout content = (FrameLayout) activity.findViewById(android.R.id.content);
        mChildOfContent = content.getChildAt(0);
        mChildOfContent.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            public void onGlobalLayout() {
                possiblyResizeChildOfContent();
            }
        });
        frameLayoutParams = (FrameLayout.LayoutParams) mChildOfContent.getLayoutParams();
    }
 
    private void possiblyResizeChildOfContent() {
        int usableHeightNow = computeUsableHeight();
        if (usableHeightNow != usableHeightPrevious) {
            int usableHeightSansKeyboard = mChildOfContent.getRootView().getHeight();
            int heightDifference = usableHeightSansKeyboard - usableHeightNow;
            if (heightDifference > (usableHeightSansKeyboard/4)) {
                // keyboard probably just became visible
                frameLayoutParams.height = usableHeightSansKeyboard - heightDifference;
            } else {
                // keyboard probably just became hidden
                frameLayoutParams.height = usableHeightSansKeyboard;
            }
            mChildOfContent.requestLayout();
            usableHeightPrevious = usableHeightNow;
        }
    }
 
    private int computeUsableHeight() {
        Rect r = new Rect();
        mChildOfContent.getWindowVisibleDisplayFrame(r);
        return (r.bottom - r.top);// 全屏模式下: return r.bottom
    }
 
}
2、Activity中使用也很简单:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_practise);
        AndroidBug5497Workaround.assistActivity(this);
    }

两种方法都很简单,结果也不再挡住输入框了。
-

### Android WebView 软键盘遮挡输入框解决方案 在开发过程中,遇到软键盘遮挡 WebView 输入框的情况是一种常见问题。以下是几种有效的解决方法: #### 方法一:调整 `AndroidManifest.xml` 文件 通过设置 Activity 的 `android:windowSoftInputMode` 属性来处理软键盘的行为。可以将其值设为 `adjustPan` 或者 `adjustResize`。 - **`adjustPan`**: 当软键盘弹出时,整个界面不会重新布局,而是平移以确保当前焦点控件可见。 - **`adjustResize`**: 当软键盘弹出时,活动窗口会被压缩以便留出空间给软键盘。 配置示例: ```xml <activity android:name=".YourActivity" android:windowSoftInputMode="adjustResize"> </activity> ``` 此方法简单易用,适用于大多数场景[^2]。 #### 方法二:动态设置 Soft Input Mode 可以在 Activity 的 `onCreate()` 方法中动态设置软键盘模式。这种方式同样支持两种行为选项:`SOFT_INPUT_ADJUST_RESIZE` 和 `SOFT_INPUT_ADJUST_PAN`。 代码实现如下: ```java import android.view.WindowManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); getWindow().setSoftInputMode( WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE | WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN ); } ``` 这种方法适合需要灵活控制软键盘显示逻辑的场景[^3]。 #### 方法三:自定义 ScrollView 行为 如果以上两种方法无法满足需求,可以通过修改 WebView 所处容器(通常是 ScrollView 或 NestedScrollView)的行为来解决问题。具体做法是在滚动视图中监听软键盘状态并手动调整位置。 以下是一个简单的例子: ```java public class CustomScrollView extends ScrollView { public CustomScrollView(Context context) { super(context); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); // 如果高度发生变化,则尝试滚动到合适的位置 this.scrollTo(0, Math.max(h - getHeight(), 0)); } } ``` 将该类用于包裹 WebView 容器即可[^1]。 --- ### 总结 针对 Android WebView软键盘遮挡输入框的问题,推荐优先采用调整 `AndroidManifest.xml` 配置的方式 (`adjustResize`) 来快速解决问题;对于更复杂的需求,可考虑动态设置软键盘模式或定制化滚动组件。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值