我在webview中显示数学表达式(使用jqmath库和一些CSS)。一个要求是表达式应该居中,这就是我用来实现它的目的:
<html><head><style type='text/css'>html,body {margin: 0;padding: 0;width: 100%;height: 100%;}html {display: table;}body {display: table-cell;vertical-align: middle;text-align: center;}</style></head><body><p>here goes the expression</p></body></html>
由于渲染数学需要一些时间,因此在表达式渲染时会隐藏webview,并且只有在它准备就绪时才会显示(一旦调用了WebViewClient的onPageFinished
)。这在Android 4.4之前运行良好。
新webview的问题似乎是它只在屏幕上显示时才应用CSS。因此,在显示隐藏的webview后,表达式首先出现在左上角,并且仅在~0.1秒后“跳转”到中心。这看起来很难看,因为我必须快速连续显示许多表达式。
此问题中描述了一个相关问题:width:100% in CSS not rendering well in Android 4.4。提问者能够通过从html中删除display: table;
来解决他的问题,但这在我的案例中不起作用。
那么有没有办法: (a)强制新的(基于Chromium的)webview在内容不可见时呈现内容,或者 (b)从头开始显示中心的内容(不先在左上角显示)。
答案 0 :(得分:3)
KK WebView仅在屏幕上显示时才应用CSS:
如果可见性设置为GONE
,则WebView将无法调整自身的大小,因为Android框架会在其上调用与布局相关的方法(如layout
和onSizeChanged
)。这可能就是你所看到的。请尝试将可见性设置为INVISIBLE
。
WebViewClient.onPageFinished
不是显示WebView的可靠触发器。回调的真正含义是主框架的资源已从网络加载。不幸的是,从来没有一个可靠的回调可以告诉你'你的内容已准备好显示' - 你所描述的内容可能因为特定时间而正常工作。不显示未完成内容的最可靠方法是在HTML / CSS中执行此操作。
您可能正在使用WebView.loadDataWithBaseUrl
将内容加载到新的/空白WebView中 - 此API具有类似于重写页面内容的效果(而不是发布“真实”导航)并可能导致奇怪的布局。如果可能,请使用loadData
或loadUrl
。如果这两者都不可行,请在加载实际内容之前调用loadUrl("data:text/html,<body style=\"margin: 0px;\"/>");
(至少等到获得该引导URL的WebViewClient.onPageStarted
回调)。
您可能将高度设置为WRAP_CONTENTS
。这不太可能导致您描述的问题,但最好排除。尝试设置MATCH_PARENT
的宽度和具有固定像素数的高度。