2016-12-12 8 views
0

ウェブページ上の要素からデータを読み込もうとしていますが、間違ったページからデータを取得しているようです。私は同じWebViewの内側と私もこれを上書きOnPageFinishedにShouldOverrideLoadingを使用して、ポップアップを無効にして(「URL2」)webview.loadUrlを呼び出し、そこから、その後webview.loadUrl(「URL1」)Android WebView Xamarimを使用して間違ったページを評価するEvaluateJavasctipt

呼び出す

とOnPageFinished内のそのwebviewでevaluatejavascript( "document.getElementById(id)")を呼び出します。

結果の2番目のURLからデータを取得すると予想されますが、ロードされた最初のURLからデータを取得しています。なぜこれが起こっているのか分かりません。

ありがとうございます!

public override bool ShouldOverrideUrlLoading(WebView view, string url) 
    { 
     return HandleUrlLoading(view,url); 
    } 

    public override bool ShouldOverrideUrlLoading(WebView view, IWebResourceRequest request) 
    { 
     string url = request.Url.ToString(); 
     return HandleUrlLoading(view, url); 
    } 

    private bool HandleUrlLoading(WebView view, string url) 
    { 
     _handleUrlOverride?.Invoke(view, url); 
     return true; // then it is not handled by default action 
    } 

    public void UrlLoading(WebView view, string url) 
    { 
     switch (State) 
     { 
      case State.PlayerlessLobby: 
       _loginView.LoadUrl(url); 
       _progressBar.Visibility = ViewStates.Visible; 
       _lobbyView.Visibility = ViewStates.Invisible; 
       _state = State.Login; 
       break; 
      case State.Lobby: 
       _gameView.LoadUrl(url); 
       _progressBar.Visibility = ViewStates.Visible; 
       _loginView.Visibility = ViewStates.Invisible; 
       _lobbyView.Visibility = ViewStates.Invisible; 
       _state = State.Game; 
       break; 
      case State.Game: 
       break; 
      case State.Login: 
       _loginView.Visibility = ViewStates.Invisible; 
       _progressBar.Visibility = ViewStates.Visible; 
       _loginView.LoadUrl(url); 
       _state = State.Lobby; 
       break; 
     } 
    } 

UrlLoading方法は_loginView iが資格情報を入力し、ログインを打つログインページに続いて、ログインページ

_loginView.LoadUrl(url); 
    _progressBar.Visibility = ViewStates.Visible; 
    _lobbyView.Visibility = ViewStates.Invisible; 
    _state = State.Login; 

をロードしているが起こって何

_handleUrlOverride

に割り当てられています。ログインページはリダイレクトされ、このコードに入ります。

 _loginView.Visibility = ViewStates.Invisible; 
    _progressBar.Visibility = ViewStates.Visible; 
    _loginView.LoadUrl(url); 
    _state = State.Lobby; 

loginViewリダイレクトをロードした後OnPageFinishedこの

var result = new JavaScriptResult(); 
    result.SetCallback(this); 
    _loginView.EvaluateJavascript("document.body.children[0].innerHTML", result); 
    _loginView.Visibility = ViewStates.Visible; 

です。しかし返されたJavaScriptは、最初のページからのdivです。

編集:

私がポップアップ負荷をオーバーライドしていてもいるようだ、と私はwebview.loadUrl(「URL2」)を呼び出していけない場合onPageFinishedはまだこのページのトリガーされます。だから私はそれがオーバーライドされなければならないにもかかわらず、ロードされる理由は分かりません。

+0

あなたの 'ShouldOverrideLoading'のコードを表示してもよろしいですか? –

+0

要求されたコードで更新しました –

答えて

0

あなたのwebviewがURLにナビゲートするときにユーザーアカウントを認証しようとしていると思いますが、このWebサイトがこのような方法でユーザーアカウントとパスワードを使って認証する方法はありますか?あなたはおそらく間違った方向に行きました。

このウェブサイトのカスタマーサイトから、ユーザーは自分のアカウントとパスワードでログインできる可能性がありますが、そのようなアプリを開発する際には、ウェブサイトのログイン開発者の方法に従う必要があります。たとえば、ログイン開発者 "には、Add Facebook Login to Your App or Websiteが表示されます。 official way for android appがあるか、Access Tokenをログインに使用してみることもできますし、Facebookなども利用できます。Manually Build a Login Flowを参照してください。

あなたのウェブサイトに休憩情報がある場合は、WebClientを使用してhttpリクエストを送信し、あなたのウェブサイトから回答を受け取ることができます。

+0

ログインは正常なブラウザで正常に動作し、リダイレクトページが読み込まれます。ログインに問題はありません。 サーバー側では、プレーヤーがログインしてトークンを作成し、生成されたトークンを読み込むためのURLを返します。これはすべて動作し、テストされています。私が見ている問題はリダイレクトのオーバーライドです.Webviewはページをロードすることはありませんが、pagefinishedメソッドには当てはまりますが、ページの内容はまだ古いページではありません。 私はこの特定の問題を解決できませんでしたが、私たちはログインフローがこの問題を回避する方法を変更しました。 –

+0

@DerekLawrence、私はwebviewが普通のブラウザではないことだけを伝えることができます。あなたは 'WebView' [here](https://developer.android.com/reference/android/webkit/WebView.html)の公式ドキュメントを読むことができます。 。 –

+0

@DerekLawrence:Official doc:デフォルトでは、WebViewはブラウザのようなウィジェットを提供せず、JavaScriptを有効にせず、Webページのエラーも無視されます。あなたの目標がUIの一部として一部のHTMLを表示するだけであれば、これはおそらく大丈夫です。ユーザはそれを読むこと以外にウェブページと対話する必要はなく、ウェブページはユーザと対話する必要はない。実際に本格的なWebブラウザが必要な場合は、WebViewで表示するのではなく、URLインテントでブラウザアプリケーションを呼び出すことをお勧めします。 –