Forms Android WebView Renderer

  1 forms 代码
  2
  3 using System;
  4 using Xamarin.Forms;
  5
  6 namespace.Core
  7 {
  8     public class ContentWebView:WebView
  9     {
 10         //private ProgressBar progressbar;
 11
 12         public ContentWebView ()
 13         {
 14
 15         }
 16
 17         public string Url{ get; set;}
 18
 19         public string LocalFile{ get; set;}
 20
 21         public string HtmlStr{ get; set;}
 22
 23         public string Token{ get; set;}
 24
 25
 26
 27
 28         bool android_EnableLongPress=true;
 29         public bool  EnableLongPress {
 30             get {
 31                 return android_EnableLongPress;
 32             }
 33             set {
 34                 android_EnableLongPress = value;
 35             }
 36         }
 37
 38
 39         bool useLoading=false;
 40         public bool UseLoading {
 41             get {
 42                 return useLoading;
 43             }
 44             set {
 45                 useLoading = value;
 46             }
 47         }
 48
 49         bool isFinished=false;
 50         public bool IsFinished {
 51             get {
 52                 return isFinished;
 53             }
 54             set {
 55                 isFinished = value;
 56             }
 57         }
 58
 59         public delegate void LoadFinishedHandler( object sender, EventArgs e );
 60         public event LoadFinishedHandler LoadFinished;
 61
 62         public void RiseloadedEvent()
 63         {
 64             IsFinished = true;
 65             if (LoadFinished!=null) {
 66                 LoadFinished (this, null);
 67             }
 68
 69         }
 70         bool fakeWeChat=false;
 71         public bool FakeWeChat {
 72             get {
 73                 return fakeWeChat;
 74             }
 75             set {
 76                 fakeWeChat = value;
 77             }
 78         }
 79
 80         bool scalesPageToFit;
 81         public bool ScalesPageToFit {
 82             get {
 83                 return scalesPageToFit;
 84             }
 85             set {
 86                 scalesPageToFit = value;
 87             }
 88         }
 89
 90
 91     }
 92 }
 93
 94 284300.png
 95
 96 using System;
 97 using Xamarin.Forms;
 98 using.Core;
 99 using Xamarin.Forms.Platform.Android;
