2017-02-27 17 views
0

Xamarin.androidのWebviewでSwipeRefreshLayoutを実装しようとしていますが、レイアウトが無限にロードされ続けるのはプログレスバーとしてのみ機能しますが、スワイプしてリフレッシュすると機能しません。私はそれを修正するのを助けてください。スワイプのリフレッシュがxamarin.androidで機能しないwebview

protected override void OnCreate(Bundle savedInstanceState) 
    { 
     base.OnCreate(savedInstanceState); 

     SetContentView(Resource.Layout.gameofthrones); 

     myWebClient = new WebClient(); 







     myWebView = FindViewById<WebView>(Resource.Id.webView); 
     myProgressBar = FindViewById<ProgressBar>(Resource.Id.progressBar); 
     myswipeRefreshLayout = FindViewById<SwipeRefreshLayout>(Resource.Id.refresher); 
     myswipeRefreshLayout.SetColorScheme(Resource.Color.Red, Resource.Color.Orange, 
              Resource.Color.Yellow, Resource.Color.Green, 
              Resource.Color.Blue, Resource.Color.Indigo, 
              Resource.Color.Violet); 
     var toolbar = FindViewById<Toolbar>(Resource.Id.toolbar); 

     myWebView.Settings.JavaScriptEnabled = true; 
     myWebView.LoadUrl("http://www.google.com"); 
     myWebView.SetWebViewClient(myWebClient); 



     //Toolbar will now take on default actionbar characteristics 
     SetSupportActionBar(toolbar); 

     SupportActionBar.Title = "GAME OF THRONES"; 

     SupportActionBar.SetDisplayHomeAsUpEnabled(true); 
     SupportActionBar.SetHomeButtonEnabled(true); 
     myswipeRefreshLayout.Refresh += MyswipeRefreshLayout_Refresh; 


    } 

    private void MyswipeRefreshLayout_Refresh(object sender, EventArgs e) 
    { 

     myWebClient.myOnProgressChanged += (int state) => 
     { 
      if (state == 0) 
      { 
       (sender as SwipeRefreshLayout).Refreshing = false; 
       myswipeRefreshLayout.Refreshing = false; 

       //page loaded no progress bar visible 
       //myProgressBar.Visibility = ViewStates.Invisible; 
      } 
      else 
      { 
       (sender as SwipeRefreshLayout).Refreshing = true; 
       myswipeRefreshLayout.Refreshing = true; 
       //myProgressBar.Visibility = ViewStates.Visible; 
      } 
     }; 
    } 

    public override bool OnKeyDown(Android.Views.Keycode keyCode, Android.Views.KeyEvent e) 
    { 
     if (keyCode == Keycode.Back && myWebView.CanGoBack()) 
     { 
      myWebView.GoBack(); 
      return true; 
     } 

     return base.OnKeyDown(keyCode, e); 
    } 

    public override bool OnOptionsItemSelected(IMenuItem item) 
    { 
     if (item.ItemId == Android.Resource.Id.Home) 
      Finish(); 

     return base.OnOptionsItemSelected(item); 
    } 
} 
    public class WebClient : WebViewClient 
    { 
     public delegate void ToggleProgreeBar(int state); 
     public ToggleProgreeBar myOnProgressChanged; 

     public override bool ShouldOverrideUrlLoading(WebView view, string url) 
     { 
      view.LoadUrl(url); 
      return true; 
     } 

     public override void OnPageStarted(WebView view, string url, Bitmap favicon) 
     { 
      if (myOnProgressChanged != null) 
      { 
       myOnProgressChanged.Invoke(1); 
      } 
      base.OnPageStarted(view, url, favicon); 
     } 
     public override void OnPageFinished(WebView view, string url) 
     { 
      if (myOnProgressChanged != null) 
      { 
       myOnProgressChanged.Invoke(0); 
      } 
      base.OnPageFinished(view, url); 
     } 

答えて

0

SwipeRefreshLayout.Refreshユーザーがスワイプしたときにトリガーされます。

private void SwipeRefresh_Refresh(object sender, System.EventArgs e) 
{ 
     webview.LoadUrl(webview.Url); 
} 

そしてOnCreatemyWebClient.myOnProgressChangedイベントを登録:ユーザーがスワイプ時にあなたの条件によると、手動でのWebViewを更新する必要があります。したがって、コードは次のようになります。

public class MainActivity : Activity 
{ 
    WebView webview; 
    SwipeRefreshLayout mySwipeRefresh; 
    WebClient myWebClient; 
    protected override void OnCreate(Bundle bundle) 
    { 
     base.OnCreate(bundle); 

     // Set our view from the "main" layout resource 
     SetContentView (Resource.Layout.Main); 
     webview = FindViewById<WebView>(Resource.Id.webview); 
     webview.Settings.JavaScriptEnabled = true; 
     webview.LoadUrl("http://www.google.com"); 
     mySwipeRefresh = FindViewById<SwipeRefreshLayout>(Resource.Id.swiperefresh); 
     myWebClient = new WebClient(); 
     //register myOnProgressChanged here 
     myWebClient.myOnProgressChanged += (int state) => 
     { 
      if (state == 0) 
      { 
       mySwipeRefresh.Refreshing = false; 

      } 
      else 
      { 
       mySwipeRefresh.Refreshing = true; 
      } 
     }; 
     webview.SetWebViewClient(myWebClient); 
     mySwipeRefresh.Refresh += SwipeRefresh_Refresh; 
    } 

    private void SwipeRefresh_Refresh(object sender, System.EventArgs e) 
    { 
     //refresh the webview when user swipes. 
     webview.LoadUrl(webview.Url); 
    } 
} 
+0

すばらしい正解に感謝します。それは正常に動作しています。あなたが私のデバイスがインターネット接続を持たず、デフォルトのインターネットアンドロイドページの代わりにトーストを表示したときの対処方法を教えてください。 –

+0

私はその質問のために新しい投稿を作成することを強くお勧めします。 –

関連する問題