这一切都始于Android 应用程序中的一个简单的WebView 。
此视图从公共 URL 加载信息。那里没有什么不寻常的。
但是......如果出现网络中断,您很容易在WebView中突出显示错误。
好吧,那不好,对吧?所以我在文档和其他地方搜索了一种方法来抑制它,或者捕获它......但没有发现任何线索。有了这个,我#android-dev
在 IRC 上询问:我知道WebView.onReceivedError,但是可以抑制视觉部分吗?(相反,我想显示一个关于所述网络问题的对话框警告,并选择重试。)
答:你不能。:(
很好。计划 B 的时间到了。也许ImageView 可以满足要求?
如果出现任何类型的WebView错误,ImageView可以用作临时窗帘。它在开始时(在加载 URL 之前)覆盖WebView,然后淡出以显示其后面的WebView 。如果WebView有效,那就太好了!但是如果onReceivedError启动,我们会立即拉上帷幕并显示上述对话框。一旦 WebView 获得onPageFinished,幕布就会再次消失。
...而这...效果非常好!
直到我被要求支持屏幕方向更改。(伏笔:“事情从这里走下坡路。”)
到目前为止,该应用程序一直android:screenOrientation="portrait"
在 Manifest 的主要活动中使用。所以我删除了那部分,当然我们遇到了臭名昭著的“正在重新启动活动”问题,它吹走了然后又带回了WebView。
当然,这本身不是问题。这是按设计运行的 Android 操作系统。
此外,我们希望ImageView根据方向正确显示。值得庆幸的是,我们有可以利用的替代资源!同时,我们仍然有这个我们不想重新加载的WebView 。我们希望它保持独立,让视图做自己的事情,无论是当时的纵向还是横向。
我找到了一些处理屏幕方向的很好解释的方法,而且我已经阅读了作者Mark Murphy 的 电子书(强烈推荐阅读)。然而我还是被卡住了!现在有了ImageView,似乎没有一种技术可以满足要求:
当然,强制肖像模式是不可能的(或者是吗?)。
android:configChanges="keyboardHidden|orientation"
并且onConfigurationChanged
似乎处理了 WebView,它可以自行优雅地处理屏幕大小调整。当然,ImageView也没有得到备忘录,它继续使用其原始(纵向/横向)资源!对配置更改处理程序中的一个考虑不周的调用
activity.setRequestedOrientation(newConfig.orientation)
没有帮助。由于WebView不需要在应用程序执行之间持久化,因此
onRetainNonConfigurationInstance
看起来像是另一种可能性。唉,这似乎也不起作用。使用最后一个非配置实例进行重置webview
(因为这是我真正传入的全部内容)导致空白WebView。不完全是我所追求的。另一方面,ImageView似乎对方向变化做出了很好的响应。去搞清楚。
怎么样
onSaveInstanceState
?同样的陷阱。WebView有一个saveState
方法,但它似乎没有将它保存在足够深的级别以保持过渡无缝。如果是这样,那么它可能也不应该这样做,所以这也可能是错误的方法。
至于使用的智慧configChanges
,文档非常推荐这种技术,实际上:
当设备方向改变时,Activity的标准行为将被销毁并重新创建。这将导致WebView重新加载当前页面。如果你不想这样,你可以设置你的Activity来处理
orientation
和keyboardHidden
更改,然后只留下 WebView。它会根据需要自动重新定向。
当然,我也可能在这里犯了某种飞行员错误,但我还没有弄清楚那可能是什么。
我已经阅读并重新阅读了文档,并尝试了各种方法来自行破解。也许我在文档中遗漏了一些东西(很明显?),或者解决方案不明显(但有人可以阐明)......或者这根本不可能。希望不是后者。
欢迎/赞赏线索!