我有一个页面,包括WebView。我在清单中有android:configChanges="...|orientation|screenSize"
并且工作得很好:我将视图滚动到特定文本,当屏幕方向改变时,
WebView位于顶部的相同文本(这与保留ScrollY不同,因为
改变宽度)。
现在我改变了设计,并为水平和垂直方向设置了不同的布局。我更愿意删除 'orientation | screenSize'表示当方向改变时允许重建页面的活动。 一切正常,但我需要手动恢复文本偏移。
我能找到的最近的是getOffsetForPosition(getScrollX(), getScrollY())
用于保存偏移和
bringPointIntoView(offset)
用于恢复偏移量,但这些功能不向后兼容:
getOffsetForPosition需要API 3+,而bringPointIntoView需要API 14+(!)。此外,它们适用于TextView,由于HTML标记,可能与WebView不准确。
尝试WebView.saveState
和WebView.restoreState
(在页面加载后调用)。似乎对我不起作用。
是的,我可以使用Paint和FontMetrics计算滚动位置,但这是一个“肮脏的技巧”。理想情况下,我更喜欢从系统中获取所有参数,并尽可能保持代码向后兼容。
答案 0 :(得分:0)
WebView没有很好的Java API:我认为你最好的选择是在JavaScript中做到这一点:
这将有一个段落的粒度。我不确定这是否适合你。如果它没有你运气使用Range [2]而不是找到段落,但我从未尝试过这样做。
[1]基于Get element at specified position - JavaScript
[2]在这里:Range from pixels
[3]您可能想要使用从onConfigurationChanged调用的单独的JavaScript函数,因为如果键盘弹出,也可能会调用window.onresize - 这取决于您的视图层次结构和活动配置
答案 1 :(得分:0)
不幸的是,Javascript似乎不起作用,因为在重新加载HTML页面时,所有存储的信息都将丢失。
自从上一个答案过去差不多1.5个月以来,这里的方式不是100%证明,但是完全可以接受:将相对滚动位置保存为总高度的分数:
private float relPosition;
@Override
public void onCreate(Bundle savedState) {
........
relPosition = savedInstanceState.getFloat("WebViewPos");
.......
}
@Override
public void onSaveInstanceState(Bundle outState) {
outState.putFloat("WebViewPos", (float) webView.getScrollY() / webView.getContextHeight();
}
/* After the page has been loaded */
webView.setScrollY((int)(relPosition * webView.getContextHeight()));
事实上,我没有机会尝试它(只是改变了设计):)