goBack() in WebView goes back ALMOST all the way

旧时模样 提交于 2020-01-05 04:40:32

问题


(EDIT: Maybe I should rephrase the title, but it still describes the behavior correctly. Sometimes when you goBack() to the first URL it loads, and sometimes it doesn't. Even if I do it with loadURL() in onResume! See the code I appended to the Activity at the bottom of the question.)

The back button override works well and goes back through the pages I've visited. Until it should go back to the start URL which loads fine from onCreate. Then I get a small delay and a blank page, instead of the start page I saw before.

Is there some trick to it? Spamming some history array with the same URL more than once in onCreate?

The code is written with answers from this site. This is the entire java file.

package se.avia.tdca;

import se.avia.tdca.R;

import android.app.Activity;
import android.os.Bundle;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Toast;
import android.view.KeyEvent;

public class Inspiration extends Activity {
    Sharedprefs share;
    WebView mywebview;

    @Override
    public void onBackPressed(){    //for < 4

        if (mywebview.canGoBack()) {
            mywebview.goBack();
            mywebview.reload(); //desperate try
            return;
        }
        super.onBackPressed();      
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if ((keyCode == KeyEvent.KEYCODE_BACK) && mywebview.canGoBack()) {
            mywebview.goBack();
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);

        setContentView(R.layout.inspiration);

        share=new Sharedprefs(this);

        mywebview = (WebView) findViewById(R.id.inspiration_webview);

        String url = share.getSubUrl()+"/sources.html";

        mywebview.getSettings().setJavaScriptEnabled(true);
        mywebview.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);    //desperate try
        final Activity activity = this;
        mywebview.setWebChromeClient(new WebChromeClient() {
            public void onProgressChanged(WebView view, int progress) {
                // Activities and WebViews measure progress with different
                // scales.
                // The progress meter will automatically disappear when we reach
                // 100%
                activity.setProgress(progress * 1000);
            }
        });
        mywebview.setWebViewClient(new WebViewClient() {
            public void onReceivedError(WebView view, int errorCode,
                    String description, String failingUrl) {
                Toast.makeText(activity, "Error loading Suppliers list: " + description,
                        Toast.LENGTH_SHORT).show();
            }
        });

        mywebview.loadUrl(url);

    }
}

Edit: I've now added this code to force load the start page when the activity is switched to, not just when it's created and when you go back. This ALSO sometimes doesn't load the start page.

@Override protected void onResume() { super.onResume(); Toast.makeText(getApplicationContext(), "onResume", Toast.LENGTH_SHORT).show(); mywebview.stopLoading(); String url = share.getSubUrl()+"/sources.html"; mywebview.loadUrl(url); }

The toast is shown every time I switch to this activity, but the start page only the first time. All the other times, the page is blank. Do I have to "save" mywebview somehow on onPause()? I just can't see anything wrong with the above code.


回答1:


After rebuilding the activity from the example in the docs, I still got the problem. And also, sometimes it would stop loading after a few lines of html and sometimes after half a screenful.

A single line in the valid CSS for the start page caused the rendering to break without any error message. The page worked fine in Chrome on the same phone, which points to the implementation of WebViews being incomplete in comparison.

Thanks to people answering and sorry for the time wasted. It's just too bad to follow the standards, program correctly, and have bugs trip you up and make a project negatively profitable.

If the Google devs want to patch this or at least trigger an error, the offending line was span:empty {display:none;}



来源:https://stackoverflow.com/questions/20401155/goback-in-webview-goes-back-almost-all-the-way

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!