Android webview 键盘遮住输入框

本文介绍了Android开发者在使用WebView时遇到的键盘弹出遮挡输入框的常见问题。作者提出了一种暴力但有效的方法,通过自定义布局并利用Scroller类进行平滑滚动,实现在键盘显示和关闭时自动调整界面位置。同时提醒在AndroidManifest.xml中设置合适的主题以避免标题栏问题。

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

该文章纯属原创, 转载请说明出处
开发Android 一年多了,一直都是在网上找资料,现在有时间我也整理一个我遇到的问题,我的处女篇啊!!
相信很多Android开发者都遇到webview调用键盘然后输入框被遮住,效果很丑,体验很差。然后会疯狂的在网上找资料,在网上大致有四种方法(都不靠谱),唯一的一个就是设置android:windowSoftInputMode=”adjustResize”,然而却是太丑了。接下来我要介绍一种暴力的方法,该方法用到类Scroller,如果不懂这个类请上网查资料。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <com.example.cweb.MyLinearLayout
        android:id="@+id/my_linear"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <WebView
            android:id="@+id/webview"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    </com.example.cweb.MyLinearLayout>

</LinearLayout>

这个是放webview的布局,MyLinearLayout很简单就是继承了Linearlayout,它里面的主要的方法就是滑动,


    /**
     * 滚动到目标位置
     * 
     * @param fx
     * @param fy
     */
    protected void smoothScrollTo( int fx, int fy ) {

        int dx = fx - mScroller.getFinalX();
        int dy = fy - mScroller.getFinalY();
        smoothScrollBy( dx, dy );
    }


    /**
     * 滑动到相对的位置
     * 
     * @param dx
     * @param dy
     */
    protected void smoothScrollBy( int dx, int dy ) {

        // 设置mScroller的滚动偏移量
        mScroller.startScroll( mScroller.getFinalX(), mScroller.getFinalY(), dx, dy );
        invalidate();// 这里必须调用invalidate()才能保证computeScroll()会被调用,否则不一定会刷新界面,看不到滚动效果
    }


    @Override
    public void computeScroll() {

        // 判断mScroller滚动是否完成
        if( mScroller.computeScrollOffset() ) {
            // 这里调用View的scrollTo()完成实际的滚动
            scrollTo( mScroller.getCurrX(), mScroller.getCurrY() );
            // 必须调用该方法,否则不一定能看到滚动效果
            postInvalidate();
        }
        super.computeScroll();
    }

两个滑动的方法smoothScrollBy和smoothScrollTo,这个代码相信不难, so easy的。
接下来就是启动滑动的代码了,

    webView.setOnTouchListener( new OnTouchListener() {

            @Override
            public boolean onTouch( View v, MotionEvent event ) {

                if( event.getAction() == MotionEvent.ACTION_UP ) {
                    pointY = ( int )event.getY();
                    clickTime = System.currentTimeMillis();

                }
                return false;
            }
        } );
        final View mainLinear = findViewById( R.id.main_layout );

        mainLinear.getViewTreeObserver().addOnGlobalLayoutListener( new OnGlobalLayoutListener() {

            @Override
            public void onGlobalLayout() {

                int preHeight = 0;
                int heightDiff = mainLinear.getRootView().getHeight() - mainLinear.getHeight();

                if( preHeight == heightDiff ) {
                    Log.e( "MainActivity", "++" );
                    return;
                }
                preHeight = heightDiff;
                // 需要客户端启动滑动的初始Y坐标
                int startY = mScreenHeight / 2;
                if( heightDiff >= 50 && !isOpenKeyBord ) {
                    if( pointY < ( startY - 200 ) ) {
                        return;
                    }
                    //必须在监听到点击事件600ms之内才进行滑动,防止刚刚进来直接往上滑动
                    if( ( System.currentTimeMillis() - clickTime ) < 600 ) {
                        int y1 = Math.abs( pointY - startY ) + 200;
                        Logs.e( tag, "OnGlobalLayoutListener界面上移" + y1 );
                        myLinearLayout.smoothScrollBy( 0, y1 );
                        isOpenKeyBord = true;
                    }

                } else {
                    Logs.e( tag, "OnGlobalLayoutListener界面还原" );
                    myLinearLayout.smoothScrollTo( 0, 0 );
                    isOpenKeyBord = false;

                }
                preHeight = 0;
            }

        } );

mainLinear 是整个layout 的view,这个方法是根据布局界面变化来判断键盘的显示和关闭的
heightDiff >= 50 这个值究竟放多少要自己研究,我在手机上市100,但是在小米平板上用50,你究竟用多少还是自己测吧。这个方法就是键盘调起的时候把界面往上滑动,键盘关闭的时候把键盘还原。是不是很简单粗暴,
还有一点要注意,在manifest注册时一定 android:theme=”@android:style/Theme.NoTitleBar”,
千万别写这样 android:theme=”@android:style/Theme.NoTitleBar.Fullscreen”,不然你会奔溃的,当然你要其他的titlebar就用其他的,哈哈

这样,你就可以实现调用键盘滑动了。

### 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`) 来快速解决问题;对于更复杂的需求,可考虑动态设置软键盘模式或定制化滚动组件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值