100 using System.Collections.Generic;
101 using Android.Webkit;
102 using Android.Content;
103
104
105 [assembly: ExportRenderer(typeof(ContentWebView), typeof(ContentWebViewRender))]
106 namespace.Core
107 {
108     public class ContentWebViewRender:WebViewRenderer
109     {
110         public ContentWebViewRender ()
111         {
112
113         }
114
115         public class CustomWebViewClient : WebViewClient
116         {
117             ContentWebView t;
118
119             public CustomWebViewClient (ContentWebView self)
120             {
121                 t = self;
122             }
123
124             public override void OnPageFinished (Android.Webkit.WebView view, string url)
125             {
126                 if (t!=null) {
127                     t.RiseloadedEvent ();
128                 }
129                 base.OnPageFinished (view, url);
130
131             }
132         }
133
134         public  override bool OnKeyLongPress(Android.Views.Keycode keyCode, Android.Views.KeyEvent e)
135         {
136             //base.SetOnLongClickListener
137             return true;
138             //base.OnKeyLongPress(keyCode,e);
139         }
140
141         protected override void OnElementChanged (ElementChangedEventArgs<Xamarin.Forms.WebView> e)
142         {
143             base.OnElementChanged (e);
144
145             if (e.OldElement == null) {   // perform initial setup
146                 var t=e.NewElement as ContentWebView ;
147                 //this.Control.SetOnLongClickListener (new LongClickEventArgs);
148                 /*
149                 if (!t.Android_EnableLongPress) {
150
151 //                    this.Control.LongClickable = false;
152 //                    this.LongClick += (o1, e1) => {
153 //
154 //                    };
155
156                     this.SetOnLongClickListener (new longpress ());
157                 }
158                 */
159                 if (t.FakeWeChat) {
160                     this.Control.Settings.UserAgentString = "Mozilla/5.0 AppleWebKit/600.1.4 (KHTML, like Gecko) MicroMessenger/5.4.1 Fake";
161                     //this.Control.Settings.DefaultTextEncodingName = "gb2312";
162
163                 }
164                 this.Control.Settings.DefaultTextEncodingName = "gb2312";
165                 this.Control.SetWebViewClient (new CustomWebViewClient (t));
166                 this.Control.SetWebChromeClient (new CustomChromeClient(t));
167                 this.Control.Settings.JavaScriptEnabled = true;
168
169                 if (string.IsNullOrEmpty (t.Token)) {
170                     if (!string.IsNullOrEmpty (t.Url)) {
171                         this.Control.LoadUrl (t.Url);
172                     } else if (!string.IsNullOrEmpty (t.HtmlStr)) {
173                         this.Control.LoadData (t.HtmlStr, "text/html", "UTF-8");
174
175                     } else if (!string.IsNullOrEmpty (t.LocalFile)) {
176                         this.Control.LoadUrl ("file:///android_asset/" + t.LocalFile);
177                     } else {
178                     }
179
180                 } else {
181                     Dictionary<string, string> headers = new Dictionary<string, string> ();
182                     headers.Add ("Authorization", t.Token);
183                     try {
184                         this.Control.LoadUrl (t.Url, headers);
185                     } catch (Exception ex) {
186                         Console.WriteLine (ex.ToString ());
187                     }
188
189                 }
190                 Control.LongClick += Control_LongClick;
191             }
192         }
193
194         void Control_LongClick (object sender, LongClickEventArgs e)
195         {
196             //do nothing
197         }
198
199
200         protected override void OnElementPropertyChanged (object sender, System.ComponentModel.PropertyChangedEventArgs e)
201         {
202             if (Control != null)
203             {
204                 Control.Settings.BuiltInZoomControls = true;
205                 Control.Settings.DisplayZoomControls = true;
206             }
207             base.OnElementPropertyChanged(sender, e);
208
209         }
210     }
211 }
212
213
214 using System;
215 using System.Diagnostics;
216 using System.Text;
217 using System.Text.RegularExpressions;
218
219 using Xamarin.Forms;
220 using.Core;
221 using Xamarin.Forms.Platform.Android;
222 using System.Collections.Generic;
223
224 using Android.Webkit;
225 using Android.App;
226 using Android.Content;
227
228 namespace.Core
229 {
230     public class CustomChromeClient : WebChromeClient
231     {
232         ContentWebView t;
233         public CustomChromeClient (ContentWebView self)
234         {
235             this.t = self;
236         }
237
238         public override bool OnJsAlert (Android.Webkit.WebView view, string url, string message, JsResult result)
239         {
240              AlertDialog.Builder builder = new AlertDialog.Builder (view.Context);
241             builder.SetTitle ("提示");
242             builder.SetMessage (message);
243             //builder.SetPositiveButton ("确定",new CustomDialogInterfaceOnClickOKListener(result));
244             builder.SetPositiveButton("确定",delegate {
245                 result.Confirm();
246             });
247             //builder.SetOnKeyListener (new CustomDialogInterfaceOnKeyListener());
248             builder.SetCancelable (false);
249             AlertDialog dialog = builder.Create ();
250             dialog.Show ();
251             result.Confirm ();
252             return true;
253             //return base.OnJsAlert(view, url, message, result);
254         }
255
256         public override bool OnJsConfirm (Android.Webkit.WebView view, string url, string message, JsResult result)
257         {
258             AlertDialog.Builder builder = new AlertDialog.Builder (view.Context);
259             builder.SetTitle ("提示")
260                 .SetMessage (message)
261                 .SetPositiveButton ("确定", delegate {
262                     result.Confirm();
263                 })
264                 .SetNeutralButton("取消",delegate {
265                     result.Cancel();
266                 });
267
268             builder.SetOnCancelListener(new CustomDialogInterfaceOnCancelListener(result));
269             builder.SetOnKeyListener(new CustomDialogInterfaceOnKeyListener());
270             AlertDialog dialog = builder.Create();
271             dialog.Show();
272             return true;
273             //return base.OnJsConfirm (view, url, message, result);
274         }
275     }
276 }
277
278 using System;
279 using System.Diagnostics;
280
281 using Xamarin.Forms;
282 using.Core;
283 using Xamarin.Forms.Platform.Android;
284 using System.Collections.Generic;
285 using Android.Webkit;
286
287 namespace.Core
288 {
289     public class CustomClient : WebViewClient
290     {
291         ContentWebView t;
292
293         public CustomClient (ContentWebView self)
294         {
295             t = self;
296         }
297
298         public override void OnPageFinished (Android.Webkit.WebView view, string url)
299         {
300             if (t!=null) {
301                 t.RiseloadedEvent ();
302             }
303             base.OnPageFinished (view, url);
304
305         }
306     }
307 }
308
309 using System;
310 using Xamarin.Forms;
311
312 using Android.Content;
313 using Android.Widget;
314 using Android.App;
315 using Android.Views;
316
317 namespace.Core
318 {
319     public class CustomDialogInterfaceOnCancelListener: Java.Lang.Object,IDialogInterfaceOnCancelListener
320     {
321         Android.Webkit.JsResult result;
322
323         public CustomDialogInterfaceOnCancelListener (Android.Webkit.JsResult self)
324         {
325             result = self;
326         }
327
328         public void OnCancel (IDialogInterface dialog)
329         {
330             result.Cancel ();
331         }
332     }
333 }
334
335 using System;
336 using Xamarin.Forms;
337
338 using Android.Content;
339 using Android.Widget;
340 using Android.App;
341 using Android.Views;
342
343 namespace.Core
344 {
345     public class CustomDialogInterfaceOnKeyListener:Java.Lang.Object,IDialogInterfaceOnKeyListener
346     {
347         public CustomDialogInterfaceOnKeyListener ()
348         {
349         }
350
351         public bool OnKey (IDialogInterface dialog, Keycode keyCode, KeyEvent e){
352             return true;
353         }
354     }
355 }

