1

这一切都始于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,似乎没有一种技术可以满足要求:

  1. 当然,强制肖像模式是不可能的(或者是吗?)。

  2. android:configChanges="keyboardHidden|orientation" 并且onConfigurationChanged似乎处理了 WebView,它可以自行优雅地处理屏幕大小调整。当然,ImageView也没有得到备忘录,它继续使用其原始(纵向/横向)资源!

    对配置更改处理程序中的一个考虑不周的调用 activity.setRequestedOrientation(newConfig.orientation) 没有帮助。

  3. 由于WebView不需要在应用程序执行之间持久化,因此 onRetainNonConfigurationInstance 看起来像是另一种可能性。唉,这似乎也不起作用。使用最后一个非配置实例进行重置webview(因为这是我真正传入的全部内容)导致空白WebView。不完全是我所追求的。

    另一方面,ImageView似乎对方向变化做出了很好的响应。去搞清楚。

  4. 怎么样onSaveInstanceState?同样的陷阱。WebView有一个saveState 方法,但它似乎没有将它保存在足够深的级别以保持过渡无缝。如果是这样,那么它可能也不应该这样做,所以这也可能是错误的方法。

至于使用的智慧configChanges文档非常推荐这种技术,实际上:

当设备方向改变时,Activity的标准行为将被销毁并重新创建。这将导致WebView重新加载当前页面。如果你不想这样,你可以设置你的Activity来处理orientationkeyboardHidden 更改,然后只留下 WebView。它会根据需要自动重新定向。

当然,我也可能在这里犯了某种飞行员错误,但我还没有弄清楚那可能是什么。

我已经阅读并重新阅读了文档,并尝试了各种方法来自行破解。也许我在文档中遗漏了一些东西(很明显?),或者解决方案不明显(但有人可以阐明)......或者这根本不可能。希望不是后者。

欢迎/赞赏线索!

4

2 回答 2

0

很高兴你喜欢这些书!

在关于轮换的章节中,我怀疑您尝试了许多方法,您会注意到onConfigurationChanged()风味setContentView()再次调用,强制重新加载布局并因此获得正确的资源。当然,您本身并不想这样做,因为那会毁掉您的 WebView。

但是,我希望为您的setImageResource()in调用应该拉入您的“窗帘”的正确版本。使用它来“修饰”您的图像到正确的图像,看看是否有帮助。onConfigurationChanged()ImageView

于 2010-01-15T02:33:31.207 回答
0

您是否尝试过操作您的 Android Manifest 文件。

说明 --> http://androidsfuture.blogspot.com/2010/06/developers-corner-dealing-with-screen.html#comment-form

于 2010-09-01T16:53:32.423 回答