Java 无法通过gson将WebBackForwardList从json转换回 第一部分:现在在编辑中解决

Java 无法通过gson将WebBackForwardList从json转换回 第一部分:现在在编辑中解决,java,android,json,webview,gson,Java,Android,Json,Webview,Gson,我正在一个片段中创建一个WebView,它将重新加载当前查看的页面,并在父活动重新启动时维护其历史记录。虽然我找到了一种方法来重新加载当前查看的页面(下面的第二种解决方案),但我仍然在寻找一种方法来维护历史记录 我尝试过的解决方案: :我将restoreState位放在onCreateView中。什么都没有发生,url和历史都没有被保留 @Override public View onCreateView(LayoutInflater inflater, ViewGroup contai

我正在一个片段中创建一个WebView,它将重新加载当前查看的页面,并在父活动重新启动时维护其历史记录。虽然我找到了一种方法来重新加载当前查看的页面(下面的第二种解决方案),但我仍然在寻找一种方法来维护历史记录

我尝试过的解决方案:

:我将restoreState位放在onCreateView中。什么都没有发生,url和历史都没有被保留

   @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    l = inflater.inflate(R.layout.fragment_page_viewer, container, false);
    webView = l.findViewById(R.id.webView);

    webView.getSettings().setJavaScriptEnabled(true);
    webView.setWebViewClient(myWebClient);

    if(savedInstanceState == null) {
        webView.loadUrl(url);
    }else{
        webView.restoreState(savedInstanceState);
    }

    return l;
}

    @Override
public void onSaveInstanceState(Bundle outState){
    webView.saveState(outState);
    super.onSaveInstanceState(outState);
}
第二部分:无法将WebBackForwardList从json转换回 当前位置我试着把这当作一项相当繁重的工作。虽然这种方法对于保留当前网页非常有用,但我无法用它保留WebBackForwardList。我尝试通过gson将WebBackForwardList转换为json文件以放入SharedReferences,但当我尝试将json转换回WebBackForwardList时,我得到:

java.lang.RuntimeException:调用公共android.webkit.WebBackForwardList()失败,无参数

更不用说,我仍然不知道在不重写goBack()和goForward()的情况下如何将保留的WebBackForwardList分配给WebView,而且似乎真的应该有一种更简单的方法

    @Override
public void onStart() {
    super.onStart();
    if(webView != null){
        Context context = getContext();
        SharedPreferences prefs = context.getApplicationContext().getSharedPreferences(context.getPackageName(), Activity.MODE_PRIVATE);

        String s = prefs.getString(URL_KEY, "");

        if (!s.equals(null))
            url = s;

        webView.loadUrl(url);

        gson = new Gson();
        json = prefs.getString(HISTORY_KEY, "");
        if(!json.equals(null)){
            WebBackForwardList history = gson.fromJson(json, WebBackForwardList.class); //LINE ERROR MESSAGE POINTS TO
            String log = history.getItemAtIndex(history.getCurrentIndex()).getUrl();
            Log.d("history", log);
        }

    }
    }

    @Override
public void onStop() {
    super.onStop();


    Context context = getContext();
    SharedPreferences prefs = context.getApplicationContext().getSharedPreferences(context.getPackageName(), Activity.MODE_PRIVATE);

    SharedPreferences.Editor edit = prefs.edit();
    gson = new Gson();
    json = gson.toJson(webView.copyBackForwardList());
    edit.putString(HISTORY_KEY, json);
    edit.putString(URL_KEY, webView.getUrl());
    edit.commit();
}
编辑:
  • 尝试解决方案1的问题是活动代码中的错误
我写过

if(fragmentVar == null){...}
,这在活动重新启动时始终为false,因为变量尚未在活动内部分配。相反,我需要写作

if(fragmentManager.findFragmentById(R.id.page_control) == null){...}
因为片段管理器是保留片段的对象

  • 然而,我仍然被我无法将WebBackForwardList从json转换为json的原因所困扰