【发布时间】:2015-04-07 03:05:12
【问题描述】:
我正在使用 API 17 模拟器来测试包含 Web 视图的页面。
- webview 首先使用 GET 方法加载页面。
- 然后用户使用 HTTP POST 方法提交 Web 表单,这会导致加载第二个页面。
- 此时,如果我旋转屏幕,我会收到如下所示的“网页不可用”错误。仅当使用 POST 方法加载页面时才会发生这种情况。注意:我正在尝试使用 webview.restoreState 恢复 webview 的状态(参见下面的代码)。有没有办法告诉Android重新发布表单数据并重新加载页面而不是显示此错误消息?!
我无法在 KitKat、Lollipop 或 Gingerbread 上重现同样的问题...目前我只能在 Jellybean and Ice Cream Sandwich 上重现此问题...
我还确认这是在运行 Jellybean 的实际 Nexus 7 设备上存在的问题,因此它不是仅模拟器的问题。
注意:我对使用 android:configChanges="orientation|keyboardHidden" 之类的东西不是特别感兴趣。据我了解,这可能会解决我的轮换问题,但如果由于其他原因需要恢复活动状态,问题可能仍会再次出现。
截图:
第 1 步:正常加载 WebView
第 2 步:提交表单(使用 HTTP Post 方法)
步骤#3:旋转屏幕触发webview.restoreState - 发生错误
代码:
这里有一些示例代码可以解决我的问题。代码在 Mono C# 中,但应该与 Java 几乎相同。
public class MainActivity : Activity
{
WebView webview;
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
webview = new WebView(this);
SetContentView(webview);
if (bundle == null)
webview.LoadUrl("http://2-dot-npwc-services.appspot.com/test-post.jsp");
else
webview.RestoreState(bundle);
}
protected override void OnSaveInstanceState(Bundle bundle)
{
base.OnSaveInstanceState(bundle);
webview.SaveState(bundle);
}
}
执行 POST 方法的示例 HTML 页面如下所示:
<html>
<form action="test-post.jsp" method="post">
<input type="text" name="test" value="test"/>
<input type="submit"/>
</form>
<p>You entered: <%=request.getParameter("test")%></p>
</html>
【问题讨论】:
-
您是否尝试为 WebView 小部件提供 id?我不知道它是否有帮助,但我知道如果一个小部件没有与之关联的 id,Android 不会通过配置更改保留它所持有的内容。在早期版本中,这曾经导致奇怪的错误。也许这就是你所看到的?
-
您可以提供任何 ID。你能告诉我们你发现了什么吗?
-
两种方法我都试过了。即使在为 webview 提供 id 时,我也会遇到同样的错误(我从布局中夸大了 webview)
-
仅供参考。从 Android 4.4 及更高版本开始,WebView 基于 Blink。在此之前,它是基于 WebKit 渲染引擎的。
-
是的,这可能是问题的一部分。尽管如果可能的话,我仍然想修复它。另外我觉得我在 Gingerbread 上没有遇到这个问题有点奇怪。