2016-01-12 4 views
9

मैं विभिन्न स्रोतों से समाचार सूचीबद्ध करने के लिए Xamarin.Forms का उपयोग करके एक ऐप विकसित कर रहा हूं। मैं समाचार से संबंधित लिंक खोलने के लिए एक वेब व्यू का उपयोग करता हूं। लेकिन वेबपेज को वेब व्यू में लोड करते समय प्रगति दिखाना चाहता हूं, जैसे सफारी ऐप पर प्रगति पट्टी। इस के लिए मैं इस तरह ProgressBar तत्व का इस्तेमाल किया है:डेटा लोड करते समय वेबव्यू की प्रगति कैसे प्राप्त करें, Xamarin.Forms

<StackLayout> 
      <!-- WebView needs to be given height and width request within layouts to render. --> 

      <ProgressBar Progress ="" HorizontalOptions="FillAndExpand" x:Name="progress"/> 
      <WebView x:Name="webView" 
        HeightRequest="1000" 
        WidthRequest="1000" 
        VerticalOptions= "FillAndExpand" 
        Navigating="webOnNavigating" 
        Navigated="webOnEndNavigating"/> 
     </StackLayout> 

और कोड में मैं

void webOnNavigating (object sender, WebNavigatingEventArgs e) 
     { 
      progress.IsVisible = true; 

     } 

     void webOnEndNavigating (object sender, WebNavigatedEventArgs e) 
     { 
      progress.IsVisible = false; 
     } 

का इस्तेमाल किया है लेकिन मैं ही नहीं, इस बात का संकेत भी डेटा लोड हो रहा की प्रगति दिखाना चाहते हैं कि लोड हो रहा है और लोड हो रहा है। मैं चाहता हूं कि उपयोगकर्ता यह जान ले कि डेटा लोड हो रहा है। क्या इसको हासिल करने के लिए कोई रास्ता है।

+0

इसके लिए अंगूठे ऊपर! –

उत्तर

0

कार्यान्वयन कस्टम प्रस्तुतकर्ताओं के माध्यम से प्लेटफार्म विशिष्ट होना चाहिए। सौभाग्य से एसओ पर विभिन्न प्लेटफार्मों के लिए पहले से ही इस विषय पर चर्चा की गई है।

एंड्रॉयड this thread पर आधारित संस्करण:

[assembly: ExportRenderer(typeof(WebView), typeof(GenericWebViewRenderer))] 
namespace WebViewWithProgressBar.Droid 
{ 
    public class GenericWebViewRenderer : WebViewRenderer 
    { 
     Context ctx; 

     public GenericWebViewRenderer(Context context) : base(context) 
     { 
      ctx = context; 
     } 

     protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.WebView> e) 
     { 
      base.OnElementChanged(e); 

      if (Control == null) 
       return; 

      var progressBar = new Android.Widget.ProgressBar(ctx, null, Android.Resource.Attribute.ProgressBarStyleHorizontal); 
      Control.SetWebChromeClient(new MyWebChromeClient(progressBar)); 

      Control.AddView(progressBar); 
     } 

     class MyWebChromeClient : Android.Webkit.WebChromeClient 
     { 
      Android.Widget.ProgressBar progressBar; 

      public MyWebChromeClient(Android.Widget.ProgressBar progressBar) 
      { 
       this.progressBar = progressBar; 
      } 

      public override void OnProgressChanged(Android.Webkit.WebView view, int newProgress) 
      { 
       progressBar.SetProgress(newProgress, true); 
      } 
     } 
    } 
} 

iOS पर यह थोड़ा जटिल काम है, यहाँ एक बहुत ही सरल नकली है कि यह बहुत अच्छी तरह से काम करता है है:

[assembly: ExportRenderer(typeof(WebView), typeof(GenericWebViewRenderer))] 
namespace WebViewWithProgressBar.iOS 
{ 
    public class GenericWebViewRenderer : ViewRenderer<WebView, UIWebView> 
    { 
     protected override void OnElementChanged(ElementChangedEventArgs<WebView> e) 
     { 
      base.OnElementChanged(e); 

      if (Control == null) 
      { 
       var progressBar = new UIProgressView(UIProgressViewStyle.Bar); 
       progressBar.TintColor = UIColor.Green; 
       progressBar.TrackTintColor = UIColor.Black; 
       progressBar.ProgressTintColor = UIColor.Red; 

       var webView = new UIWebView(Frame); 

       webView.AddSubview(progressBar); 

       SetNativeControl(webView); 

       Control.Delegate = new MyUIWebViewDelegate(progressBar); 

       webView.LoadRequest(new NSUrlRequest(new NSUrl("https://google.com"))); 
      } 
     } 

     class MyUIWebViewDelegate : UIWebViewDelegate 
     { 
      UIProgressView progressBar { get; } 

      public MyUIWebViewDelegate(UIProgressView progressBar) 
      { 
       this.progressBar = progressBar; 
      } 

      public override void LoadStarted(UIWebView webView) 
      { 
       progressBar.SetProgress(0.1f, false); 
      } 

      public override void LoadingFinished(UIWebView webView) 
      { 
       progressBar.SetProgress(1.0f, true); 
      } 

      public override void LoadFailed(UIWebView webView, NSError error) 
      { 
       // TODO: 
      } 
     } 
    } 
} 

अधिक जानकारी के लिए कृपया here देखें।

पीएस .: यह कोड उदाहरण github पर उपलब्ध हैं।

संबंधित मुद्दे