10

リダイレクト リンクを処理しているときに、バックキーを使用して Android webview アプリケーションでデッド ループに陥りました。

たとえば、webview が開始されると、link0 に移動します。

link0 には、link1 にリンクする href リンクがあります。リンク 1 がリンク 2 にリダイレクトされます。

したがって、link1 をクリックすると、link1 に移動し、次に link2 にリダイレクトされます。私の場合、バックキーをクリックするとlink0に戻るはずです。しかし代わりに、リンク 1 に移動し、リンク 2 に再びリダイレクトされます。だから二度と戻る機会はありません。

リダイレクト リンクでない場合、バックキーは他のリンクで正しく機能します。

Web でヘルプを探しましたが、関連する質問が見つかりませんでした。

ちなみに、バックキーはインターネットブラウザで期待通りに動作します。しかし、ウェブビューではありません。

以下は私のコードです。試してみてください。コードでわかるように、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
<?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"
/>
4

4 に答える 4

6
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 を返す必要があります

shouldOverrideUrlLoading では、view.loadUrl を呼び出すことはできません。

于 2015-10-15T12:37:44.633 に答える
1

shouldOverrideUrlLoading()URL ごとに呼び出されます。したがって、http://site1.com/ が http://site2.com/リダイレクトされ、次にhttp://site3.com/にリダイレクトされる場合、これらの URL のそれぞれを呼び出すことになります。したがって、それぞれがバック スタックに表示されます。WebView.loadUrl()

を作成する代わりに、WebViewClientおそらくWebChromeClient. がアクセスするすべての URL に対してではなく、 が新しいウィンドウを作成しようとしているときにのみ呼び出されるWebChromeClientメソッドを定義します。onCreateWindowWebView

于 2013-03-12T01:15:00.573 に答える
1

私は同じ問題を抱えていて、それを解決しましたこれが私の答えです。

最初のリンク (www.new.a) をクリックすると、他のリンク (mobile.new.a) に自動的にリダイレクトされます。通常、リンクは 2 つまたは 3 つのリダイレクトを行いますが、私のソリューションはほぼすべてのリダイレクト リンクで機能しています。この回答が、リンクのリダイレクトに役立つことを願っています。

私はついにそれを理解しました。4 つの API を持つ WebViewClient が必要です。WebViewClient には shouldOverrideUrlLoading()、onPageStarted()、onPageFinished()、および doUpdateVisitedHistory() があります。必要な API はすべて API 1 であるため、心配する必要はありません。

これが私の答えです。それをチェックしてください!:)

于 2014-07-23T01:31:28.997 に答える
0

迷惑なリダイレクトは、バックフォワード履歴に入ります。ユーザーによって 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();
    }
}
于 2014-06-12T17:07:40.857 に答える