3

I have a WebView in my application that displays HTML data downloaded from a webpage. Why do I load the HTML rather than the URL alone? Well, in order for me to allow offline search, I download the HTML data and store it on an SQL database.

Everything works well, and subsequent calls to loadDataWithBaseUrl() work well, and keep on loading correctly on my WebView, but whenever the user presses the back key, the user is just taken back to the last activity on the stack, rather than going back.

I tried using the following code:

// Check if the key event was the Back button and if there's history
if ((keyCode == KeyEvent.KEYCODE_BACK) && myWebView.canGoBack()) {
    myWebView.goBack();
    return true;
}

But then I tried forcing the WebView to go back, without checking if it could or not, via:

// Check if the key event was the Back button and if there's history
if ((keyCode == KeyEvent.KEYCODE_BACK)) {
    myWebView.goBack();
    return true;
}

but nothing happens, it just stays on the same place.

As an FYI, I've tried passing null and an actual URL when calling loadData(), here's how I have it set right now:

view.loadDataWithBaseURL(mUrl, mHtmlData, SearchUtils.MIME_TYPE, SearchUtils.CHARSET, "");

I read this answer but I am hoping for better luck.

4

4 に答える 4

5

それで、私は実際に独自の「戻る」機能を実装することにしました。これがすべての人の意図に合うかどうかはわかりませんが、私にはうまくいきました。

初め、

ArrayListアクセスした URL を時系列で保存する を作成します。

private ArrayList<String> searchHistory;

初期化からonCreate()

searchHistory = new ArrayList<String>();

これで、URL をロードするたびに、URL 文字列を履歴に追加するだけです:

String mUrl = "www.example.com";
searchHistory.add(mUrl);
mWebView.loadDataWithBaseURL(mUrl,...);

そして、ユーザーが押し戻すと、配列の最も古いエントリを削除し、削除後に残っている最後のエントリをロードすることでそれを処理します:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {     
    if ((keyCode == KeyEvent.KEYCODE_BACK) && searchHistoryPos > 0) {
        Constants.LogMessage("Handling back keyevent");
        //remove eldest entry
        searchHistory.remove(mUrl);
        //make the url-to-load be the latest entry after deletion
        mUrl = searchHistory.get(searchHistory.size);
        //load the new url
        mWebView.loadDataWithBaseURL(mUrl...);
        }
    }

もちろん、loadDataWithBaseUrl を呼び出すときは、プリロードされた HTML データも渡します。

それが役立つことを願っています!

于 2013-02-25T18:43:27.500 に答える
1

別の簡単な解決策は、最初の URL を保存してから、現在の URL と等しいかどうかを確認することです

分野 :

String mFirstUrlLoaded = "";

よりも :

mFirstUrlLoaded = "your first url.....";

よりも :

@Override
public void onBackPressed() {
        if (!mFirstUrlLoaded.equals(mWebView.getUrl())) { 
        mWebView.goBack();
}
于 2014-04-09T13:23:10.897 に答える
0
String mFirstUrlLoaded = "";



mFirstUrlLoaded = "your first url.....";



@Override
public void onBackPressed() {
        if (!mFirstUrlLoaded.equals(mWebView.getUrl())) { 
        mWebView.goBack();
}

これは私のために働く..

于 2015-12-03T18:51:10.810 に答える