我的应用程序中有一个WebView,它显示从网页下载的 HTML数据.为什么我只加载 HTML而不是URL?好吧,为了让我允许离线搜索,我下载HTML数据并将其存储在SQL数据库中. 一切运行良好,后续对lo
一切运行良好,后续对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; }
但没有任何反应,只是停留在同一个地方.
作为一个FYI,我在调用loadData()时尝试传递null和一个实际的URL,这就是我现在设置它的方法:
view.loadDataWithBaseURL(mUrl, mHtmlData, SearchUtils.MIME_TYPE, SearchUtils.CHARSET, "");
我读了这个answer,但我希望能有更好的运气.
所以我实际上决定实现我自己的“后退”功能,不确定这是否适用于每个人的意图,但它对我有用.第一,
创建一个ArrayList,它将按时间顺序存储您访问的URL.
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数据.
希望有所帮助!