在方向更改时保留WebView文本偏移

时间:2014-02-19 00:28:30

标签: android webview screen-orientation

我有一个页面,包括WebView。我在清单中有android:configChanges="...|orientation|screenSize"并且工作得很好:我将视图滚动到特定文本,当屏幕方向改变时, WebView位于顶部的相同文本(这与保留ScrollY不同,因为 改变宽度)。

现在我改变了设计,并为水平和垂直方向设置了不同的布局。我更愿意删除 'orientation | screenSize'表示当方向改变时允许重建页面的活动。 一切正常,但我需要手动恢复文本偏移。

我能找到的最近的是getOffsetForPosition(getScrollX(), getScrollY())用于保存偏移和 bringPointIntoView(offset)用于恢复偏移量,但这些功能不向后兼容: getOffsetForPosition需要API 3+,而bringPointIntoView需要API 14+(!)。此外,它们适用于TextView,由于HTML标记,可能与WebView不准确。

尝试WebView.saveStateWebView.restoreState(在页面加载后调用)。似乎对我不起作用。

是的,我可以使用Paint和FontMetrics计算滚动位置,但这是一个“肮脏的技巧”。理想情况下,我更喜欢从系统中获取所有参数,并尽可能保持代码向后兼容。

2 个答案:

答案 0 :(得分:0)

WebView没有很好的Java API:我认为你最好的选择是在JavaScript中做到这一点:

    window.onscroll中的
  • 找到当前段落(为此使用document.elementFromPoint [1])
  • window.onresize中的
  • 滚动到该段落的顶部[3]

这将有一个段落的粒度。我不确定这是否适合你。如果它没有你运气使用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()));

事实上,我没有机会尝试它(只是改变了设计):)