安卓:键盘弹出时,WebView 滚动不够

6
在我的应用中,我有一个WebView来加载一个网页,用户需要在该网页上执行身份验证。当用户选择网页中的某个输入字段时,WebView 应该:
  1. 聚焦于该字段
  2. 打开键盘
  3. 执行向上滚动,以便用户可以继续看到该字段
然而,WebView 不会自动向上滚动,因此用户将不再看到该字段。如果用户手动尝试滚动,则 WebView 只会进行小幅滚动 - 不足以让用户看到他所需的所有内容。 问题并不在于网页本身,因为当我使用 Android Chrome 浏览此网页时,它确实会向上滚动以保持该字段在视野内,并允许滚动到页面底部。我已经阅读了以下问题: WebView doesn't scroll when keyboard openedadjustPan not preventing keyboard from covering EditText 但是答案没有解决这个问题。
我的当前 activity_web_viewlogin.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/portalWebViewWrapper"
    android:orientation="vertical"
    tools:context="com.hpe.sb.mobile.app.features.login.activities.WebViewLoginActivity">
    <include
        android:id="@+id/app_bar"
        layout="@layout/app_bar" />

   <ScrollView android:layout_width="match_parent"
       android:layout_height="match_parent"
       android:fillViewport="true">

        <WebView
            android:id="@+id/portalWebView"
            android:layout_below="@id/app_bar"
            android:layout_width="match_parent"
            android:layout_margin="@dimen/activity_vertical_margin"
            android:layout_height="match_parent"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true" />

   </ScrollView>
</LinearLayout>

尝试将ScrollView包含在LinearLayout中。

在我的AndroidManifest.xml文件中:

        <activity
           android:name=".features.login.activities.WebViewLoginActivity"
           android:windowSoftInputMode="adjustResize"
           android:label="" />

尝试使用adjustPan而不是adjustResize。

提前感谢!

2个回答

7
感谢朋友,我现在有了一个解决方案。 在AndroidManifest.xml文件中:
<activity
            android:name=".features.login.activities.WebViewLoginActivity"
            android:label=""
            android:windowSoftInputMode="adjustResize"
            android:theme="@style/webview"/>

在styles.xml中:
<style name="webview" parent="AppTheme.NoActionBar">
        <item name="windowNoTitle">true</item>
        <item name="windowActionBar">false</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowActionBar">false</item>
        <item name="android:windowFullscreen">false</item>
    </style>

这是activity_web_viewlogin.xml文件:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"

    android:id="@+id/portalWebViewWrapper"
    tools:context="com.hpe.sb.mobile.app.features.login.activities.WebViewLoginActivity">
    <include
        android:id="@+id/app_bar"
        layout="@layout/app_bar" />
    <WebView
        android:id="@+id/portalWebView"
        android:layout_below="@id/app_bar"
        android:layout_width="match_parent"
        android:layout_margin="@dimen/activity_vertical_margin"
        android:layout_height="match_parent"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />

</RelativeLayout>

这个活动布局没有什么特别的地方。就像 @ramji 解释的那样,它可以在没有 ScrollView 的情况下工作。我相信它也可以使用 LinearLayout 替代 RelativeLayout,对我来说并没有关系。


1
这是否因为 <item name="android:windowFullscreen">false</item> 语句而起作用? - Ayyappa
我不知道为什么活动样式会使它工作。经过测试…确实没有起作用;点击表单输入会导致键盘向上滚动并覆盖Web视图! - Someone Somewhere
ScrollView中流畅地使用ConstraintLayout - Lalit Fauzdar

-1

Webview已经自带滚动条,无需使用内部的ScrollView。 请将您的代码替换为:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/portalWebViewWrapper"
    android:orientation="vertical"
 tools:context="com.hpe.sb.mobile.app.features.login.activities.WebViewLoginActivity">
    <include
        android:id="@+id/app_bar"
        layout="@layout/app_bar" />

        <WebView
            android:id="@+id/portalWebView"
            android:layout_below="@id/app_bar"
            android:layout_width="match_parent"
            android:layout_margin="@dimen/activity_vertical_margin"
            android:layout_height="match_parent"/>

</LinearLayout>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接