我使用API 17模拟器测试包含网页视图的网页。
我无法在KitKat,Lollipop或Gingerbread上重现同样的问题......到目前为止,我只能在Jellybean和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>
答案 0 :(得分:1)
浏览器表现良好(虽然这对我们来说很痛苦),但您有两种方式:
1-保持webView实例并恢复状态,像你说的那样添加 android:configChanges =“orientation | keyboardHidden”
2-或者再次重新加载帖子请愿书。
我拿第一个,如果我得到一些错误,我会回到最后一页。做静态内容,所以在轮换时没有网络或每次轮换需要新的请求,如果没有,在服务器端也会很痛苦。
要实现“if error return”,您需要设置Custom WebClient并覆盖此方法
webview.setWebViewClient(new WebViewClient() {
@Override
public void onReceivedError(WebView webView, int errorCode, String description, String failingUrl) {
if ( webView.canGoBack() ) {
Toast.makeText(MainActivity.this, R.string.error_web, Toast.LENGTH_SHORT).show();
webView.goBack();
}
}
});
你可以通过errorCode进行过滤,以便在需要时返回,在某种错误中你可以返回其他做其他事情。我不知道哪个错误引发了这个POST请求,或者你想要在其他情况下使用更多过滤器,所以我确信你可以使用它做一个细粒度过滤器。
编辑:您在这里有可能的错误代码 WebViewClient Error Codes
我希望这会有所帮助。