Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/198.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
android webview中用于重定向href链接的回键存在死循环_Android_Mobile_Webview - Fatal编程技术网

android webview中用于重定向href链接的回键存在死循环

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可以正确

在处理重定向链接时,我在Android webview应用程序中遇到了一个带有backkey的死循环

例如,当我的webview启动时,它会转到link0

在link0中,有一个指向link1的href链接。链接1重新定向到链接2

因此,如果我单击link1,它将转到link1,然后重定向到link2。在我的例子中,当我单击backkey时,它应该返回到link0。但是,它会转到link1,然后再次重定向回link2。所以我再也没有机会回去了

如果其他链接不是重定向链接,则backkey可以正确使用

我在谷歌网站上寻找帮助,但并没有找到相关的问题

顺便说一句,backkey在internet浏览器中的工作方式与预期相同。但不是在webview中

下面是我的代码,供您尝试。正如您在代码中所看到的,我尝试了onBackPressed和onKeyDown,但都不起作用

谢谢你的帮助。我在这件事上苦苦挣扎了一段时间

==================================================================================

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