从 WebView 错误到 ImageView 掩盖再到屏幕方向
Posted
技术标签:
【中文标题】从 WebView 错误到 ImageView 掩盖再到屏幕方向【英文标题】:From WebView Errors to ImageView Cover-ups to Screen Orientation 【发布时间】:2011-01-05 07:39:36 【问题描述】:这一切都始于 android 应用中的一个简单的 WebView。
此视图从公共 URL 加载信息。没有什么不寻常的地方。
但是...如果出现网络中断,您很容易在 WebView 中显着显示错误。
好吧,那不好,对吧?所以我在文档和其他地方搜索了一种方法来抑制它,或者捕获它......但没有发现任何线索。于是,我在 IRC 上的#android-dev
上进行了询问:我知道 WebView.onReceivedError,但是可以抑制视觉部分吗? (相反,我想显示一个关于所述网络问题的对话框警告,并提供重试选项。)
答案:You can't。 :(
很好。是时候制定 B 计划了。也许 ImageView 可以满足要求?
如果出现任何一种WebView错误,ImageView可以作为临时窗帘使用。它在开始时(在加载 URL 之前)覆盖 WebView,然后淡出以显示其后面的 WebView。如果 WebView 有效,那就太好了!但是如果 onReceivedError 启动,我们会立即拉上帷幕并显示上述对话框。一旦 WebView 获得 onPageFinished,幕布将再次褪去。
...这个...效果很好!
直到我被要求支持屏幕方向更改。 (预示:“事情从这里开始走下坡路。”)
到目前为止,该应用程序在 Manifest 的主要活动中使用 android:screenOrientation="portrait"
。所以我删除了那部分,当然我们遇到了臭名昭著的“正在重新启动活动”问题,该问题消失了,然后又恢复了 WebView。
当然,这本身不是问题。这是按设计运行的 Android 操作系统。
此外,我们希望 ImageView 根据方向正确显示。值得庆幸的是,我们有alternate resources 可以利用!同时,我们仍然有这个我们不想重新加载的 WebView。我们希望它保持独立,让视图做自己的事情,无论是当时的纵向还是横向。
我找到了a few well-explained ways to handle screen orientation,而且我已经阅读了作者MarkMurphy'seBooks(强烈推荐阅读)。然而我还是被卡住了!随着 ImageView 的加入,似乎没有一种技术可以满足要求:
当然,强制纵向模式是, 不可能(或者是吗?)。
android:configChanges="keyboardHidden|orientation"
和onConfigurationChanged
似乎
照顾 WebView,它
幸福地处理屏幕
自行优雅地调整大小。的
当然, ImageView 没有得到
备忘录,它一直在使用
它的原始(肖像/风景)资源!
一个考虑不周的呼吁
activity.setRequestedOrientation(newConfig.orientation)
在配置更改处理程序中
没有帮助。
由于 WebView 不需要
在应用程序执行之间持续存在,
onRetainNonConfigurationInstance
看起来像另一种可能性。
唉,这似乎不起作用
任何一个。使用 重置webview
最后一个非配置实例(因为
这就是我真正通过的全部)
导致空白 WebView。不是
正是我所追求的。
另一方面 手,ImageView 似乎 对方向反应很好 变化。去图吧。
onSaveInstanceState
怎么样?相同的
陷阱。 WebView 有一个saveState
方法,但似乎不是
将其保存在足够深的级别以
保持无缝过渡。如果是这样的话,
那么它可能不应该
要么,所以这可能是错误的
路也好走。
至于使用configChanges
、the documentation recommends this very technique的智慧,其实:
Activity 的标准行为是 被销毁并重新创建时 设备方向已更改。这 将导致 WebView 重新加载 当前页面。如果你不想这样, 你可以设置你的Activity来处理
orientation
和keyboardHidden
改变,然后离开 WebView 单独。它会自动 适当地重新定位自己。
当然I could also be committing some sort of pilot error 在这里,但我还没有弄清楚那可能是什么。
我已经阅读并重新阅读了文档,并尝试了各种方法来自行破解。也许我在文档中遗漏了一些东西(很明显?),或者解决方案不明显(但有人可以阐明)......或者这根本不可能。希望不是后者。
欢迎/赞赏线索!
【问题讨论】:
【参考方案1】:很高兴你喜欢这些书!
在关于轮换的章节中,我怀疑您尝试过许多方法,您会注意到onConfigurationChanged()
风格再次调用setContentView()
,强制重新加载布局并因此获得正确的资源。你当然不想这样做本身,因为那会毁掉你的 WebView。
但是,我希望在onConfigurationChanged()
中为您的ImageView
调用setImageResource()
应该会拉入正确版本的“窗帘”。用它把你的形象“修饰”到合适的形象,看看是否有帮助。
【讨论】:
嗨,马克(挥手)!是的,setContentView - 我像瘟疫一样避免这种情况(呵呵)。你相信我在 onConfigurationChanged 中注释掉了这一行吗?curtain.setImageResource(R.drawable.curtain);
原因:它似乎没有做任何事情。我要仔细看看。
没有骰子。就像我打电话什么都没做一样。即使我只是通过关于 ImageView 并让它在旋转时改变来简化问题。嗯...
嗯……这很奇怪。作为测试,用一个新名称制作一个稍微改变的窗帘图像副本,并尝试在两者之间切换,而不是依赖资源集。我只是想确保问题在于您没有获得正确的资源集。如果更改后的图像上的 setImageResource() 无效,则意味着您的 ImageView 由于某种原因没有得到更新,这需要不同的调试路径来修复。
OK - 非常有趣的结果!为了避免弄乱 UI,我使用了 onKeyDown 来捕获 KEYCODE_BACK。每次我点击它时,我都会在真/假之间翻转一个布尔值,并且根据它,我将 setImageResource 设置为两个图像之一。这么多工作!然后我记得我仍然有方向检测,所以我尝试将设备旋转到横向。 (我一直在跟踪这个。)同样,在 onConfigurationChanged 中,我们使用 setImageResource。但它似乎使用了预方向改变图像!在那之后点击后退按钮?它改变了形象。
这似乎违反直觉。不过,它确实建议一种解决方法可能是在由 onConfigurationChanged() 触发的短暂延迟后执行 setImageResource()。例如,您可以通过 ImageView 小部件上的 postDelayed() 来执行此操作。把它推出 100 毫秒,看看会发生什么,诸如此类。但是,老实说,它确实应该在 onConfigurationChanged() 中有正确的资源,因为这有点意思......【参考方案2】:
您是否尝试过操作您的 Android Manifest 文件。
说明 --> http://androidsfuture.blogspot.com/2010/06/developers-corner-dealing-with-screen.html#comment-form
【讨论】:
是的 - 事实上,正是这样做。以上是关于从 WebView 错误到 ImageView 掩盖再到屏幕方向的主要内容,如果未能解决你的问题,请参考以下文章