Подтвердить что ты не робот

Мертвая петля в андроидном веб-браузере backkey для перенаправления href link

Я попал в мертвую петлю в приложении Android для веб-браузера с backkey, имея дело с переадресацией ссылок.

Например, когда мой веб-просмотр запущен, он переходит в link0.

В link0 есть ссылка href, которая ссылается на link1. Link1 отредактировать ссылку2.

Итак, если я нажму link1, он перейдет в link1, а затем перенаправит ссылку2. Когда я нажимаю backkey, он должен вернуться к link0, в моем случае. Но вместо этого он переходит к link1, который снова перенаправляется обратно в link2. Поэтому у меня никогда не было шанса вернуться.

Обратный ключ работает правильно с другими ссылками, если они не перенаправляют ссылки.

Я искал веб-страницы для помощи, но не нашел связанных вопросов.

Кстати, backkey работает в интернет-браузере, как и ожидалось. Но не в веб-просмотре.

Ниже мой код, чтобы вы могли попробовать. Как вы можете видеть в коде, я попробовал как 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 history
        if ((keyCode == KeyEvent.KEYCODE_BACK) && myWebView.canGoBack()) {
            myWebView.goBack();
            return true;
        }
        // If it wasn't the Back key or there no web page history, bubble up to the default
        // system behavior (probably exit the activity)
        return super.onKeyDown(keyCode, event);
    }
}

.

// main.xml
<?xml version="1.0" encoding="utf-8"?>
<WebView  xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/webview"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
/>
4b9b3361

Ответ 1

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

смотрите!!!! важно, shouldOverrideUrlLoading должен возвращать false

in shouldOverrideUrlLoading вы не можете вызвать view.loadUrl.

Ответ 2

shouldOverrideUrlLoading() вызывается для каждого URL-адреса. Итак, если http://site1.com/ перенаправляется на http://site2.com/, который затем перенаправляется на http://site3.com/, вы вызываете WebView.loadUrl() для каждого из этих URL. Таким образом, каждый из них появляется в заднем стеке.

Вместо создания WebViewClient вам, вероятно, понадобится WebChromeClient. WebChromeClient определяет метод onCreateWindow, который вызывается только тогда, когда WebView пытается создать новое окно, а не для каждого URL, к которому он обращается.

Ответ 3

У меня была такая же проблема и она была решена. Вот мой ответ.

Когда я нажимаю на первую ссылку (www.new.a), она автоматически перенаправляет другую ссылку (mobile.new.a). Обычно ссылки перенаправляют два или три, и мое решение работает почти на всех ссылках на перенаправление. Я надеюсь, что этот ответ поможет вам с аннулированием перенаправляющих ссылок.

Я, наконец, понял это. Вам нужен WebViewClient с четырьмя API. В WebViewClient должны бытьOverrideUrlLoading(), onPageStarted(), onPageFinished() и doUpdateVisitedHistory(). Все API-интерфейсы, которые вам нужны, это API 1, поэтому не беспокойтесь.

Вот мой ответ. Проверьте это!:)

Ответ 4

Раздражающие переадресации попадают в предысторию. Обнаруживать, когда пользователь загружает загрузку URL-адреса и вместо этого добавляет их обратно.

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