我面临WebView
内容滚动位置的问题,这里是:我在纵向模式下将页面向下滑动到一定程度,当我将方向更改为横向时,滚动向上或向下移动。它不显示纵向模式下的确切内容。我确实尝试过在清单文件中进行更改,configChanges="keyboardHidden|orientation|screenSize"
但没有运气。我确实覆盖onConfigurationChanged()
了,但这没有用。我在这个问题中实现了公认的答案,但没有用。有人可以建议必须做什么,为什么它不起作用?这适用于 Google Nexus Tab,所需的最低 SDK 版本为 14。谢谢大家。
3 回答
我记得我的应用程序面临同样的问题。如果我没记错的话,Phil 建议的解决方案不起作用(在某些版本的 Android 上?)。
我现在使用以下方法:
- 在 onSaveInstanceState 中保存 WebView 当前的滚动位置:
outState.putInt(EXTRA_SCROLL_POSITION, webView.getScrollY());
在 onCreate 中,从 savedInstanceState 中获取最后一个滚动位置并设置一个自定义 WebViewClient:
setWebViewClient(new WebViewClient() { @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); if (!scrolled) { postDelayed(new Runnable() { @Override public void run() { scrollBy(0, scroll); } }, 250); scrolled = true; } } });
这很难看,但对我来说有点用(这不考虑当前的缩放级别等)。该代码有很多可以改进的地方,但它基本上可以解决问题。
视图类有一个onSaveInstanceState()
返回 a的方法Parcelable
和一个onRestoreInstanceState(Parcelable state)
恢复状态的方法。如果我没记错的话,保存的状态包括滚动位置。您需要做的就是onSaveInstanceState()
在片段的onSaveInstanceState
方法中保存通过调用 WebView 获得的 Parcelable:
public void onSaveInstanceState(Bundle savedState) {
super.onSaveInstanceState(savedState);
WebView webView = (WebView) findViewById( ... );
savedState.putParcelable("myKey", webView.onSaveInstanceState());
}
然后在您的onCreateView
方法中恢复该状态(如果可用):
public View onCreateView (LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
...
if (savedInstanceState != null) {
WebView webView = (WebView) findViewById( ... );
Parcelable savedState = savedInstanceState.getParcelable("myKey");
if (savedState != null) {
webView.onRestoreInstanceState(savedState);
}
}
....
}
尝试使用onSaveInstanceState来保存滚动视图的状态并在 onRestoreInstanceState方法中恢复。您是否使用过 Scrollview thr xml?如果是,则获取对该视图的引用,当活动恢复时,将滚动视图的位置设置为已保存状态。希望有帮助。