保存WebView的状态并重新加载位置

10

我知道有很多关于这个问题的提问,但它们似乎都已过时,无法再起作用 - 至少对我来说是这样。我正在尝试在用户退出或重新加载应用程序后保存webview的位置。我知道可以使用以下代码来保存和加载Webview:

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    myWebview.saveState(outState);
}

onCreate中:

if (savedInstanceState != null) {
    myWebview.restoreState(savedInstanceState);
}

但是,在Android开发者Webview页面中,关于saveState的说明如下:

“保存在onSaveInstanceState(Bundle)中使用的此WebView的状态。请注意,该方法不再存储此WebView的显示数据。如果从未调用restoreState(Bundle),则以前的行为可能会泄漏文件。”

链接- https://developer.android.com/reference/android/webkit/WebView.html

如果我错了,这应该是可以工作的,那么可能是我的另一个函数的实现有问题,它保存了在WebView中显示的页面的下拉列表选择,并以非常类似上面所示的方式加载。也许同时使用两个函数不允许加载WebView的位置,只允许加载页面?这是我目前用来保存重新加载应用程序时WebView中加载的HTML页面的代码。

我的onCreate

if (savedInstanceState != null){
    mySpinner.setSelection(prefs.getInt("spinnerSelection", 0));
}

我的onSaveInstanceState

@Override
public void onSaveInstanceState(Bundle savedInstanceState){

    SharedPreferences getPrefs = PreferenceManager.getDefaultSharedPreferences(getActivity().getBaseContext());
    SharedPreferences.Editor editor = getPrefs.edit();

    values = Integer.parseInt(getPrefs.getString("pref_Sections", "1"));
    switch (values) {
        case 1:
            int selectedPosition1 = mySpinner.getSelectedItemPosition();
            editor.putInt("spinnerSelection1", selectedPosition1);
            editor.commit();
            break;
        case 2:
            int selectedPosition2 = mySpinner.getSelectedItemPosition();
            editor.putInt("spinnerSelection2", selectedPosition2);
            editor.commit();
            break;
    }
    super.onSaveInstanceState(savedInstanceState);
}

有人对这个问题有什么反馈吗?还是说它已经不能像Android开发者WebView中描述的那样工作了?我正在考虑一个数学解决方法,但目前这超出了我的专业知识范围,我需要学习更多相关知识(而且我总体上不喜欢数学!)。感谢所有回复!

Webview的位置是什么?它是否与在浏览器上执行url#position相同? - inmyth
用户在网页中阅读内容的深度。我希望保存该位置,并在用户返回应用程序时重新加载。 - user1363871
你能修改这个HTML/Javascript的部分吗?还是只能在客户端/Webview的一侧进行修改? - EpicPandaForce
我对JavaScript不是很有经验,但我可以学习。HTML文件存储在Assets本地。 - user1363871
这可能不是最好的方法,但您可以重写onTouchEvent并跟踪移动,然后使用webview的滚动方法。 - D4rWiNS
谢谢@D4rWiNS,但我希望能有一个更简单的解决方案。对于我想要实现的目标来说,那似乎是一个绕路的方法。 - user1363871
1个回答

6
你可以使用getScrollY()来获取你的webview的垂直位置。在onSaveInstanceState中保存它。
然后,使用scrollTo(x, y)来恢复位置:
 yourWebview.scrollTo(0, savedYPosition);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接