Android 小知识点总汇 (一)

1,688 阅读4分钟

ondraw() 和dispatchdraw()的区别

绘制VIew本身的内容,通过调用View.onDraw(canvas)函数实现

绘制自己的孩子通过dispatchDraw(canvas)实现

View组件的绘制会调用draw(Canvas canvas)方法,draw过程中主要是先画Drawable背景,对 drawable调用setBounds()然后是draw(Canvas c)方法.有点注意的是背景drawable的实际大小会影响view组件的大小,drawable的实际大小通过getIntrinsicWidth()和getIntrinsicHeight()获取,当背景比较大时view组件大小等于背景drawable的大小画完背景后,draw过程会调用onDraw(Canvas canvas)方法,然后就是dispatchDraw(Canvas canvas)方法, dispatchDraw()主要是分发给子组件进行绘制,我们通常定制组件的时候重写的是onDraw()方法。值得注意的是ViewGroup容器组件的绘制,当它没有背景时直接调用的是dispatchDraw()方法, 而绕过了draw()方法,当它有背景的时候就调用draw()方法,而draw()方法里包含了dispatchDraw()方法的调用。因此要在ViewGroup上绘制东西的时候往往重写的是dispatchDraw()方法而不是onDraw()方法,或者自定制一个Drawable,重写它的draw(Canvas c)和 getIntrinsicWidth(),getIntrinsicHeight()方法,然后设为背景。

setFillViewport(true)

使用该参数可以对scrollview不能全屏进行处理,默认情况下scrollview是不会全屏填充,所以显示上面会出现底部空出来导致颜色不一致。使用该参数可以处理改情况。

setWillNotDraw(false)

默认情况下view是会调用ondraw进行绘制,但是在viewgroup及其子类中,默认是不会绘制背景的(这是viewgroup的一个优化措施),如果我们需要让viewgroup可以执行ondraw方法,我们需要将setWillNotDraw设置为false,以取消优化标示,让viewgroup得以绘制ondraw方法。

其他的可以让viewgroup调用ondraw方法的措施,以及viewgroup绘制方法:

1、我们可以为viewgroup添加透明背景,有背景的情况下,viewgroup会强制执行ondraw方法。
2、我们可以使用dispatchdraw方法,默认情况下viewgroup会调用dispatchdraw绘制子view。

android webview 显示html代码,并支持html事件点击

我们使用webview加载部分html5网页的时候,可能会出现一直现实正在加载的白屏情况,这种情况我们需要开启appcache功能。

webView.getSettings().setAppCacheEnabled(true);

以下是常用的webview设置参数

WebView webView = new WebView(context);
webView.setHorizontalScrollBarEnabled(false);
webView.setVerticalScrollBarEnabled(false);
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setPluginState(WebSettings.PluginState.ON);
webView.getSettings().setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NORMAL);
webView.getSettings().setAppCacheEnabled(true);
webView.getSettings().setDomStorageEnabled(true);// 启用localStorage 和 essionStorage
String appCacheDir = context.getApplicationContext().getDir("cache", Context.MODE_PRIVATE).getPath();
webView.getSettings().setAppCachePath(appCacheDir);
webView.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);
webView.getSettings().setAppCacheMaxSize(1024 * 1024 * 10);// 设置缓冲大小,我设的是10M
webView.getSettings().setAllowFileAccess(true);
webView.getSettings().setLoadWithOverviewMode(true);
webView.getSettings().setDatabaseEnabled(true);// 启用Webdatabase数据库
String databaseDir = context.getApplicationContext().getDir("database", Context.MODE_PRIVATE).getPath();
webView.getSettings().setDatabasePath(databaseDir);// 设置数据库路径
webView.getSettings().setGeolocationEnabled(true);// 启用地理定位
webView.getSettings().setGeolocationDatabasePath(databaseDir);// 设置定位的数据库路径
webView.getSettings().setRenderPriority(WebSettings.RenderPriority.HIGH);// 开启插件(对flash的支持)
webView.setScrollBarStyle(View.SCROLLBARS_OUTSIDE_OVERLAY); // 隐藏滚动条
webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);//设置js可以直接打开窗口,如window.open()
webView.getSettings().setJavaScriptEnabled(true);//是否允许执行js,默认为false。设置true时,会提醒可能造成XSS漏洞
webView.getSettings().setSupportZoom(true);//是否可以缩放,默认true
webView.getSettings().setBuiltInZoomControls(true);//是否显示缩放按钮,默认false
webView.getSettings().setUseWideViewPort(true);//设置此属性,可任意比例缩放。大视图模式
webView.getSettings().setLoadWithOverviewMode(true);//和setUseWideViewPort(true)一起解决网页自适应问题
webView.getSettings().setAppCacheEnabled(true);//是否使用缓存
webView.getSettings().setDomStorageEnabled(true);//DOM Storage
webView.getSettings().setUserAgentString("User-Agent:Android");//设置用户代理,一般不用
webView.setWebViewClient(new WebViewClient() {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        Log.d("info", "url : " + url);
        return super.shouldOverrideUrlLoading(view, url);
    }
    @Override
    public void onPageFinished(WebView view, String url) {
        super.onPageFinished(view, url);
    }
    @Override
    public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
        super.onReceivedError(view, errorCode, description, failingUrl);
    }
});
if (drawWebView != null) {
    drawWebView.drawWebView(webView);
}
webView.requestFocus();
webView.loadData(html, "text/html", "utf-8");
webView.loadDataWithBaseURL(null, html, "text/html", "utf-8", null);

使用shouldOverrideUrlLoading方法可以获取用户点击之后,发送的请求url

使用onPageFinished监听页面加载完成

使用onReceivedError监听页面加载失败

html内容反转义

目前没有在android中找到html反转义的方法,只是找到一个转义的方法,并且需要api16之上,所以针对于html反转义,可以使用apache-common-lang包里面的StringEscapeUtils 类进行处理。

2.3手机系统webview调不出来软键盘处理

针对2.3手机系统不能正常调用软键盘,我们可以使用如下方式处理

    @Override
    public void onPageFinished(WebView view, String url) {
        super.onPageFinished(view, url);
        //在页面加载完成之后,让webview获取焦点
        mWebview.requestFocus();
    }

webview 使用post方式提交请求

   String url = "http://..............";
   String reqdata = "passid=" + passid + "&access=" + access_token;
   try {
       reqdata += "&forward=" + URLEncoder.encode(LOAD_URI, "utf-8");
   } catch (UnsupportedEncodingException e) {
       reqdata += "&forward=" + LOAD_URI;
       e.printStackTrace();
   }
   if (mWebview != null) {
       mWebview.postUrl(url, reqdata.getBytes());
   }