2012-08-16 5 views
10

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

例えば、私のwebviewが始まったとき、それはlink0に行きます。 LINK0で

、リンク1とリンクHREFリンクがあります。 Link1をリンク2に修正します。

私はリンク1をクリックするのであれば、それはリンク2にリダイレクトする、その後、リンク1に行きます。バックキーをクリックすると、私の場合はlink0に戻ります。代わりに、リンク1に行きます。リンク1はリンク2にリダイレクトされます。だから私は戻ってくる機会がありません。

リンクがリダイレクトされていない場合、バックキーは他のリンクと正しく動作します。

私はグーグルでヘルプを求めていましたが、関連する質問は見つかりませんでした。

ところで、バックキーは期待どおりインターネットブラウザで動作します。しかし、webviewではありません。

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

これでどこにいたのですか? –

+0

"リダイレクトリンク"とは、JavascriptまたはMETA expiresタグを使用してHTTP 302またはクライアント側リダイレクトを意味しますか? –

答えて

1

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

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

+1

おそらく、同じWebViewでリンクを開き、新しいブラウザのアクティビティを開こうとしないからでしょうか?私はその方法を無効にする通常の理由だと思います。 – Cephron

+0

しかし、彼女はリダイレクトチェーンのすべてのURLに対して新しいナビゲーションを開始しているので、バックアップするときにWebViewが各ナビゲーションを個別に処理することは驚くには当てはまりません。 –

+0

それは面白いです! 「新しいナビゲーションを開始する」とはどういう意味ですか?それはshouldOverrideEtcのmyWebView.loadUrl()コールです。方法?新しいナビゲーションを開始せずにリダイレクトに従う方法はありますか? – Cephron

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

私は同じ問題を抱えていたと、それを解決しました。 ここにmy answerです。

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

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

my answerです。それをチェックしてください! :)

3
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を呼び出せません。

+0

おっと、ありがとう、私はこの問題を抱えていた! 私は、その関数にwebviewをロードすると、基本的にはそのwebviewの履歴をリセットすると思います。 – Damiii

関連する問題