时间: 2024-10-17 15:56:08

Forms Android WebView Renderer的相关文章

[Chromium] Chromium Android WebView层的设计

Chromium Android WebView是Chromium专为Android WebView提供一个对Content的封装层.从整体上来看可以理解为一个特殊化的Embedder, 功能可以概括为: 1. 对Content和部分Browser Components封装到Java实现,供AOSP WebView调用实现WebView功能. 2. 实现Android WebView使用的单进程渲染架构. 3. 配置网络模块,并实现特定需要的scheme解析. Content作为一个能力提供者,

Android WebView执行GPU命令的过程分析

Android WebView使用的Chromium引擎,虽然没有自己的GPU进程或者线程,但是却可以执行GPU命令.原来,Android WebView会给它提供一个In-Process Command Buffer GL接口.通过这个接口,Chromium引擎就可以将GPU命令提交给App的Render Thread执行.本文接下来就详细分析Android WebView执行GPU命令的过程. 老罗的新浪微博:http://weibo.com/shengyangluo,欢迎关注! 从前面Ch

Android WebView简要介绍和学习计划

我们通常会在App的UI中嵌入WebView,用来实现某些功能的动态更新.在4.4版本之前,Android WebView基于WebKit实现.不过,在4.4版本之后,Android WebView就换成基于Chromium的实现了.基于Chromium实现,使得WebView可以更快更流畅地显示网页.本文接下来就介绍Android WebView基于Chromium的实现原理,以及制定学习计划. 通过前面几个系列文章的学习,我们知道,Chromium的实现是相当复杂的.这种复杂可以体现在编译出

Android WebView启动Chromium渲染引擎的过程分析

Android WebView加载了Chromium动态库之后,就可以启动Chromium渲染引擎了.Chromium渲染引擎由Browser.Render和GPU三端组成.其中,Browser端负责将网页UI合成在屏幕上,Render端负责加载网页的URL和渲染网页的UI,GPU端负责执行Browser端和Render端请求的GPU命令.本文接下来详细分析Chromium渲染引擎三端的启动过程. 老罗的新浪微博:http://weibo.com/shengyangluo,欢迎关注! Andro

Android WebView 开发教程

1.WebView的使用 (a). 创建WebView的实例加入到Activity中 WebView webview = new WebView(this); setContentView(webview); 或者在xml中配置WebView <Webview android:layout_width="match_parent" android:layout_height="match_parent" > </Webview> (b). 访

屏蔽电信流氓广告造成的诡异的问题--Android WebView 长时间不能加载页面

发现在家里的时候用Android App里的WebView打开网站很慢,会有十几秒甚至更长时间的卡住. 但是在电脑上打开同样的网页却很快. 查找这个问题的过程比较曲折,记录下来. 抓取Android网络数据 为了调试这个问题,首先要抓取Android的网络包数据.开始时,是想用Wireshark来抓包的,但是很麻烦,tcpdump在手机要root权限. 于是转换思路,能不能在Android上设置代理,来抓包? 但是fiddler没有linux版本,于是转用BurpSuite了. 设置Androi

Android WebView 输入框键盘不弹出

问题 在Android中使用内嵌的WebView加载HTML网页时,如果html页面中存在输入框.那么在有些手机设备中,当输入框获取焦点时,系统输入法键盘无法正确弹出,从而无法完成正常的输入要求 在做APP时,自己也遇到了这个问题,以下是自己解决的方法,有可能不适合大家所遇到的情况,但值得借鉴~ WebView设置问题 有些时候我们设计的html页面并不能够很好的适应WebView,尤其我们的html页面是为PC浏览器设计的时候,当使用WebView来加载时,界面很可能会发生错乱,当input输

android webview 通过html5播放在线视频 切换大屏

1.添加网络访问权限 <uses-permission android:name="android.permission.INTERNET" /> 2.webview添加全屏支持 developer官方文档关于html5支持视频播放描述如下:In order to support inline HTML5 video in your application, you need to have hardware acceleration turned on, and set

android webview点击返回键返回上一级activity

android webview点击返回键返回上一个activity 1 @Override 2 public boolean onKeyDown(int keyCode, KeyEvent event) { 3 // TODO Auto-generated method stub 4 if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { 5 return true; 6 } 7 return super