使用loadDataWithBaseURL()时webView.canGoBack()无法正常工作

时间:2013-02-19 02:07:49

标签: android html android-webview

我的应用程序中有WebView,显示从网页下载的HTML数据。为什么我只加载HTML而不是URL?好吧,为了让我允许离线搜索,我下载HTML数据并将其存储在SQL数据库中。

一切运作良好,随后对loadDataWithBaseUrl()的调用运行良好,并继续正确加载到我的WebView,但每当用户按下后退键时,用户只会被带回到最后堆栈上的活动,而不是回去。

我尝试使用以下代码:

// 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;
}

然后我尝试强迫WebView返回,而不检查是否可以,通过:

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

但没有任何反应,只是停留在同一个地方。

作为一个仅供参考,我在调用null时尝试传递loadData()和实际网址,以下是我现在设置的方式:

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

我读了这个answer,但我希望能有更好的运气。

4 个答案:

答案 0 :(得分:5)

所以我实际上决定实现我自己的“后退”功能,不确定这是否适用于每个人的意图,但它对我有用。

首先,

创建一个ArrayList,它将按时间顺序存储您访问的网址。

private ArrayList<String> searchHistory;

来自onCreate()初始化它:

searchHistory = new ArrayList<String>();

现在,每次加载网址时,只需将网址字符串添加到历史记录中:

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数据。

希望有所帮助!

答案 1 :(得分:1)

另一个简单的解决方案是保存第一个网址,然后检查是否等于当前网址

字段:

String mFirstUrlLoaded = "";

比:

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

比:

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

答案 2 :(得分:1)

在历史字段中添加第一个链接

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

答案 3 :(得分:0)

String mFirstUrlLoaded = "";



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



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

这对我有用..