android webview中用于重定向href链接的回键存在死循环
在处理重定向链接时,我在Android webview应用程序中遇到了一个带有backkey的死循环 例如,当我的webview启动时,它会转到link0 在link0中,有一个指向link1的href链接。链接1重新定向到链接2 因此,如果我单击link1,它将转到link1,然后重定向到link2。在我的例子中,当我单击backkey时,它应该返回到link0。但是,它会转到link1,然后再次重定向回link2。所以我再也没有机会回去了 如果其他链接不是重定向链接,则backkey可以正确使用 我在谷歌网站上寻找帮助,但并没有找到相关的问题 顺便说一句,backkey在internet浏览器中的工作方式与预期相同。但不是在webview中 下面是我的代码,供您尝试。正如您在代码中所看到的,我尝试了onBackPressed和onKeyDown,但都不起作用 谢谢你的帮助。我在这件事上苦苦挣扎了一段时间 ==================================================================================android webview中用于重定向href链接的回键存在死循环,android,mobile,webview,Android,Mobile,Webview,在处理重定向链接时,我在Android webview应用程序中遇到了一个带有backkey的死循环 例如,当我的webview启动时,它会转到link0 在link0中,有一个指向link1的href链接。链接1重新定向到链接2 因此,如果我单击link1,它将转到link1,然后重定向到link2。在我的例子中,当我单击backkey时,它应该返回到link0。但是,它会转到link1,然后再次重定向回link2。所以我再也没有机会回去了 如果其他链接不是重定向链接,则backkey可以正确
public class MyActivity extends Activity
{
private WebView myWebView;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
myWebView = (WebView) findViewById(R.id.webview);
myWebView.getSettings().setJavaScriptEnabled(true);
myWebView.loadUrl("http://50.112.242.120/temp/");
myWebView.setWebViewClient(new MyWebViewClient());
}
private class MyWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
myWebView.loadUrl(url);
return true;
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// 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;
}
// If it wasn't the Back key or there's no web page history, bubble up to the default
// system behavior (probably exit the activity)
return super.onKeyDown(keyCode, event);
}
}
//main.xml
shouldOverrideUrlLoading()
是基于每个URL调用的。因此,如果重定向到,然后重定向到,您将为每个URL调用WebView.loadUrl()
。因此,每个都出现在后堆栈中
您可能不需要创建
WebViewClient
而需要WebChromeClient
WebChromeClient
定义了一个方法onCreateWindow
,该方法仅在WebView
尝试创建新窗口时调用,而不是为它访问的每个URL调用。恼人的重定向进入反向历史记录。检测用户何时触发url加载,并将其添加到backbackback
private List<String> previous = new ArrayList<String>();
private String mLastUrl;
webview.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
Log.i("DebugDebug", "OnPageFinished " + url);
mLastUrl = url;
super.onPageFinished(view, url);
}
});
webview.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
WebView.HitTestResult hr = ((WebView)view).getHitTestResult();
if (hr != null && mLastUrl != null) {
if (previous.isEmpty() || !previous.get(previous.size() - 1).equals(mLastUrl)) {
previous.add(mLastUrl);
}
Log.i("DebugDebug", "getExtra = " + hr.getExtra() + "\t\t Type = " + hr.getType());
}
return false;
}
});
@Override
public void onBackPressed() {
Log.i("DebugDebug", "onBackPressed");
int size = previous.size();
if (size > 0){
webview.loadUrl(previous.get(size - 1));
previous.remove(size - 1);
} else {
super.onBackPressed();
}
}
private List previous=new ArrayList();
私有字符串mLastUrl;
setWebViewClient(新的WebViewClient(){
@凌驾
公共void onPageFinished(WebView视图,字符串url){
Log.i(“DebugDebug”、“OnPageFinished”+url);
mLastUrl=url;
super.onPageFinished(视图、url);
}
});
webview.setOnTouchListener(新视图.OnTouchListener(){
@凌驾
公共布尔onTouch(视图、运动事件、运动事件){
WebView.HitTestResult hr=((WebView)视图).getHitTestResult();
if(hr!=null&&mLastUrl!=null){
if(previous.isEmpty()| |!previous.get(previous.size()-1).equals(mLastUrl)){
previous.add(mLastUrl);
}
Log.i(“DebugDebug”,“getExtra=“+hr.getExtra()+”\t\t Type=“+hr.getType());
}
返回false;
}
});
@凌驾
public void onBackPressed(){
Log.i(“DebugDebug”、“onBackPressed”);
int size=previous.size();
如果(大小>0){
loadUrl(previous.get(size-1));
先前。移除(尺寸-1);
}否则{
super.onBackPressed();
}
}
我遇到了同样的问题,并解决了它这是。
当我点击第一个链接(www.new.a)时,它会自动重定向其他链接(mobile.new.a)。通常链接重定向两个或三个,我的解决方案已经在几乎每一个重定向链接上得到了应用。我希望这个答案能帮助你注释重定向链接
我终于明白了。您需要一个带有四个API的WebViewClient。WebViewClient中有shouldOverrideUrlLoading()、onPageStarted()、onPageFinished()和doUpdateVisitedHistory()。您需要的所有API都是API1,所以不用担心
给你。看看那个!:)强>
看!!!!重要的shouldOverrideUrlLoading必须返回false
在shouldOverrideUrlLoading中,您不能调用view.loadUrl。这有什么进展吗?当您说“重定向链接”时,您是指HTTP 302还是使用Javascript或META expires标记的客户端重定向?可能是因为他们希望在同一WebView中打开链接,而不是新的浏览器活动?我认为这是覆盖该方法的常见原因。但是,由于她正在为重定向链中的每个URL启动新的导航,因此WebView在备份时单独处理每个导航就不足为奇了。这很有趣!“开始新的导航”是什么意思?这是shouldOverrideEtc中的myWebView.loadUrl()调用。方法?有没有一种方法可以在不启动新导航的情况下执行重定向?与其覆盖WebViewClient.shouldOverrideUrlLoading,不如谦虚地覆盖WebChromeClient.onCreateWindow.onCreateWindow,但有一点沮丧:与其告诉我(或OP)我们可能想做什么,你能简要概述一下你的建议的原因/目的吗?:)谢谢,非常感谢,我遇到了这个问题!所以我想,如果我们将webview加载到该函数中,它将基本上重置该webview的历史记录。
private List<String> previous = new ArrayList<String>();
private String mLastUrl;
webview.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
Log.i("DebugDebug", "OnPageFinished " + url);
mLastUrl = url;
super.onPageFinished(view, url);
}
});
webview.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
WebView.HitTestResult hr = ((WebView)view).getHitTestResult();
if (hr != null && mLastUrl != null) {
if (previous.isEmpty() || !previous.get(previous.size() - 1).equals(mLastUrl)) {
previous.add(mLastUrl);
}
Log.i("DebugDebug", "getExtra = " + hr.getExtra() + "\t\t Type = " + hr.getType());
}
return false;
}
});
@Override
public void onBackPressed() {
Log.i("DebugDebug", "onBackPressed");
int size = previous.size();
if (size > 0){
webview.loadUrl(previous.get(size - 1));
previous.remove(size - 1);
} else {
super.onBackPressed();
}
}
webview.setWebViewClient(new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
Log.i(tag, "url = " + url);
// view.loadUrl(url);
// return super.shouldOverrideUrlLoading(view, url);
return false;
}
});