繁体   English   中英

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

[英]Preserve WebView text offset on orientation change

我有一个页面,包括WebView。 我的android:configChanges="...|orientation|screenSize"android:configChanges="...|orientation|screenSize"且运行良好:我将视图滚动到特定文本,并且当屏幕方向发生变化时,WebView会在顶部定位到同一文本(此由于更改了宽度,因此与保留ScrollY不同。

现在,我更改了设计,并为水平和垂直方向设置了不同的布局。 我更喜欢为活动删除“ orientation | screenSize”,以便在方向更改时可以重建页面。 一切正常,但我需要手动恢复文本偏移量。

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

尝试过WebView.saveStateWebView.restoreState (在加载页面后调用)。 似乎不适合我。

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

WebView没有为此提供良好的Java API:我认为最好的选择是使用JavaScript:

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

这将具有一个段落的粒度。 我不确定这是否对您有用。 如果不是这样,那么使用Range [2]而不是查找段落可能会有些运气,但我从未尝试过自己做。

[1]基于指定位置的Get元素-JavaScript
[2]像这里: 像素范围
[3]您可能要使用从onConfigurationChanged调用的单独的JavaScript函数,因为如果弹出键盘,也可能会调用window.onresize-这取决于您的视图层次结构和活动配置

不幸的是,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()));

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM