[转载]前端开发必备!Emmet使用手册 - 月影白牙 - 博客园

mikel阅读(1022)

[转载]前端开发必备!Emmet使用手册 – 月影白牙 – 博客园.

介绍

Emmet (前身为 Zen Coding) 是一个能大幅度提高前端开发效率的一个工具:

基本上,大多数的文本编辑器都会允许你存储和重用一些代码块,我们称之为“片段”。虽然片段能很好地推动你得生产力,但大多数的实现都有这样一个缺点:你必须先定义你得代码片段,并且不能在运行时进行拓展。

Emmet把片段这个概念提高到了一个新的层次:你可以设置CSS形式的能够动态被解析的表达式,然后根据你所输入的缩写来得到相应的内容。Emmet是很成熟的并且非常适用于编写HTML/XML 和 CSS 代码的前端开发人员,但也可以用于编程语言。

使用示例:

在编辑器中输入缩写代码:ul>li*5 ,然后按下拓展键(默认为tab),即可得到代码片段:

复制代码
1 <ul>
2     <li></li>
3     <li></li>
4     <li></li>
5     <li></li>
6     <li></li>
7 </ul>
复制代码

下载和安装

  1. Emmet为大部分流行的编辑器都提供了安装插件,下面是它们的下载链接:
  2. 在线编辑器的支持:
  3. 第三方插件的支持

    下面这些编辑器的插件都是由第三方开发者所提供的,所以可能并不支持所有Emmet的功能和特性。

因为我也是Sublime Text的使用者,所以下面为大家介绍一下sublime text中Emmet的安装方法:

步骤一:首先你需要为sublime text安装Package Control组件:

  1. 按Ctrl+`调出sublime text的console
  2. 粘贴以下代码到底部命令行并回车: import urllib2,os;pf=’Package Control.sublime-package’;ipp=sublime.installed_packages_path();os.makedirs(ipp) if not os.path.exists(ipp) else None;open(os.path.join(ipp,pf),’wb’).write(urllib2.urlopen(‘http://sublime.wbond.net/’+pf.replace(‘ ‘,’%20’)).read())
  3. 重启Sublime Text
  4. 在Perferences->package settings中看到package control,则表示安装成功

步骤二:使用Package Control安装Emmet插件:

  1. 按Ctrl+Shift+P命令板
  2. 输入install然后选择install Package,然后输入emmet找到 Emmet Css Snippets,点击就可以自动完成安装。

使用方法

emmet的使用方法也非常简单,以sublime text为例,直接在编辑器中输入HTML或CSS的代码的缩写,然后按tab键就可以拓展为完整的代码片段。(如果与已有的快捷键有冲突的话,可以自行在编辑器中将拓展键设为其他快捷键)

语法:

后代:>

缩写:nav>ul>li

<nav>
    <ul>
        <li></li>
    </ul>
</nav>

兄弟:+

缩写:div+p+bq

<div></div>
<p></p>
<blockquote></blockquote>

上级:^

缩写:div+div>p>span+em^bq

<div></div>
<div>
    <p><span></span><em></em></p>
    <blockquote></blockquote>
</div>

缩写:div+div>p>span+em^^bq

<div></div>
<div>
    <p><span></span><em></em></p>
</div>
<blockquote></blockquote>

分组:()

缩写:div>(header>ul>li*2>a)+footer>p

复制代码
<div>
    <header>
        <ul>
            <li><a href=""></a></li>
            <li><a href=""></a></li>
        </ul>
    </header>
    <footer>
        <p></p>
    </footer>
</div>
复制代码

缩写:(div>dl>(dt+dd)*3)+footer>p

复制代码
<div>
    <dl>
        <dt></dt>
        <dd></dd>
        <dt></dt>
        <dd></dd>
        <dt></dt>
        <dd></dd>
    </dl>
</div>
<footer>
    <p></p>
</footer>
复制代码

乘法:*

缩写:ul>li*5

复制代码
<ul>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
</ul>
复制代码

自增符号:$

缩写:ul>li.item$*5

复制代码
<ul>
    <li class="item1"></li>
    <li class="item2"></li>
    <li class="item3"></li>
    <li class="item4"></li>
    <li class="item5"></li>
</ul>
复制代码

缩写:h$[title=item$]{Header $}*3

<h1 title="item1">Header 1</h1>
<h2 title="item2">Header 2</h2>
<h3 title="item3">Header 3</h3>

缩写:ul>li.item$$$*5

复制代码
<ul>
    <li class="item001"></li>
    <li class="item002"></li>
    <li class="item003"></li>
    <li class="item004"></li>
    <li class="item005"></li>
</ul>
复制代码

缩写:ul>li.item$@-*5

复制代码
<ul>
    <li class="item5"></li>
    <li class="item4"></li>
    <li class="item3"></li>
    <li class="item2"></li>
    <li class="item1"></li>
</ul>
复制代码

缩写:ul>li.item$@3*5

复制代码
<ul>
    <li class="item3"></li>
    <li class="item4"></li>
    <li class="item5"></li>
    <li class="item6"></li>
    <li class="item7"></li>
</ul>
复制代码

ID和类属性

缩写:#header

<div id="header"></div>

缩写:.title

<div class="title"></div>

缩写:form#search.wide

<form id="search" class="wide"></form>

缩写:p.class1.class2.class3

<p class="class1 class2 class3"></p>

自定义属性

缩写:p[title=”Hello world”]

<p title="Hello world"></p>

缩写:td[rowspan=2 colspan=3 title]

<td rowspan="2" colspan="3" title=""></td>

缩写:[a=’value1′ b=”value2″]

<div a="value1" b="value2"></div>

文本:{}

缩写:a{Click me}

<a href="">Click me</a>

缩写:p>{Click }+a{here}+{ to continue}

<p>Click <a href="">here</a> to continue</p>

隐式标签

缩写:.class

<div class="class"></div>

缩写:em>.class

<em><span class="class"></span></em>

缩写:ul>.class

<ul>
    <li class="class"></li>
</ul>

缩写:table>.row>.col

<table>
    <tr class="row">
        <td class="col"></td>
    </tr>
</table>

HTML

所有未知的缩写都会转换成标签,例如,foo → <foo></foo>

缩写:!

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>

</body>
</html>

缩写:a

<a href=""></a>

缩写:a:link

<a href="http://"></a>

缩写:a:mail

<a href="mailto:"></a>

缩写:abbr

<abbr title=""></abbr>

缩写:acronym

<acronym title=""></acronym>

缩写:base

<base href="" />

缩写:basefont

<basefont />

缩写:br

<br />

缩写:frame

<frame />

缩写:hr

<hr />

缩写:bdo

<bdo dir=""></bdo>

缩写:bdo:r

<bdo dir="rtl"></bdo>

缩写:bdo:l

<bdo dir="ltr"></bdo>

缩写:col

<col />

缩写:link

<link rel="stylesheet" href="" />

缩写:link:css

<link rel="stylesheet" href="style.css" />

缩写:link:print

<link rel="stylesheet" href="print.css" media="print" />

缩写:link:favicon

<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />

缩写:link:touch

<link rel="apple-touch-icon" href="favicon.png" />

缩写:link:rss

<link rel="alternate" type="application/rss+xml" title="RSS" href="rss.xml" />

缩写:link:atom

<link rel="alternate" type="application/atom+xml" title="Atom" href="atom.xml" />

缩写:meta

<meta />

缩写:meta:utf

<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />

缩写:meta:win

<meta http-equiv="Content-Type" content="text/html;charset=windows-1251" />

缩写:meta:vp

<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0" />

缩写:meta:compat

<meta http-equiv="X-UA-Compatible" content="IE=7" />

缩写:style

<style></style>

缩写:script

<script></script>

缩写:script:src

<script src=""></script>

缩写:img

<img src="" alt="" />

缩写:iframe

<iframe src="" frameborder="0"></iframe>

缩写:embed

<embed src="" type="" />

缩写:object

<object data="" type=""></object>

缩写:param

<param name="" value="" />

缩写:map

<map name=""></map>

缩写:area

<area shape="" coords="" href="" alt="" />

缩写:area:d

<area shape="default" href="" alt="" />

缩写:area:c

<area shape="circle" coords="" href="" alt="" />

缩写:area:r

<area shape="rect" coords="" href="" alt="" />

缩写:area:p

<area shape="poly" coords="" href="" alt="" />

缩写:form

<form action=""></form>

缩写:form:get

<form action="" method="get"></form>

缩写:form:post

<form action="" method="post"></form>

缩写:label

<label for=""></label>

缩写:input

<input type="text" />

缩写:inp

<input type="text" name="" id="" />

缩写:input:hidden

别名:input[type=hidden name]

<input type="hidden" name="" />

缩写:input:h

别名:input:hidden

<input type="hidden" name="" />

缩写:input:text, input:t

别名:inp

<input type="text" name="" id="" />

缩写:input:search

别名:inp[type=search]

<input type="search" name="" id="" />

缩写:input:email

别名:inp[type=email]

<input type="email" name="" id="" />

缩写:input:url

别名:inp[type=url]

<input type="url" name="" id="" />

缩写:input:password

别名:inp[type=password]

<input type="password" name="" id="" />

缩写:input:p

别名:input:password

<input type="password" name="" id="" />

缩写:input:datetime

别名:inp[type=datetime]

<input type="datetime" name="" id="" />

缩写:input:date

别名:inp[type=date]

<input type="date" name="" id="" />

缩写:input:datetime-local

别名:inp[type=datetime-local]

<input type="datetime-local" name="" id="" />

缩写:input:month

别名:inp[type=month]

<input type="month" name="" id="" />

缩写:input:week

别名:inp[type=week]

<input type="week" name="" id="" />

缩写:input:time

别名:inp[type=time]

<input type="time" name="" id="" />

缩写:input:number

别名:inp[type=number]

<input type="number" name="" id="" />

缩写:input:color

别名:inp[type=color]

<input type="color" name="" id="" />

缩写:input:checkbox

别名:inp[type=checkbox]

<input type="checkbox" name="" id="" />

缩写:input:c

别名:input:checkbox

<input type="checkbox" name="" id="" />

缩写:input:radio

别名:inp[type=radio]

<input type="radio" name="" id="" />

缩写:input:r

别名:input:radio

<input type="radio" name="" id="" />

缩写:input:range

别名:inp[type=range]

<input type="range" name="" id="" />

缩写:input:file

别名:inp[type=file]

<input type="file" name="" id="" />

缩写:input:f

别名:input:file

<input type="file" name="" id="" />

缩写:input:submit

<input type="submit" value="" />

缩写:input:s

别名:input:submit

<input type="submit" value="" />

缩写:input:image

<input type="image" src="" alt="" />

缩写:input:i

别名:input:image

<input type="image" src="" alt="" />

缩写:input:button

<input type="button" value="" />

缩写:input:b

别名:input:button

<input type="button" value="" />

缩写:isindex

<isindex />

缩写:input:reset

别名:input:button[type=reset]

<input type="reset" value="" />

缩写:select

<select name="" id=""></select>

缩写:option

<option value=""></option>

缩写:textarea

<textarea name="" id="" cols="30" rows="10"></textarea>

缩写:menu:context

别名:menu[type=context]>

<menu type="context"></menu>

缩写:menu:c

别名:menu:context

<menu type="context"></menu>

缩写:menu:toolbar

别名:menu[type=toolbar]>

<menu type="toolbar"></menu>

缩写:menu:t

别名:menu:toolbar

<menu type="toolbar"></menu>

缩写:video

<video src=""></video>

缩写:audio

<audio src=""></audio>

缩写:html:xml

<html xmlns="http://www.w3.org/1999/xhtml"></html>

缩写:keygen

<keygen />

缩写:command

<command />

缩写:bq

别名:blockquote

<blockquote></blockquote>

缩写:acr

别名:acronym

<acronym title=""></acronym>

缩写:fig

别名:figure

<figure></figure>

缩写:figc

别名:figcaption

<figcaption></figcaption>

缩写:ifr

别名:iframe

<iframe src="" frameborder="0"></iframe>

缩写:emb

别名:embed

<embed src="" type="" />

缩写:obj

别名:object

<object data="" type=""></object>

缩写:src

别名:source

<source></source>

缩写:cap

别名:caption

<caption></caption>

缩写:colg

别名:colgroup

<colgroup></colgroup>

缩写:fst, fset

别名:fieldset

<fieldset></fieldset>

缩写:btn

别名:button

<button></button>

缩写:btn:b

别名:button[type=button]

<button type="button"></button>

缩写:btn:r

别名:button[type=reset]

<button type="reset"></button>

缩写:btn:s

别名:button[type=submit]

<button type="submit"></button>

关于更多的HTML以及CSS的缩写请查看:

下载 API表

直击官网文档

特别声明:文中演示代码来自于官网API:http://docs.emmet.io/cheat-sheet/

如需转载,烦请注明出处:http://www.cnblogs.com/WhiteCusp/p/3360468.html

[转载]Mvc下异步断点续传大文件 - min.jiang - 博客园

mikel阅读(1151)

[转载]Mvc下异步断点续传大文件 – min.jiang – 博客园.

最近公司一同事咨询了一个MVC项目下上传大文件时遇到的问题,问题描述如下:

MVC项目中,当上传比较大的文件时,速度非常慢,小文件基本没有影响。

原因分析:

如果是用传统的form表单去提交的话,会将整个文件一次性的加载到内存中然后再做保存,这个过程是相当慢的,特别是大文件,且上传文件容易受到各种因素的影响而导致上传失败,比如临时的网络故障等。

如何解决?

最直接的概念就是异步以及断点续传。

为什么要异步

  1. 如果一个表单提交的元素中有文件上传的需求,如最终因为文件上传失败而影响整个表单数据的提交,这个体验性是非常差的。
  2. 如果上传文件时间特别长,容易使应用程序长时间失去响应,给用户一个错觉,最好的方法是先让用户选择文件,此时点击上传,后台进行文件的异步上 传,此时用户还可以继续去填写其它的表单元素,等用户填写完其它表单元素,文件有可能已经上传完成了,再提交表单,就只处理数据而不再上传文件了。增强了 用户体验性。

为什么要断点续传

在处理大文件时,无法忍受因为一时的网络原因导致上传失败,从而重新再上传的烦恼。好的方法是将一个大文件分成N个小块来进行上传,即使第一次失败 了,之前上传的那部分由于得到了保留,再次点击上传时,以前已经传输成功的部分就不会再次被重新写入文件。注意,第二次上传时,文件还是从0开始传输到服 务器,而不能根据服务器上的文件选择性的传输片断,这部分不太好节省,有兴趣的可以研究下。

如何实现异步上传

这里可以利用JQuery的相应插件来完成,它的主要功能是将文件分割成N多个小块来批量上传,参考网址:https://github.com/blueimp/jQuery-File-Upload

如何实现断点续传

其实这个也非常简单,在Http头信息中有一个Conten-Range的属性,它会说明此次传递的文件内容的片断范围,我们只需要在后台解析这个 范围稍加处理就可以实现。之所这么简单,是因为有了上面的JQuery 上传文件的插件,它负责将一个大文件分成N多小块进行传输,这就有了请求头中的Content-Range。

这篇文章主要参考了http://weblogs.asp.net/bryansampica/archive/2013/01/15/AsyncMVCFileUpload.aspx ,但它没有完成对文件的保存功能,我这里加了断点续传的逻辑。

效果图:

可支持同时上传多个文件

上传成功后的效果

实现关键步骤:

 

  1. 引入jQuery上传文件组件
  2. 初始化上传组件

主要是控制进展条的显示以及组件的部分参数,比如文件块大小等等。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
$(function () {
          $('#fileupload').fileupload({
              dataType: "json",
              url: "/api/upload",
              limitConcurrentUploads: 1,
              sequentialUploads: true,
              progressInterval: 100,
              maxChunkSize: 10000,
              add: function (e, data) {
                  $('#filelistholder').removeClass('hide');
                  data.context = $('<div />').text(data.files[0].name).appendTo('#filelistholder');
                  $('</div><div class="progress"><div class="bar" style="width:0%"></div></div>').appendTo(data.context);
                  $('#btnUploadAll').click(function () {
                      data.submit();
                  });
              },
              done: function (e, data) {
                  data.context.text(data.files[0].name + '... Completed');
                  $('</div><div class="progress"><div class="bar" style="width:100%"></div></div>').appendTo(data.context);
              },
              progressall: function (e, data) {
                  var progress = parseInt(data.loaded / data.total * 100, 10);
                  $('#overallbar').css('width', progress + '%');
              },
              progress: function (e, data) {
                  var progress = parseInt(data.loaded / data.total * 100, 10);
                  data.context.find('.bar').css('width', progress + '%');
              }
          });
      });

 

3.  完成断点续传后台逻辑

  •  首先通过api来配合jQuery上传组件对于上传进展条的一个监控  。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[HttpGet]
[HttpPost]
public HttpResponseMessage Upload()
{
    // Get a reference to the file that our jQuery sent.  Even with multiple files, they will all be their own request and be the 0 index
    HttpPostedFile file = HttpContext.Current.Request.Files[0];
    // do something with the file in this space
    // {....}
    // end of file doing
    this.SaveAs(HttpContext.Current.Server.MapPath("~/Images/") + file.FileName, file);
    // Now we need to wire up a response so that the calling script understands what happened
    HttpContext.Current.Response.ContentType = "text/plain";
    var serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
    var result = new { name = file.FileName };
    
    HttpContext.Current.Response.Write(serializer.Serialize(result));
    HttpContext.Current.Response.StatusCode = 200;
    // For compatibility with IE's "done" event we need to return a result as well as setting the context.response
    return new HttpResponseMessage(HttpStatusCode.OK);
}

 

  • 实现断点续传逻辑

这其中主要是通过解析Http请求头中的Content-Range属性来获知此次处理的文件片断,后续就是基本的文件操作了,没什么可说的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
private void SaveAs(string saveFilePath, HttpPostedFile file)
{
    long lStartPos = 0;
    int startPosition = 0;
    int endPosition = 0;
    var contentRange=HttpContext.Current.Request.Headers["Content-Range"];
    //bytes 10000-19999/1157632
    if (!string.IsNullOrEmpty(contentRange))
    {
        contentRange = contentRange.Replace("bytes", "").Trim();
        contentRange = contentRange.Substring(0, contentRange.IndexOf("/"));
        string[] ranges = contentRange.Split('-');
        startPosition = int.Parse(ranges[0]);
        endPosition = int.Parse(ranges[1]);
    }
    System.IO.FileStream fs;
    if (System.IO.File.Exists(saveFilePath))
    {
        fs = System.IO.File.OpenWrite(saveFilePath);
        lStartPos = fs.Length;
        
    }
    else
    {
        fs = new System.IO.FileStream(saveFilePath, System.IO.FileMode.Create);
        lStartPos = 0;
    }
    if (lStartPos > endPosition)
    {
        fs.Close();
        return;
    }
    else if (lStartPos < startPosition)
    {
        lStartPos = startPosition;
    }
    else if (lStartPos > startPosition && lStartPos < endPosition)
    {
        lStartPos = startPosition;
    }
    fs.Seek(lStartPos, System.IO.SeekOrigin.Current);
    byte[] nbytes = new byte[512];
    int nReadSize = 0;
    nReadSize = file.InputStream.Read(nbytes, 0, 512);
    while (nReadSize > 0)
    {
        fs.Write(nbytes, 0, nReadSize);
        nReadSize = file.InputStream.Read(nbytes, 0, 512);
    }
    fs.Close();          
}

总结:    

jQuery上传组件将大文件分割成小文件上传,正好解决了.net上传文件大小问题,只要将块大小配置好即可。利用Http头信息的Content-Range来实现断点续传,即解决了性能问题也解决了用户体验。

注:

这只是我个人测试的代码,如觉的不妥,可自行修改。

[转载]12套有用的免费 PSD 格式 Android UI 素材 - 梦想天空(山边小溪) - 博客园

mikel阅读(857)

[转载]12套有用的免费 PSD 格式 Android UI 素材 – 梦想天空(山边小溪) – 博客园.

在这里,我们向大家呈现一些有用的和免费的 Android 用户界面 PSD 素材。由于 Android 市场迅速增长,设计人员和开发人员正在寻找一些快速和容易的方法来创建 Android 友好的应用和网站。免费的 PSD 资源可以帮助设计人员和开发人员节省时间和提高工作效率。

对于今天的收集,我们选择了一些有用的和高品质的用户界面 PSD 文件,你可以免费下载。每天数以百万计的移动开发人员创建新的移动应用。PSD文件在设计移动应用程序过程中能够帮助他们很多。有了这样的 PSD 文件,设计特定的元素和重做的设计变得更容易。

您可能感兴趣的相关文章

 

Android GUI Elements

 

Android 2.3.4 GUI PSD

 

Android 4.0+ ICS/JB GUI Design Kits in PSD

 

Android 2.3 GUI

 

Android: Widgets

 

Android 2.0-2.1 GUI

 

Android GUI Set Free Photoshop Files

 

Mobile Phone Icons

 

Android UI PSD

 

Android app website

 

Android 4.0 Ice Cream Sandwich UI

 

Android 4.0 – Yes man

 

[转载]Android 中Activity生命周期分析:Android中横竖屏切换时的生命周期过程 - king-Android,IPhone - 博客园

mikel阅读(777)

[转载]Android 中Activity生命周期分析:Android中横竖屏切换时的生命周期过程 – king-Android,IPhone – 博客园.

最近在面试Android,今天出了一个这样的题目,即如题:

 

我当时以为生命周期是这样的:

onCreate –》 onStart — —》 onResume —》 onPause —》 onStop —》 onRestart —》 onResume —》 onPause —》 onStop

 

回家后我自己在电脑上重新演示了一下,得出了另外的结果,果然是实践出真知啊。 好了,先上代码,给有需要的朋友直接贴代码:

复制代码
package com.king.review.base;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

/**
 * author: king.liu
 * data:2013-10-8 下午8:02:40
 * do:TODO
 */

public class ActivityLife extends Activity {

    public static final String TAG = "ActivityLife";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Log.i(TAG, "onCreate ...");
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.i(TAG, "onStart ...");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.i(TAG, "onRestart ...");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.i(TAG, "onResume ...");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.i(TAG, "onPause ...");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.i(TAG, "onStop ...");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.i(TAG, "onDestory ...");
    }

}
复制代码

既然谈到了Activity问题,那我就完整的来弄一下。

首先程序启动的时候,打印出的log:

10-08 20:32:52.231: I/ActivityLife(1188): onCreate …
10-08 20:32:52.251: I/ActivityLife(1188): onStart …
10-08 20:32:52.251: I/ActivityLife(1188): onResume …

 

即流程是onCreate —>onStart—>onResume.

 

点返回按钮的时候,打印的log:

10-08 20:33:49.282: I/ActivityLife(1188): onPause …
10-08 20:33:50.401: I/ActivityLife(1188): onStop …
10-08 20:33:50.401: I/ActivityLife(1188): onDestory …

流程是:onPause—>onStop—>onDestory

 

综上一个正常的流程就是 :onCreate —>onStart—>onResume–》onPause—>onStop—>onDestory

 

 

再来说说横竖屏切换时的生命周期:

首先启动时:

10-08 20:46:43.811: I/ActivityLife(1188): onCreate …
10-08 20:46:43.831: I/ActivityLife(1188): onStart …
10-08 20:46:43.831: I/ActivityLife(1188): onResume …

生命周期是这样的:onCreate—>onStart—>onResume.

 

然后切换一下:

10-08 20:47:56.551: I/ActivityLife(1188): onPause …
10-08 20:47:56.561: I/ActivityLife(1188): onStop …
10-08 20:47:56.561: I/ActivityLife(1188): onDestory …
10-08 20:47:56.631: I/ActivityLife(1188): onCreate …
10-08 20:47:56.631: I/ActivityLife(1188): onStart …
10-08 20:47:56.651: I/ActivityLife(1188): onResume …

生命周期是这样的:onPause–>onStop—>onDestory—>onCreate—>onStart—>onResume;

 

然后再切换一下屏幕:

10-08 20:49:24.601: I/ActivityLife(1188): onPause …
10-08 20:49:24.601: I/ActivityLife(1188): onStop …
10-08 20:49:24.601: I/ActivityLife(1188): onDestory …
10-08 20:49:24.621: I/ActivityLife(1188): onCreate …
10-08 20:49:24.631: I/ActivityLife(1188): onStart …
10-08 20:49:24.631: I/ActivityLife(1188): onResume …

生命周期是这样:onPause—>onStop—》onDestory—》onCreate—>onStart—>onResume;

 

综上:Android中横竖屏切换时的生命周期是这样的:

onCreate—>onStart—>onResume.–》 onPause—>onStop—》 onDestory—>onCreate—>onCreate—>onStart—>onResume;

onCreate –》 onStart — —》 onResume —》 onPause —》 onStop —》 onRestart —》 onResume —》 onPause —》 onStop

在这里特别要注意一下,当屏幕切换的时候,之前那个屏幕状态就已经销毁了(onDestory),然后在新的屏幕中重新开始一个生命周期:(onCreate–>onStart—>onResume)

 

我犯的错误是,以为之前屏幕生命周期被挂载起来了,然后再重新启动(onRestart)。。。 这种问题比较常见,正好和小伙伴能共享一下。

 

 

 

有些东西会,但不精通,而我现在要做的就是精通,复习回顾,整理自己的框架,举一反三。。。

[转载]了解了这些才能开始发挥jQuery的威力 - 色拉油 - 博客园

mikel阅读(1174)

[转载]了解了这些才能开始发挥jQuery的威力 – 色拉油 – 博客园.

由于当前JQuery如此的如雷贯耳,相信不用介绍什么是JQuery了,公司代码中广 泛应用了JQuery,但我在看一些小朋友的代码时发现一个问题,小朋友们使用的仅仅是jQuery的皮毛,只是使用id选择器与attr方法,还有几个 动画,如果只是如此,相比于其带来的开销,其实还不如不使用,下面介绍几个jQuery常用的方法,来让jQuery的威力发挥出来,否则只用有限的几个 方法,相对于运行速度问题,真不如不用jQuery。

jQuery如此之好用,和其在获取对象时使用与CSS选择器兼容的语法有很大关系,毕竟CSS选择器大家都很熟悉(关于CSS选择器可以看看十分钟搞定CSS选择器),但其强大在兼容了CSS3的选择器,甚至多出了很多。

选择器

有了CSS选择器基础后,看jQuery的选择器就很简单了,不再详细一一说明

基本选择器
$(‘*’) 匹配页面所有元素
$(‘#id’) id选择器
$(‘.class’) 类选择器
$(‘element’) 标签选择器
组合/层次选择器
$(‘E,F’) 多元素选择器,用”,分隔,同时匹配元素E或元素F
$(‘E F’) 后代选择器,用空格分隔,匹配E元素所有的后代(不只是子元素、子元素向下递归)元素F
$(E>F) 子元素选择器,用”>”分隔,匹配E元素的所有直接子元素
$(‘E+F’) 直接相邻选择器,匹配E元素之后相邻同级元素F
$(‘E~F’) 普通相邻选择器(弟弟选择器),匹配E元素之后同级元素F(无论直接相邻与否)
$(‘.class1.class2’) 匹配类名中既包含class1又包含class2的元素
基本过滤选择器
$(“E:first”) 所有E中的第一个
$(“E:last”) 所有E中的最后一个
$(“E:not(selector)”) 按照selector过滤E
$(“E:even”) 所有E中index是偶数
$(“E:odd”) 所有E中index是奇数
$(“E:eq(n)”) 所有E中index为n的元素
$(“E:gt(n)”) 所有E中index大于n的元素
$(“E:ll(n)”) 所有E中index小于n的元素
$(“:header”) 选择h1~h7 元素
$(“div:animated”) 选择正在执行动画效果的元素
内容过滤器
$(‘E:contains(value)’) 内容中包含value值的元素
$(‘E:empty’) 内容为空的元素
$(‘E:has(F)’) 子元素中有F的元素,$(‘div:has(a)’):包含a标签的div
$(‘E: parent’) 父元素是E的元素,$(‘td: parent’):父元素是td的元素
可视化选择器
$(‘E:hidden’) 所有被隐藏的E
$(‘E:visible’) 所有可见的E
属性过滤选择器
$(‘E[attr]’) 含有属性attr的E
$(‘E[attr=value]’) 属性attr=value的E
$(‘E[attr !=value]’) 属性attr!=value的E
$(‘E[attr ^=value]’) 属性attr以value开头的E
$(‘E[attr $=value]’) 属性attr以value结尾的E
$(‘E[attr *=value]’) 属性attr包含value的E
$(‘E[attr][attr *=value]’) 可以连用
子元素过滤器
$(‘E:nth-child(n)’) E的第n个子节点
$(‘E:nth-child(3n+1)’) E的index符合3n+1表达式的子节点
$(‘E:nth-child(even)’) E的index为偶数的子节点
$(‘E:nth-child(odd)’) E的index为奇数的子节点
$(‘E:first-clild’) 所有E的第一个子节点
$(‘E:last-clild’) 所有E的最后一个子节点
$(‘E:only-clild’) 只有唯一子节点的E的子节点
表单元素选择器
$(‘E:type’) 特定类型的input
$(‘:checked’) 被选中的checkbox或radio
$(‘option: selected’) 被选中的option

筛选方法

.find(selector) 查找集合每个元素的子节点

Get the descendants(子节点) of each element in the current set of matched elements, filtered by a selector, jQuery object, or element.

$('li.item-ii').find('li').css('background-color', 'red');

 

.filter(selector) 过滤当前集合内元素

Reduce(减少) the set of matched elements to those that match the selector or pass the function’s test.

$('li').filter(':even').css('background-color', 'red');

基本方法

.ready(handler) 文档加载完成后执行的方法,区别于window.onload

Specify a function to execute when the DOM is fully loaded.

$(document).ready(function() {
  // Handler for .ready() called.
});

 

.each(function(index,element)) 遍历集合内每个元素

Iterate over a jQuery object, executing a function for each matched element.

$("li" ).each(function( index ) {
  console.log( index + ": " + $(this).text() );
});

 

jQuery.extend( target [, object1 ] [, objectN ] ) 合并对象

Merge the contents of two or more objects together into the first object.

var object = $.extend({}, object1, object2);

获取元素

.eq(index) 按index获取jQuery对象集合中的某个特定jQuery对象

Reduce the set of matched elements to the one at the specified index.

.eq(-index) 按逆序index获取jQuery对象集合中的某个特定jQuery对象

  • An integer indicating the position of the element, counting backwards from the last element in the set.
$( "li" ).eq( 2 ).css( "background-color", "red" );

 

.get(index) 获取jQuery集合对象中某个特定index的DOM对象(将jQuery对象自动转换为DOM对象)

Retrieve one of the DOM elements matched by the jQuery object.

console.log( $( "li" ).get( -1 ) );

.get() 将jQuery集合对象转换为DOM集合对象并返回

Retrieve the DOM elements matched by the jQuery object.

console.log( $( "li" ).get() );

 

.index() / .index(selector)/ .index(element) 从给定集合中查找特定元素index

Search for a given element from among the matched elements.

1. 没参数返回第一个元素index

2.如果参数是DOM对象或者jQuery对象,则返回参数在集合中的index

3.如果参数是选择器,返回第一个匹配元素index,没有找到返回-1

var listItem = $( "#bar" );
alert( "Index: " + $( "li" ).index( listItem ) );

 

.clone([withDataAndEvents][,deepWithDataAndEvents]) 创建jQuery集合的一份deep copy(子元素也会被复制),默认不copy对象的shuju和绑定事件

Create a deep copy of the set of matched elements.

$( ".hello" ).clone().appendTo( ".goodbye" );

 

.parent([selector]) 获取jQuery对象符合selector的元素

Get the parent of each element in the current set of matched elements, optionally filtered by a selector.

$( "li.item-a" ).parent('ul').css( "background-color", "red" );

 

.parents([selector]) 获取jQuery对象符合选择器的祖先元素

Get the ancestors of each element in the current set of matched elements, optionally filtered by a selector.

$( "span.selected" ) .parents( "div" ) .css( "border", "2px red solid" )

插入元素

.append(content[,content]) / .append(function(index,html)) 向对象尾部追加内容

Insert content, specified by the parameter, to the end of each element in the set of matched elements.

1. 可以一次添加多个内容,内容可以是DOM对象、HTML string、 jQuery对象

2. 如果参数是function,function可以返回DOM对象、HTML string、 jQuery对象,参数是集合中的元素位置与原来的html值

$( ".inner" ).append( "<p>Test</p>" );
$( "body" ).append( $newdiv1, [ newdiv2, existingdiv1 ] );
$( "p" ).append( "<strong>Hello</strong>" );
$( "p" ).append( $( "strong" ) );
$( "p" ).append( document.createTextNode( "Hello" ) );

 

.appendTo(target) 把对象插入到目标元素尾部,目标元素可以是selector, DOM对象, HTML string, 元素集合,jQuery对象;

Insert every element in the set of matched elements to the end of the target.

$( "h2" ).appendTo( $( ".container" ) );
$( "<p>Test</p>" ).appendTo( ".inner" );

 

.prepend(content[,content]) / .prepend(function(index,html)) 向对象头部追加内容,用法和append类似

Insert content, specified by the parameter, to the beginning of each element in the set of matched elements.

$( ".inner" ).prepend( "<p>Test</p>" );

 

.prependTo(target) 把对象插入到目标元素头部,用法和prepend类似

Insert every element in the set of matched elements to the beginning of the target.

$( "<p>Test</p>" ).prependTo( ".inner" );

 

.before([content][,content]) / .before(function) 在对象前面(不是头部,而是外面,和对象并列同级)插入内容,参数和append类似

Insert content, specified by the parameter, before each element in the set of matched elements.

$( ".inner" ).before( "<p>Test</p>" );
$( ".container" ).before( $( "h2" ) );
$( "p" ).first().before( newdiv1, [ newdiv2, existingdiv1 ] );
$( "p" ).before( "<b>Hello</b>" );
$( "p" ).before( document.createTextNode( "Hello" ) );

 

.insertBefore(target) 把对象插入到target之前(同样不是头部,是同级)

Insert every element in the set of matched elements before the target.

$( "h2" ).insertBefore( $( ".container" ) );

 

.after([content][,content]) / .after(function(index)) 和before相反,在对象后面(不是尾部,而是外面,和对象并列同级)插入内容,参数和append类似

Insert content, specified by the parameter, after each element in the set of matched elements.

$( ".inner" ).after( "<p>Test</p>" );
$( "p" ).after( document.createTextNode( "Hello" ) );

 

.insertAfter(target) 和insertBefore相反,把对象插入到target之后(同样不是尾部,是同级)

Insert every element in the set of matched elements after the target.

$( "<p>Test</p>" ).insertAfter( ".inner" );
$( "p" ).insertAfter( "#foo" );

包裹元素

.wrap(wrappingElement) / .wrap(function(index)) 为每个对象包裹一层HTML结构,可以是selector, element, HTML string, jQuery object

Wrap an HTML structure around each element in the set of matched elements.

<div class="container">
  <div class="inner">Hello</div>
  <div class="inner">Goodbye</div>
</div>
$( ".inner" ).wrap( "<div class='new'></div>" );
复制代码
<div class="container">
  <div class="new">
    <div class="inner">Hello</div>
  </div>
  <div class="new">
    <div class="inner">Goodbye</div>
  </div>
</div>
复制代码

 

.wrapAll(wrappingElement) 把所有匹配对象包裹在同一个HTML结构中

Wrap an HTML structure around all elements in the set of matched elements.

<div class="container">
  <div class="inner">Hello</div>
  <div class="inner">Goodbye</div>
</div>
$( ".inner" ).wrapAll( "<div class='new' />");
<div class="container">
  <div class="new">
    <div class="inner">Hello</div>
    <div class="inner">Goodbye</div>
  </div>
</div>

 

.wrapInner(wrappingElement) / .wrapInner(function(index)) 包裹匹配元素内容,这个不好说,一看例子就懂

Wrap an HTML structure around the content of each element in the set of matched elements.

<div class="container">
  <div class="inner">Hello</div>
  <div class="inner">Goodbye</div>
</div>
$( ".inner" ).wrapInner( "<div class='new'></div>");
复制代码
<div class="container">
  <div class="inner">
    <div class="new">Hello</div>
  </div>
  <div class="inner">
    <div class="new">Goodbye</div>
  </div>
</div>
复制代码

.unwap() 把DOM元素的parent移除

Remove the parents of the set of matched elements from the DOM, leaving the matched elements in their place.

pTags = $( "p" ).unwrap();

属性方法

.val() 获取元素的value值

Get the current value of the first element in the set of matched elements.

$( "input:checkbox:checked" ).val();

.val(value) /.val(function(index,value)) 为元素设置值,index和value同样是指在为集合中每个元素设置的时候该元素的index和原value值

Set the value of each element in the set of matched elements.

$( "input" ).val( ‘hello’ );
$( "input" ).on( "blur", function() {
  $( this ).val(function( i, val ) {
    return val.toUpperCase();
  });
});

 

.attr(attributeName) 获取元素特定属性的值

Get the value of an attribute for the first element in the set of matched elements.

var title = $( "em" ).attr( "title" );

.attr(attributeName,value) / .attr(attributesJson) / .attr( attributeName, function(index, attr) ) 为元素属性赋值

Set one or more attributes for the set of matched elements.

复制代码
$( "#greatphoto" ).attr( "alt", "Beijing Brush Seller" );

$( "#greatphoto" ).attr({
  alt: "Beijing Brush Seller",
  title: "photo by Kelly Clark"
});

$( "#greatphoto" ).attr( "title", function( i, val ) {
  return val + " - photo by Kelly Clark";
});
复制代码

 

.prop( propertyName ) 获取元素某特性值

Get the value of a property for the first element in the set of matched elements.

$( elem ).prop( "checked" )

.prop(propertyName,value) / .prop(propertiesJson) / .prop(propertyName,function(index,oldPropertyValue)) 为元素特性赋值

Set one or more properties for the set of matched elements.

复制代码
$( "input" ).prop( "checked", true );

$( "input[type='checkbox']" ).prop( "checked", function( i, val ) {
  return !val;
});

$( "input[type='checkbox']" ).prop({
  disabled: true
});
复制代码

关于attribute 和 property区别可以看看 jQuery的attr与prop

 

.data(key,value) / .value(json) 为HTML DOM元素添加数据,HTML5元素 已有data-*属性

Store arbitrary data associated with the matched elements.The .data() method allows us to attach data of any type to DOM elements in a way that is safe from circular references and therefore from memory leaks.

$( "body" ).data( "foo", 52 );
$( "body" ).data( "bar", { myType: "test", count: 40 } );
$( "body" ).data( { baz: [ 1, 2, 3 ] } );

 

.data(key) / .data() 获取获取data设置的数据或者HTML5 data-*属性中的数据

Return the value at the named data store for the first element in the jQuery collection, as set by data(name, value) or by an HTML5 data-* attribute.

alert( $( "body" ).data( "foo" ) );
alert( $( "body" ).data() );

alert( $( "body" ).data( "foo" ) ); // undefined
$( "body" ).data( "bar", "foobar" );
alert( $( "body" ).data( "bar" ) ); // foobar

CSS方法

.hasClass(calssName) 检查元素是否包含某个class,返回true/false

Determine whether any of the matched elements are assigned the given class.

$( "#mydiv" ).hasClass( "foo" )

 

.addClass(className) / .addClass(function(index,currentClass)) 为元素添加class,不是覆盖原class,是追加,也不会检查重复

Adds the specified class(es) to each of the set of matched elements.

$( "p" ).addClass( "myClass yourClass" );

$( "ul li" ).addClass(function( index ) {
  return "item-" + index;
});

 

removeClass([className]) / ,removeClass(function(index,class)) 移除元素单个/多个/所有class

Remove a single class, multiple classes, or all classes from each element in the set of matched elements.

$( "p" ).removeClass( "myClass yourClass" );

$( "li:last" ).removeClass(function() {
  return $( this ).prev().attr( "class" );
});

 

.toggleClass(className) /.toggleClass(className,switch) /  .toggleClass([switch]) / .toggleClass( function(index, class, switch) [, switch ] ) toggle是切换的意思,方法用于切换,switch是个bool类型值,这个看例子就明白

Add or remove one or more classes from each element in the set of matched elements, depending on either the class’s presence or the value of the switch argument.

<div class="tumble">Some text.</div>

第一次执行

$( "div.tumble" ).toggleClass( "bounce" )
<div class="tumble bounce">Some text.</div>

第二次执行

$( "div.tumble" ).toggleClass( "bounce" )
<div class="tumble">Some text.</div>

 

复制代码
$( "#foo" ).toggleClass( className, addOrRemove );

// 两种写法意思一样

if ( addOrRemove ) {
  $( "#foo" ).addClass( className );
} else {
  $( "#foo" ).removeClass( className );
}
复制代码

 

复制代码
$( "div.foo" ).toggleClass(function() {
  if ( $( this ).parent().is( ".bar" ) ) {
    return "happy";
  } else {
    return "sad";
  }
});
复制代码

 

.css(propertyName) / .css(propertyNames) 获取元素style特定property的值

Get the value of style properties for the first element in the set of matched elements.

var color = $( this ).css( "background-color" );

 var styleProps = $( this ).css([
    "width", "height", "color", "background-color"
  ]);

.css(propertyName,value) / .css( propertyName, function(index, value) ) / .css( propertiesJson ) 设置元素style特定property的值

Set one or more CSS properties for the set of matched elements.

复制代码
$( "div.example" ).css( "width", function( index ) {
  return index * 50;
});

$( this ).css( "width", "+=200" );

$( this ).css( "background-color", "yellow" );

   $( this ).css({
      "background-color": "yellow",
      "font-weight": "bolder"
    });
复制代码

 

事件方法

.bind( eventType [, eventData ], handler(eventObject) ) 绑定事件处理程序,这个经常用,不多解释

Attach a handler to an event for the elements.

$( "#foo" ).bind( "click", function() {
  alert( "User clicked on 'foo.'" );
});

.delegate( selector, eventType, handler(eventObject) ) 这个看官方解释吧

Attach a handler to one or more events for all elements that match the selector, now or in the future, based on a specific set of root elements.

$( "table" ).on( "click", "td", function() {//这样把td的click事件处理程序绑在table上
  $( this ).toggleClass( "chosen" );
});

.on( events [, selector ] [, data ], handler(eventObject) ) 1.7后推荐使用,取代bind、live、delegate

Attach an event handler function for one or more events to the selected elements.

$( "#dataTable tbody" ).on( "click", "tr", function() {
  alert( $( this ).text() );
});

关于bind、live、delegate、on的区别可以看看 jQuery三种事件绑定方式.bind(),.live(),.delegate()

 

.trigger( eventType [, extraParameters ] ) JavaScript出发元素绑定事件

Execute all handlers and behaviors attached to the matched elements for the given event type.

$( "#foo" ).trigger( "click" );

 

.toggle( [duration ] [, complete ] ) / .toggle( options ) 隐藏或显示元素

Display or hide the matched elements.

$( ".target" ).toggle();
$( "#clickme" ).click(function() {
  $( "#book" ).toggle( "slow", function() {
    // Animation complete.
  });
});

动画/Ajax

这两部分内容比较多,不是简单的一个function就可以的,这里只是列举一下常用方法名,关于其使用可以看看 jQuery API animation ajax ,或者 jQuery的动画处理总结ASP.NET 使用Ajax

动画

queue/dequeue/clearQueue

delay/stop

fadeIn/fadeOut/fadeTo/fadeToggle

slideUp/slideDown/slideToggle

show/hide

 

Ajax

$.ajax

$.load

$.get

最后

了解了上面这些内容,使用jQuery进行web开发的时候就可以体验到jQuery的威力了。本文不是jQuery学习指南,仅仅是个常用方法介绍,如果大家想学习jQuery,最好的教材还是jQuery API,本文中示例与英文解释全部来源于jQuery API。 另外文中介绍内容远远不是jQuery全部,但是首先掌握了这些可以对jQuery有一个比较全面的认识,然后再学习其他内容的时候就可以游刃有余了。

[转载]Android百度地图开发环境搭建 - 若。只如初见 - 博客园

mikel阅读(927)

[转载]1。Android百度地图开发环境搭建 – 若。只如初见 – 博客园.

1.百度地图官方API文档下载

版本  使用说明 下载
Android SDK
通用资源下载
《离线地图》提供新版离线地图(百度矢量地图)与旧版离线地图(百度栅格地图)下载。

备注:

离线地图
Android SDKv2.2.0
(矢量地图版)
1. 若需使用Android SDK,请先下载对应版本的lib库,在Android工程中引用jar和so文件。

2. 该版本SDK提供矢量版地图。

3. Lib库和示例代码下载包中均含有readme.txt,可阅读参考,有助您的开发。

4. 若使用离线地图,请下载矢量版离线地图。注意:请参阅开发指南_离线地图说明,导入至BaiduMapSdk文件夹。

5. 注意:自v2.1.3版本起,SDK采用了全新的Key验证体系,如果您选择使用v2.1.3及以后的版本,需申请全新的Key。(点击查看申请流程

Android SDKv2.2.0 lib库

Android SDKv2.2.0 类参考

Android SDKv2.2.0 示例代码

 全部下载  

Android SDKv1.3.5
(栅格地图版)
若需使用Android SDK,请先下载对应版本的lib库,在Android工程中引用jar和so文件。

该版本提供栅格版底图。

 Android SDKv1.3.5 lib库

Android SDKv1.3.5 类参考

Android SDKv1.3.5 示例代码

Android SDKv1.3.5开发指南

 全部下载

2.申请密钥key

http://developer.baidu.com/map/android-mobile-apply-key.htm

3.建立项目

4.导入jar包

将实例中的libs文件夹拷贝到项目中,然后选中baidumapapi.jar,右键–〉build path–>add to build path

5.在activity_main.xml中添加一个view用来显示地图

复制代码
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <!-- 添加显示地图的控件 -->

    <com.baidu.mapapi.MapView
        android:id="@+id/bmapView"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:clickable="true" />

</LinearLayout>
复制代码

6.编写MainActivity.java对功能进行实现

复制代码
package com.arlen.baidu_hello;

import android.os.Bundle;
import android.view.Menu;
import android.widget.Toast;

import com.baidu.mapapi.BMapManager;
import com.baidu.mapapi.GeoPoint;
import com.baidu.mapapi.MKGeneralListener;
import com.baidu.mapapi.MapActivity;
import com.baidu.mapapi.MapController;
import com.baidu.mapapi.MapView;

public class MainActivity extends MapActivity {

    // 添加百度地图的相关控件
    private MapView mapView;
    private BMapManager bMapManager; // 加载地图的引擎
    // 百度地图的key
    private String keyString = "43D220AAB0DEC976D2EABC83CFC9EEE52BCCCA7A";
    // 在百度地图上添加一些空间,比如放大或者缩小
    private MapController mapComtroller;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mapView = (MapView) findViewById(R.id.bmapView);
        bMapManager = new BMapManager(MainActivity.this);

        // 必须要加载key
        bMapManager.init(keyString, new MKGeneralListener() {
            @Override
            public void onGetPermissionState(int arg0) {
                // TODO Auto-generated method stub
                if (arg0 == 300) {
                    Toast.makeText(MainActivity.this, "输入的key有误,请核实!", 1)
                            .show();
                }
            }

            @Override
            public void onGetNetworkState(int arg0) {
                // TODO Auto-generated method stub

            }
        });

        this.initMapActivity(bMapManager);
        mapView.setBuiltInZoomControls(true); // 表示可以设置缩放功能
        mapComtroller = mapView.getController();
        // 需要定义一个经纬度
        GeoPoint geoPoint = new GeoPoint((int) (39.915 * 1E6),
                (int) (116.404 * 1E6));
        // 设置一个中心点
        mapComtroller.setCenter(geoPoint);
        // 设置缩放级别
        mapComtroller.setZoom(12);

    }

    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();

        if (bMapManager != null) {
            bMapManager.destroy();
            bMapManager = null;
        }
    }

    @Override
    protected void onResume() {
        // TODO Auto-generated method stub
        super.onResume();

        if (bMapManager != null) {
            bMapManager.start();
        }
    }

    @Override
    protected void onPause() {
        // TODO Auto-generated method stub
        super.onPause();
        if (bMapManager != null) {
            bMapManager.stop();
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    protected boolean isRouteDisplayed() {
        // TODO Auto-generated method stub
        return false;
    }

}
复制代码

7.修改AndroidManifest.xml文件,指定用户权限及对不同屏幕的支持

复制代码
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.arlen.baidu_hello"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.arlen.baidu_hello.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" >
    </uses-permission>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" >
    </uses-permission>
    <uses-permission android:name="android.permission.INTERNET" >
    </uses-permission>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" >
    </uses-permission>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" >
    </uses-permission>
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" >
    </uses-permission>
    <uses-permission android:name="android.permission.READ_PHONE_STATE" >
    </uses-permission>
    <uses-permission android:name="android.permission.CALL_PHONE" >
    </uses-permission>

    <supports-screens
        android:anyDensity="true"
        android:largeScreens="true"
        android:normalScreens="false"
        android:resizeable="true"
        android:smallScreens="true" />

</manifest>
复制代码

8.至此,所有的工作基本完成,下面是运行效果图:

模拟器:

真机测试:

[转载]XPath 教程 - 刚刚.Net相关知识技术互动平台(粉色回忆) - 博客频道 - CSDN.NET

mikel阅读(746)

[转载]XPath 教程 – 刚刚.Net相关知识技术互动平台(粉色回忆) – 博客频道 – CSDN.NET.

概述

XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历。

XPath 是 W3C XSLT 标准的主要元素,并且 XQuery 和 XPointer 同时被构建于 XPath 表达之上。

因此,对 XPath 的理解是很多高级 XML 应用的基础。

XPath 参考手册

在 W3School,我们提供完整的 XPath 2.0、XQuery 1.0 和 XSLT 2.0 的内置函数参考手册。

内容目录

XPath 简介
本章讲解 XPath 的概念。
XPath 节点
本章详细介绍 XPath 中不同类型的节点,以及节点之间的关系。
XPath 语法
本章讲解 XPath 的语法。
XPath 轴
本章讲解 XPath axes(轴)。
XPath 运算符
本章列出了可以用于 XPath 表达式的运算符。
XPath 实例
本章使用 “books.xml” 文档来演示一些 XPath 实例。
XPath 摘要
本文内容包括在本教程所学知识的一个总结,以及我们向你推荐的下一步应该学习的内容。  

XPath 简介

XPath 是一门在 XML 文档中查找信息的语言。XPath 用于在 XML 文档中通过元素和属性进行导航。

在学习之前应该具备的知识:

在您继续学习之前,应该对下面的知识有基本的了解:

  • HTML / XHTML
  • XML / XML 命名空间

如果您希望首先学习这些项目,请在我们的 首页 访问这些教程。

什么是 XPath?

  • XPath 使用路径表达式在 XML 文档中进行导航
  • XPath 包含一个标准函数库
  • XPath 是 XSLT 中的主要元素
  • XPath 是一个 W3C 标准

XPath 路径表达式

XPath 使用路径表达式来选取 XML 文档中的节点或者节点集。这些路径表达式和我们在常规的电脑文件系统中看到的表达式非常相似。

XPath 标准函数

XPath 含有超过 100 个内建的函数。这些函数用于字符串值、数值,日期和时间比较、节点和 QName 处理、序列处理、逻辑值等等。

XPath 在 XSLT 中使用

XPath 是 XSLT 标准中的主要元素。如果没有 XPath 方面的知识,您就无法创建 XSLT 文档。

您可以在我们的《XSLT 教程》中阅读更多的内容。

XQuery 和 XPointer 均构建于 XPath 表达式之上。XQuery 1.0 和 XPath 2.0 共享相同的数据模型,并支持相同的函数和运算符。

您可以在我们的《XQuery 教程》中阅读更多有关 XQuery 的知识。

XPath 是 W3C 标准

XPath 于 1999年11月16日 成为 W3C 标准。

XPath 被设计供 XSLT、XPointer 以及其他 XML 解析软件使用。

您可以在我们的《W3C 教程》中阅读更多有关 XPath 标准的信息。

XPath 节点

在 XPath 中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档节点(或成为根节点)。

XPath 术语

节点(Node)

在 XPath 中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点。XML 文档是被作为节点树来对待的。树的根被称为文档节点或者根节点。

请看下面这个 XML 文档:

<?xml version="1.0" encoding="ISO-8859-1"?>

<bookstore>

<book>
  <title lang="en">Harry Potter</title>
  <author>J K. Rowling</author> 
  <year>2005</year>
  <price>29.99</price>
</book>

</bookstore>

上面的XML文档中的节点例子:

<bookstore> (文档节点)
<author>J K. Rowling</author> (元素节点)
lang="en" (属性节点)

基本值(或称原子值,Atomic value)

基本值是无父或无子的节点。

基本值的例子:

J K. Rowling
"en"

项目(Item)

项目是基本值或者节点。

节点关系

父(Parent)

每个元素以及属性都有一个父。

在下面的例子中,book 元素是 title、author、year 以及 price 元素的父:

<book>
  <title>Harry Potter</title>
  <author>J K. Rowling</author>
  <year>2005</year>
  <price>29.99</price>
</book>

子(Children)

元素节点可有零个、一个或多个子。

在下面的例子中,title、author、year 以及 price 元素都是 book 元素的子:

<book>
  <title>Harry Potter</title>
  <author>J K. Rowling</author>
  <year>2005</year>
  <price>29.99</price>
</book>

同胞(Sibling)

拥有相同的父的节点

在下面的例子中,title、author、year 以及 price 元素都是同胞:

<book>
  <title>Harry Potter</title>
  <author>J K. Rowling</author>
  <year>2005</year>
  <price>29.99</price>
</book>

先辈(Ancestor)

某节点的父、父的父,等等。

在下面的例子中,title 元素的先辈是 book 元素和 bookstore 元素:

<bookstore>

<book>
  <title>Harry Potter</title>
  <author>J K. Rowling</author>
  <year>2005</year>
  <price>29.99</price>
</book>

</bookstore>

后代(Descendant)

某个节点的子,子的子,等等。

在下面的例子中,bookstore的后代是 book、title、author、year 以及 price 元素:

<bookstore>

<book>
  <title>Harry Potter</title>
  <author>J K. Rowling</author>
  <year>2005</year>
  <price>29.99</price>
</book>

</bookstore>

XPath 语法

XPath 使用路径表达式来选取 XML 文档中的节点或节点集。节点是通过沿着路径 (path) 或者步 (steps)
来选取的。

XML 实例文档

我们将在下面的例子中使用这个 XML 文档。

<?xml version="1.0" encoding="ISO-8859-1"?>

<bookstore>

<book>
  <title lang="eng">Harry Potter</title>
  <price>29.99</price>
</book>

<book>
  <title lang="eng">Learning XML</title>
  <price>39.95</price>
</book>

</bookstore>

选取节点

XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径或者 step 来选取的。

下面列出了最有用的路径表达式:

表达式 描述
nodename 选取此节点的所有子节点
/ 从根节点选取
// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置
. 选取当前节点
.. 选取当前节点的父节点
@ 选取属性

实例

在下面的表格中,我们已列出了一些路径表达式以及表达式的结果:

路径表达式 结果
bookstore 选取 bookstore 元素的所有子节点
/bookstore 选取根元素 bookstore

注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径!

bookstore/book 选取所有属于 bookstore 的子元素的 book 元素。
//book 选取所有 book 子元素,而不管它们在文档中的位置。
bookstore//book 选择所有属于 bookstore 元素的后代的 book 元素,而不管它们位于 bookstore 之下的什么位置。
//@lang 选取所有名为 lang 的属性。

谓语(Predicates)

谓语用来查找某个特定的节点或者包含某个指定的值的节点。

谓语被嵌在方括号中。

实例

在下面的表格中,我们列出了带有谓语的一些路径表达式,以及表达式的结果:

路径表达式 结果
/bookstore/book[1] 选取属于 bookstore 子元素的第一个 book 元素。
/bookstore/book[last()] 选取属于 bookstore 子元素的最后一个 book 元素。
/bookstore/book[last()-1] 选取属于 bookstore 子元素的倒数第二个 book 元素。
/bookstore/book[position()<3] 选取最前面的两个属于 bookstore 元素的子元素的 book 元素。
//title[@lang] 选取所有拥有名为 lang 的属性的 title 元素。
//title[@lang=’eng’] 选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。
/bookstore/book[price>35.00] 选取所有 bookstore 元素的 book 元素,且其中的 price 元素的值须大于 35.00。
/bookstore/book[price>35.00]/title 选取所有 bookstore 元素中的 book 元素的 title 元素,且其中的 price 元素的值须大于 35.00。

选取未知节点

XPath 通配符可用来选取未知的 XML 元素。

通配符 描述
* 匹配任何元素节点
@* 匹配任何属性节点
node() 匹配任何类型的节点

实例

在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:

路径表达式 结果
/bookstore/* 选取 bookstore 元素的所有子节点
//* 选取文档中的所有元素
//title[@*] 选取所有带有属性的 title 元素。

选取若干路径

通过在路径表达式中使用“|”运算符,您可以选取若干个路径。

实例

在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:

路径表达式 结果
//book/title | //book/price 选取所有 book 元素的 tilte 和 price 元素。
//title | //price 选取所有文档中的 title 和 price 元素。
/bookstore/book/title | //price 选取所有属于 bookstore 元素的 book 元素的 title 元素,以及文档中所有的 price 元素。

XPath Axes(坐标轴)

XML 实例文档

我们将在下面的例子中使用此 XML 文档:

<?xml version="1.0" encoding="ISO-8859-1"?>

<bookstore>

<book>
  <title lang="eng">Harry Potter</title>
  <price>29.99</price>
</book>

<book>
  <title lang="eng">Learning XML</title>
  <price>39.95</price>
</book>

</bookstore>

XPath 轴

轴可定义某个相对于当前节点的节点集。

轴名称 结果
ancestor 选取当前节点的所有先辈(父、祖父等)
ancestor-or-self 选取当前节点的所有先辈(父、祖父等)以及当前节点本身
attribute 选取当前节点的所有属性
child 选取当前节点的所有子元素。
descendant 选取当前节点的所有后代元素(子、孙等)。
descendant-or-self 选取当前节点的所有后代元素(子、孙等)以及当前节点本身。
following 选取文档中当前节点的结束标签之后的所有节点。
namespace 选取当前节点的所有命名空间节点
parent 选取当前节点的父节点。
preceding 选取文档中当前节点的开始标签之前的所有节点。
preceding-sibling 选取当前节点之前的所有同级节点。
self 选取当前节点。

位置路径表达式

位置路径可以是绝对的,也可以是相对的。

绝对路径起始于正斜杠( / ),而相对路径不会这样。在两种情况中,位置路径均包括一个或多个步,每个步均被斜杠分割:

绝对位置路径:

/step/step/...

相对位置路径:

step/step/...

每个步均根据当前节点集之中的节点来进行计算。

步(step)包括:

轴(axis)
定义所选节点与当前节点之间的树关系
节点测试(node-test)
识别某个轴内部的节点
零个或者更多谓语(predicate)
更深入地提炼所选的节点集

步的语法:

轴名称::节点测试[谓语]

实例

例子 结果
child::book 选取所有属于当前节点的子元素的 book 节点
attribute::lang 选取当前节点的 lang 属性
child::* 选取当前节点的所有子元素
attribute::* 选取当前节点的所有属性
child::text() 选取当前节点的所有文本子节点
child::node() 选取当前节点的所有子节点
descendant::book 选取当前节点的所有 book 后代
ancestor::book 选择当前节点的所有 book 先辈
ancestor-or-self::book 选取当前节点的所有book先辈以及当前节点(假如此节点是book节点的话)
child::*/child::price 选取当前节点的所有 price 孙。

XPath 运算符

XPath 表达式可返回节点集、字符串、逻辑值以及数字。

XPath 运算符

下面列出了可用在 XPath 表达式中的运算符:

运算符 描述 实例 返回值
| 计算两个节点集 //book | //cd 返回所有带有 book 和 ck 元素的节点集
+ 加法 6 + 4 10
减法 6 – 4 2
* 乘法 6 * 4 24
div 除法 8 div 4 2
= 等于 price=9.80 如果 price 是9.80,则返回 true。

如果 price 是9.90,则返回 fasle。

!= 不等于 price!=9.80 如果 price 是 9.90,则返回 true。

如果 price 是 9.98,则返回 fasle。

< 小于 price<9.80 如果price是9.00,则返回true

如果price是9.98,则返回fasle

<= 小于或等于 price<=9.80 如果 price 是9.00,则返回 true。

如果 price 是9.90,则返回 fasle。

> 大于 price>9.80 如果 price 是 9.90,则返回 true。

如果 price 是 9.80,则返回 fasle。

>= 大于或等于 price>=9.80 如果 price 是 9.90,则返回 true。

如果 price 是 9.70,则返回 fasle。

or price=9.80 or price=9.70 如果 price 是 9.80,则返回 true。

如果 price 是 9.50,则返回 fasle。

and price>9.00 and price<9.90 如果 price 是 9.80,则返回 true。

如果 price 是 8.50,则返回 fasle。

mod 计算除法的余数 5 mod 2 1

 

XPath 实例

在本节,让我们通过实例来学习一些基础的 XPath 语法。

XML实例文档

我们将在下面的例子中使用这个 XML 文档:

“books.xml” :

<?xml version="1.0" encoding="ISO-8859-1"?>

<bookstore>

<book category="COOKING">
  <title lang="en">Everyday Italian</title>
  <author>Giada De Laurentiis</author>
  <year>2005</year>
  <price>30.00</price>
</book>

<book category="CHILDREN">
  <title lang="en">Harry Potter</title>
  <author>J K. Rowling</author>
  <year>2005</year>
  <price>29.99</price>
</book>

<book category="WEB">
  <title lang="en">XQuery Kick Start</title>
  <author>James McGovern</author>
  <author>Per Bothner</author>
  <author>Kurt Cagle</author>
  <author>James Linn</author>
  <author>Vaidyanathan Nagarajan</author>
  <year>2003</year>
  <price>49.99</price>
</book>

<book category="WEB">
  <title lang="en">Learning XML</title>
  <author>Erik T. Ray</author>
  <year>2003</year>
  <price>39.95</price>
</book>

</bookstore>

在您的浏览器中查看此 “books.xml” 文件

节点选取

我们将使用微软的 XML DOM 对象来载入 XML 文档,并使用 selectNodes() 函数从 XML 文档选取节点:

set xmlDoc=CreateObject("Microsoft.XMLDOM")
xmlDoc.async="false"
xmlDoc.load("books.xml")

xmlDoc.selectNodes(路径表达式)

选取所有的 book 节点

下面的这个例子选取了 bookstore 元素下所有的 book 节点:

xmlDoc.selectNodes("/bookstore/book")

假如您正在使用 IE 5 或更高的版本,可以亲自试一试

选取第一个 book 节点

下面的例子仅选取 bookstore 元素下第一个 book 节点:

xmlDoc.selectNodes("/bookstore/book[0]")

假如您正在使用 IE 5或更高的版本,可以亲自试一试

注释:IE 5 和 6 会把 [0] 作为第一个节点来执行,但是根据 W3C 的标准,应该使用 [1] !!

注释:这个问题在 IE 6 SP2 中被纠正了!

选取 price

下面的例子从所有的 price 节点选取文本:

xmlDoc.selectNodes("/bookstore/book/price/text()")

假如您正在使用 IE 5 或更高的版本,可以亲自试一试

选取价格高于 35 的 price 价格

下面的例子会选取所有价格高于 35 的 price 节点:

xmlDoc.selectNodes("/bookstore/book[price>35]/price")

假如您正在使用 IE 5 或更高的版本,可以亲自试一试

选取价格高于 35 的 title 节点

下面的例子会选取所有价格高于 35 的 title 节点:

xmlDoc.selectNodes("/bookstore/book[price>35]/title")

假如您正在使用 IE 5 或更高的版本,可以亲自试一试

 

您已经学习了 XPath,下一步呢?

XPath 概要

本教程已经向您讲解了如何在 XML 文档中查找信息。

您已经学习了如何使用 XPath 通过元素和属性在 XML 文档中进行导航。

你也学习了如何使用 XPath 中内建的某些标准函数。

如需更多有关 XPath 的信息,请阅读我们的《XPath 参考手册》。

您已经学习了 XPath,下一步应当学习什么呢?

您下一步应该学习 XSLT、XQuery、XLink 以及 XPointer。

XSLT

XSLT 是针对 XML 文件的样式表语言。

通过 XSLT,您可以把 XML 文件转换为其他的格式,比如 XHTML。

如果您希望学习更多有关 XSLT 的知识,请访问我们的《XSLT 教程》。

XQuery

XQuery 和 XML 数据查询有关。

XQuery 被设计用来查询任何可作为 XML 形态呈现的数据,包括数据库。

如果您希望学习更多有关 XQuery 的知识,请访问我们的《XQuery 教程》。

XLink 和 XPointer

XML 中的链接被分为两个部分:XLink 和 XPointer。

XLink 和 XPointer 定义了在 XML 文档中创建超级链接的标准方法。

如果你希望学习更多有关 XLink 和 XPointer 的知识,请访问我们的《XLink 教程和 XPointer教程》。

 

XPath、XQuery 以及 XSLT 函数

存取函数

 

名称 说明
fn:node-name(node) 返回参数节点的节点名称。
fn:nilled(node) 返回是否拒绝参数节点的布尔值。
fn:data(item.item,…) 接受项目序列,并返回原子值序列。
  • fn:base-uri()
  • fn:base-uri(node)
返回当前节点或指定节点的 base-uri 属性的值。
fn:document-uri(node) 返回指定节点的 document-uri 属性的值。

错误和跟踪函数

 

名称 说明
  • fn:error()
  • fn:error(error)
  • fn:error(error,description)
  • fn:error(error,description,error-object)
例子:error(fn:QName(‘http://example.com/test’, ‘err:toohigh’), ‘Error: Price is too high’)

结果:向外部处理环境返回 http://example.com/test#toohigh 以及字符串 “Error: Price is too high”。

fn:trace(value,label) 用于对查询进行 Debug

有关数值的函数

 

名称 说明
fn:number(arg) 返回参数的数值。参数可以是布尔值、字符串或节点集。

例子:number(‘100’)

结果:100

fn:abs(num) 返回参数的绝对值。

例子:abs(3.14)

结果:3.14

例子:abs(-3.14)

结果:3.14

fn:ceiling(num) 返回小于 num 参数的最小整数。

例子:ceiling(3.14)

结果:4

fn:floor(num) 返回不大于 num 参数的最大整数。

例子:floor(3.14)

结果:3

fn:round(num) 把 num 参数舍入为最接近的整数。

例子:round(3.14)

结果:3

fn:round-half-to-even() 例子:round-half-to-even(0.5)

结果:0

例子:round-half-to-even(1.5)

结果:2

例子:round-half-to-even(2.5)

结果:2

有关字符串的函数

 

名称 说明
fn:string(arg) 返回参数的字符串值。参数可以是数字、逻辑值或节点集。

例子:string(314)

结果:”314″

fn:codepoints-to-string(int,int,…) 根据代码点序列返回字符串。

例子:codepoints-to-string(84, 104, 233, 114, 232, 115, 101)

结果:’Thérèse’

fn:string-to-codepoints(string) 根据字符串返回代码点序列。

例子:string-to-codepoints(“Thérèse”)

结果:84, 104, 233, 114, 232, 115, 101

fn:codepoint-equal(comp1,comp2) 根据 Unicode 代码点对照,如果 comp1 的值等于 comp2 的值,则返回 true。(http://www.w3.org/2005/02/xpath-functions/collation/codepoint),否则返回 false。
  • fn:compare(comp1,comp2)
  • fn:compare(comp1,comp2,collation)
如果 comp1 小于 comp2,则返回 -1。如果 comp1 等于 comp2,则返回 0。如果 comp1 大于 comp2,则返回 1。(根据所用的对照规则)。

例子:compare(‘ghi’, ‘ghi’)

结果:0

fn:concat(string,string,…) 返回字符串的拼接。

例子:concat(‘XPath ‘,’is ‘,’FUN!’)

结果:’XPath is FUN!’

fn:string-join((string,string,…),sep) 使用 sep 参数作为分隔符,来返回 string 参数拼接后的字符串。

例子:string-join((‘We’, ‘are’, ‘having’, ‘fun!’), ‘ ‘)

结果:’ We are having fun! ‘

例子:string-join((‘We’, ‘are’, ‘having’, ‘fun!’))

结果:’Wearehavingfun!’

例子:string-join((), ‘sep’)

结果:”

  • fn:substring(string,start,len)
  • fn:substring(string,start)
返回从 start 位置开始的指定长度的子字符串。第一个字符的下标是 1。如果省略 len 参数,则返回从位置 start 到字符串末尾的子字符串。

例子:substring(‘Beatles’,1,4)

结果:’Beat’

例子:substring(‘Beatles’,2)

结果:’eatles’

fn:string-length(string) fn:string-length() 返回指定字符串的长度。如果没有 string 参数,则返回当前节点的字符串值的长度。

例子:string-length(‘Beatles’)

结果:7

  • fn:normalize-space(string)
  • fn:normalize-space()
删除指定字符串的开头和结尾的空白,并把内部的所有空白序列替换为一个,然后返回结果。如果没有 string 参数,则处理当前节点。

例子:normalize-space(‘ The   XML ‘)

结果:’The XML’

  • fn:normalize-unicode()
  • fn:upper-case(string)
把 string 参数转换为大写。

例子:upper-case(‘The XML’)

结果:’THE XML’

fn:lower-case(string) 把 string 参数转换为小写。

例子:lower-case(‘The XML’)

结果:’the xml’

fn:translate(string1,string2,string3) 把 string1 中的 string2 替换为 string3。

例子:translate(’12:30′,’30’,’45’)

结果:’12:45′

例子:translate(’12:30′,’03’,’54’)

结果:’12:45′

例子:translate(’12:30′,’0123′,’abcd’)

结果:’bc:da’

fn:escape-uri(stringURI,esc-res) 例子:escape-uri(“http://example.com/test#car”, true())

结果:”http%3A%2F%2Fexample.com%2Ftest#car”

例子:escape-uri(“http://example.com/test#car”, false())

结果:”http://example.com/test#car”

例子:escape-uri (“http://example.com/~bébé”, false())

结果:”http://example.com/~b%C3%A9b%C3%A9″

fn:contains(string1,string2) 如果 string1 包含 string2,则返回 true,否则返回 false。

例子:contains(‘XML’,’XM’)

结果:true

fn:starts-with(string1,string2) 如果 string1 以 string2 开始,则返回 true,否则返回 false。

例子:starts-with(‘XML’,’X’)

结果:true

fn:ends-with(string1,string2) 如果 string1 以 string2 结尾,则返回 true,否则返回 false。

例子:ends-with(‘XML’,’X’)

结果:false

fn:substring-before(string1,string2) 返回 string2 在 string1 中出现之前的子字符串。

例子:substring-before(’12/10′,’/’)

结果:’12’

fn:substring-after(string1,string2) 返回 string2 在 string1 中出现之后的子字符串。

例子:substring-after(’12/10′,’/’)

结果:’10’

fn:matches(string,pattern) 如果 string 参数匹配指定的模式,则返回 true,否则返回 false。

例子:matches(“Merano”, “ran”)

结果:true

fn:replace(string,pattern,replace) 把指定的模式替换为 replace 参数,并返回结果。

例子:replace(“Bella Italia”, “l”, “*”)

结果:’Be**a Ita*ia’

例子:replace(“Bella Italia”, “l”, “”)

结果:’Bea Itaia’

fn:tokenize(string,pattern) 例子:tokenize(“XPath is fun”, “/s+”)

结果:(“XPath”, “is”, “fun”)

针对 anyURI 的函数

 

名称 说明
fn:resolve-uri(relative,base)

关于布尔值的函数

 

名称 说明
fn:boolean(arg) 返回数字、字符串或节点集的布尔值。
fn:not(arg) 首先通过 boolean() 函数把参数还原为一个布尔值。如果该布尔值为 false,则返回 true,否则返回 true。

例子:not(true())

结果:false

fn:true() 返回布尔值 true。

例子:true()

结果:true

fn:false() 返回布尔值 false。

例子:false()

结果:false

有关持续时间、日期和时间的函数

日期、时间、持续时间的组件提取函数

 

名称 说明
fn:dateTime(date,time) 把参数转换为日期和时间。
fn:years-from-duration(datetimedur) 返回参数值的年份部分的整数,以标准词汇表示法来表示。
fn:months-from-duration(datetimedur) 返回参数值的月份部分的整数,以标准词汇表示法来表示。
fn:days-from-duration(datetimedur) 返回参数值的天部分的整数,以标准词汇表示法来表示。
fn:hours-from-duration(datetimedur) 返回参数值的小时部分的整数,以标准词汇表示法来表示。
fn:minutes-from-duration(datetimedur) 返回参数值的分钟部分的整数,以标准词汇表示法来表示。
fn:seconds-from-duration(datetimedur) 返回参数值的分钟部分的十进制数,以标准词汇表示法来表示。
fn:year-from-dateTime(datetime) 返回参数本地值的年部分的整数。

例子:year-from-dateTime(xs:dateTime(“2005-01-10T12:30-04:10”))

结果:2005

fn:month-from-dateTime(datetime) 返回参数本地值的月部分的整数。

例子:month-from-dateTime(xs:dateTime(“2005-01-10T12:30-04:10”))

结果:01

fn:day-from-dateTime(datetime) 返回参数本地值的天部分的整数。

例子:day-from-dateTime(xs:dateTime(“2005-01-10T12:30-04:10”))

结果:10

fn:hours-from-dateTime(datetime) 返回参数本地值的小时部分的整数。

例子:hours-from-dateTime(xs:dateTime(“2005-01-10T12:30-04:10”))

结果:12

fn:minutes-from-dateTime(datetime) 返回参数本地值的分钟部分的整数。

例子:minutes-from-dateTime(xs:dateTime(“2005-01-10T12:30-04:10”))

结果:30

fn:seconds-from-dateTime(datetime) 返回参数本地值的秒部分的十进制数。

例子:seconds-from-dateTime(xs:dateTime(“2005-01-10T12:30:00-04:10”))

结果:0

fn:timezone-from-dateTime(datetime) 返回参数的时区部分,如果存在。
fn:year-from-date(date) 返回参数本地值中表示年的整数。

例子:year-from-date(xs:date(“2005-04-23”))

结果:2005

fn:month-from-date(date) 返回参数本地值中表示月的整数。

例子:month-from-date(xs:date(“2005-04-23”))

结果:4

fn:day-from-date(date) 返回参数本地值中表示天的整数。

例子:day-from-date(xs:date(“2005-04-23”))

结果:23

fn:timezone-from-date(date) 返回参数的时区部分,如果存在。
fn:hours-from-time(time) 返回参数本地值中表示小时部分的整数。

例子:hours-from-time(xs:time(“10:22:00”))

结果:10

fn:minutes-from-time(time) 返回参数本地值中表示分钟部分的整数。

例子:minutes-from-time(xs:time(“10:22:00”))

结果:22

fn:seconds-from-time(time) 返回参数本地值中表示秒部分的整数。

例子:seconds-from-time(xs:time(“10:22:00”))

结果:0

fn:timezone-from-time(time) 返回参数的时区部分,如果存在。
fn:adjust-dateTime-to-timezone(datetime,timezone) 如果 timezone 参数为空,则返回没有时区的 dateTime。否则返回带有时区的 dateTime。
fn:adjust-date-to-timezone(date,timezone) 如果 timezone 参数为空,则返回没有时区的 date。否则返回带有时区的 date。
fn:adjust-time-to-timezone(time,timezone) 如果 timezone 参数为空,则返回没有时区的 time。否则返回带有时区的 time。

与 QNames 相关的函数

 

名称 说明
fn:QName()
fn:local-name-from-QName()
fn:namespace-uri-from-QName()
fn:namespace-uri-for-prefix()
fn:in-scope-prefixes()
fn:resolve-QName()

关于节点的函数

 

名称 说明
  • fn:name()
  • fn:name(nodeset)
返回当前节点的名称或指定节点集中的第一个节点。
  • fn:local-name()
  • fn:local-name(nodeset)
返回当前节点的名称或指定节点集中的第一个节点 – 不带有命名空间前缀。
  • fn:namespace-uri()
  • fn:namespace-uri(nodeset)
返回当前节点或指定节点集中第一个节点的命名空间 URI。
fn:lang(lang) 如果当前节点的语言匹配指定的语言,则返回 true。

例子:Lang(“en”) is true for <p xml:lang=”en”>…</p>

例子:Lang(“de”) is false for <p xml:lang=”en”>…</p>

  • fn:root()
  • fn:root(node)
返回当前节点或指定的节点所属的节点树的根节点。通常是文档节点。

有关序列的函数

一般性的函数

 

名称 说明
fn:index-of((item,item,…),searchitem) 返回在项目序列中等于 searchitem 参数的位置。

例子:index-of ((15, 40, 25, 40, 10), 40)

结果:(2, 4)

例子:index-of ((“a”, “dog”, “and”, “a”, “duck”), “a”)

Result (1, 4)

例子:index-of ((15, 40, 25, 40, 10), 18)

结果:()

fn:remove((item,item,…),position) 返回由 item 参数构造的新序列 – 同时删除 position 参数指定的项目。

例子:remove((“ab”, “cd”, “ef”), 0)

结果:(“ab”, “cd”, “ef”)

例子:remove((“ab”, “cd”, “ef”), 1)

结果:(“cd”, “ef”)

例子:remove((“ab”, “cd”, “ef”), 4)

结果:(“ab”, “cd”, “ef”)

fn:empty(item,item,…) 如果参数值是空序列,则返回 true,否则返回 false。

例子:empty(remove((“ab”, “cd”), 1))

结果:false

fn:exists(item,item,…) 如果参数值不是空序列,则返回 true,否则返回 false。

例子:exists(remove((“ab”), 1))

结果:false

fn:distinct-values((item,item,…),collation) 返回唯一不同的值。

例子:distinct-values((1, 2, 3, 1, 2))

结果:(1, 2, 3)

fn:insert-before((item,item,…),pos,inserts) 返回由 item 参数构造的新序列 – 同时在 pos 参数指定位置插入 inserts 参数的值。

例子:insert-before((“ab”, “cd”), 0, “gh”)

结果:(“gh”, “ab”, “cd”)

例子:insert-before((“ab”, “cd”), 1, “gh”)

结果:(“gh”, “ab”, “cd”)

例子:insert-before((“ab”, “cd”), 2, “gh”)

结果:(“ab”, “gh”, “cd”)

例子:insert-before((“ab”, “cd”), 5, “gh”)

结果:(“ab”, “cd”, “gh”)

fn:reverse((item,item,…)) 返回指定的项目的颠倒顺序。

例子:reverse((“ab”, “cd”, “ef”))

结果:(“ef”, “cd”, “ab”)

例子:reverse((“ab”))

结果:(“ab”)

fn:subsequence((item,item,…),start,len) 返回 start 参数指定的位置返回项目序列,序列的长度由 len 参数指定。第一个项目的位置是 1。

例子:subsequence(($item1, $item2, $item3,…), 3)

结果:($item3, …)

例子:subsequence(($item1, $item2, $item3, …), 2, 2)

结果:($item2, $item3)

fn:unordered((item,item,…)) 依据实现决定的顺序来返回项目。

测试序列容量的函数

 

名称 说明
fn:zero-or-one(item,item,…) 如果参数包含零个或一个项目,则返回参数,否则生成错误。
fn:one-or-more(item,item,…) 如果参数包含一个或多个项目,则返回参数,否则生成错误。
fn:exactly-one(item,item,…) 如果参数包含一个项目,则返回参数,否则生成错误。

Equals, Union, Intersection and Except

 

名称 说明
fn:deep-equal(param1,param2,collation) 如果 param1 和 param2 与彼此相等(deep-equal),则返回 true,否则返回 false。

合计函数

 

名称 说明
fn:count((item,item,…)) 返回节点的数量。
fn:avg((arg,arg,…)) 返回参数值的平均数。例子:avg((1,2,3)) 结果:2
fn:max((arg,arg,…)) 返回大于其它参数的参数。例子:max((1,2,3)) 结果:3 例子:max((‘a’, ‘k’)) 结果:’k’
fn:min((arg,arg,…)) 返回小于其它参数的参数。例子:min((1,2,3)) 结果:1 例子:min((‘a’, ‘k’)) 结果:’a’
fn:sum(arg,arg,…) 返回指定节点集中每个节点的数值的总和。

生成序列的函数

 

名称 说明
fn:id((string,string,…),node) Returns a sequence of element nodes that have an ID value equal to the value of one or more of the values specified in the string argument
fn:idref((string,string,…),node) Returns a sequence of element or attribute nodes that have an IDREF value equal to the value of one or more of the values specified in the string argument
fn:doc(URI)
fn:doc-available(URI) 如果 doc() 函数返回文档节点,则返回 true,否则返回 false。
  • fn:collection()
  • fn:collection(string)

上下文函数

 

名称 说明
fn:position() 返回当前正在被处理的节点的 index 位置。

例子://book[position()<=3]

结果:选择前三个 book 元素

fn:last() 返回在被处理的节点列表中的项目数目。

例子://book[last()]

结果:选择最后一个 book 元素

fn:current-dateTime() 返回当前的 dateTime(带有时区)。
fn:current-date() 返回当前的日期(带有时区)。
fn:current-time() 返回当前的时间(带有时区)。
fn:implicit-timezone() 返回隐式时区的值。
fn:default-collation() 返回默认对照的值。
fn:static-base-uri() 返回 base-uri 的值。

 

备注:本文引用自http://www.w3school.com.cn/xpath/index.asp

[转载]C#解析XML文件 - 春风沉醉的晚上 - 博客园

mikel阅读(1187)

[转载]C#解析XML文件 – 春风沉醉的晚上 – 博客园.

内容提要

1.解析Xml文件有哪些方法?各有什么优缺点?

2.如何XPath解析xml文档的要点。 

     

先来看看解析xml文件的方法都有哪些吧,本段文字来自网络,可以帮助大家对这个问题有个概要的了解。

在程序中访问并操作XML文件一般有两种模型:流模型和DOM(文档对象模型)。流模型中有两种变体——“模型和模型。 

 模型也就是常说的SAXSAX是一种靠事件驱动的模型。它每发现一个节点就用模型引发一个事件,而我们必须编写这些事件的处理程序,很麻烦。

.NET中使用的是基于模型的实现方案。模型在遍历文档时会把感兴趣的文档部分从读取器中拉出,不需要引发事件,允许我们以编程的方式访问文档,这大大的提高了灵活性,模型可以选择性的处理节点。在.NET中,模型通过XML阅读器(XMLTextReader)来实现的。该类提供Xml文件读取的功能,它可以验证文档是否格式良好,如果不是格式良好的Xml文档,该类在读取过程中将会抛出XmlException异常。任何时候在内存中只有当前节点,但它是只读的,向前的,不能在文档中执行向后导航操作。 

DOM的好处在于它允许编辑和更新XML文档,可以随机访问文档中的数据,可以使用XPath查询。但是,DOM的缺点在于它需要一次性的加载整个文档到内存中,对于大型的文档,这会造成资源问题。在.NET中使用XML DOM分析器(XMLDocument)实现DOM模型。

因此,.NET Framework完全支持XML DOM模式,但它不支持SAX模式。.NET Framework支持两种不同的分析模式:XML DOM分析器(XMLDocument)XML阅读器(XMLTextReader),不支持SAX分析器,但这并不意味着它没有提供类似SAX分析器的功能。通过XML阅读器可以将SAX的所有的功能很容易的实现及更有效的运用。

 

 

 

在项目中,我们选用xpath的方式来解析xml文档。这是基于以下的几点原因:

1,文件大小。要处理的文件不大,一般都在几百K1M

2,  XPath的灵活性。不需要获取文档的全部数据,只需要获取大部分想要的数据。

3,  学习代价低。符合一般的思维习惯,通过Path获取结果。

 

通过XPath的方式解析xml文档,需要先加载文档,然后再读取想要的节点值。

xml文档

protected XmlDocument doc = null;

xml文档的根元素(节点)

protected XmlElement root = null;

 xml文档的名空间管理器 

protected XmlNamespaceManager nsmgr = null;

接下来就是加载文档了

 


        protected void LoadXmlFile(FileInfo xmlFile)
{
if (xmlFile == null || !xmlFile.Exists)
{
throw new FileNotFoundException(string.Format(要解析的文件不存在{0}。,xmlFile.FullName));
}
//加载文件
            this.doc = new XmlDocument();
doc.Load(xmlFile.FullName);
//准备读取文件
            root = doc.DocumentElement;
string nameSpace = root.NamespaceURI;
nsmgr 
= new XmlNamespaceManager(doc.NameTable);
nsmgr.AddNamespace(
ns, nameSpace);
}

这里有几行要注意。

      这两行是取得xml文档的名空间

            root = doc.DocumentElement;
string nameSpace = root.NamespaceURI;

      这两行是建立xml文档的名空间管理器

            nsmgr = new XmlNamespaceManager(doc.NameTable);
nsmgr.AddNamespace(
ns, nameSpace);

      如果你的xml文档有名空间,则这部分的代码是必不可少的。

   接下来就是读取文档节点的值了

      这里两个传入参数prefixPath是节点的上级节点路径,xRelativePath是要读取的节点名称。

另外,变量XmlFileInfo是要加载的xml文件。


        protected string GetNodeValue(string prefixPath, string xRelativePath)
{
if (doc == null)
{
LoadXmlFile(XmlFileInfo);
}
string xPath = string.Empty;
if (!string.IsNullOrEmpty(xRelativePath))
{
if (!string.IsNullOrEmpty(prefixPath))
{
xPath 
= prefixPath + xRelativePath;
}
else
{
xPath 
= xRelativePath;
}
}
xPath 
= xPath.Replace(//ns:);
XmlNode node 
= root.SelectSingleNode(xPath, nsmgr);
if (node == null)
{
return null;
}
return node.InnerXml;
}

   可能有的朋友要问,为什么要设置两个参数prefixPath和xRelativePath呢,其实这个没有多大的关系,我只是为了自己觉得方便,你也可以在方法外确定了这个XPath,在方法中只设置一个传入参数,效果是一样的。

   注意这一行:

      xPath = xPath.Replace(“/”, “/ns:”);

   如果你的xml文档带名空间,则这行是比不可少的,否则会出现找不到节点,无法解析的情况。

   这里还有一个不得不说的问题,就是关于XPath的。

   对 于这样一个xml文档,要查找第一个节点下的学生的Name时(ID=01),其XPath应该是”/ns:Root/ns:Students /ns:Student[1]/ns:Name”。xml对于重复的节点名称,是按照顺序1,2,3…的方式遍历的,也就是说如果要找第N个 Student节点的下的节点之,那么应使用Student[N]的标识方式。


<?xml version=”1.0″ encoding=”UTF-8″ ?>
<Root xmlns=”urn:ClassNameSpace”>
<Class>
<ClassID>1234</ClassID>
</Class>
<Students>
<Student>
<ID>01</ID><Name>Name01</Name>
</Student>
<Student>
<ID>02</ID><Name>Name02</Name>
</Student>
</Students>
</Root>

   当然,这里也可以获取节点属性的值,查找满足特定值的节点等等,这些和上面获取节点值的过程是类似的。这里推荐一篇介绍xpath的文章XPath 教程,大家不妨看看,关于xpath的常见问题都可以得到解决。

[转载]PHP版微信公共平台消息主动推送,突破订阅号一天只能发送一条信息限制 - wander112900 - 博客园

mikel阅读(1654)

[转载]PHP版微信公共平台消息主动推送,突破订阅号一天只能发送一条信息限制 – wander112900 – 博客园.

PHP版微信公共平台消息主动推送,突破订阅号一天只能发送一条信息限制

2013年10月06日最新整理。

PHP版微信公共平台消息主动推送,突破订阅号一天只能发送一条信息限制

微信公共平台消息主动推送接口一直是腾讯的私用接口,相信很多朋友都非常想要用到这个功能。

通过学习借鉴朋友的实现方法进行整理,实现了PHP版的微信公共平台消息主动推送。

此方法是通过模拟登录微信公共平台的方法来实现的。

代码如下:

一、登录接口部分代码:

//登录
private function login(){
$url = 'https://mp.weixin.qq.com/cgi-bin/login?lang=zh_CN';
$this-&gt;send_data = array(
'username' =&gt; $this-&gt;_account,
'pwd' =&gt; md5($this-&gt;_password),
'f' =&gt; 'json'
);
$this-&gt;referer = "https://mp.weixin.qq.com/";
$this-&gt;getHeader = 1;
$result = explode("\n",$this-&gt;curlPost($url));
foreach ($result as $key =&gt; $value) {
$value = trim($value);
if(preg_match('/"ErrCode": (.*)/i', $value,$match)){//获取token
switch ($match[1]) {
case -1:
die(json_encode(array('status'=&gt;1,'errCode'=&gt;$match[1],'msg'=&gt;"系统错误")));
case -2:
die(json_encode(array('status'=&gt;1,'errCode'=&gt;$match[1],'msg'=&gt;"帐号或密码错误")));
case -3:
die(urldecode(json_encode(array('status'=&gt;1,'errCode'=&gt;$match[1],'msg'=&gt;urlencode("密码错误")))));
case -4:
die(json_encode(array('status'=&gt;1,'errCode'=&gt;$match[1],'msg'=&gt;"不存在该帐户")));
case -5:
die(json_encode(array('status'=&gt;1,'errCode'=&gt;$match[1],'msg'=&gt;"访问受限")));
case -6:
die(json_encode(array('status'=&gt;1,'errCode'=&gt;$match[1],'msg'=&gt;"需要输入验证码")));
case -7:
die(json_encode(array('status'=&gt;1,'errCode'=&gt;$match[1],'msg'=&gt;"此帐号已绑定私人微信号,不可用于公众平台登录")));
case -8:
die(json_encode(array('status'=&gt;1,'errCode'=&gt;$match[1],'msg'=&gt;"邮箱已存在")));
case -32:
die(json_encode(array('status'=&gt;1,'errCode'=&gt;$match[1],'msg'=&gt;"验证码输入错误")));
case -200:
die(json_encode(array('status'=&gt;1,'errCode'=&gt;$match[1],'msg'=&gt;"因频繁提交虚假资料,该帐号被拒绝登录")));
case -94:
die(json_encode(array('status'=&gt;1,'errCode'=&gt;$match[1],'msg'=&gt;"请使用邮箱登陆")));
case 10:
die(json_encode(array('status'=&gt;1,'errCode'=&gt;$match[1],'msg'=&gt;"该公众会议号已经过期,无法再登录使用")));
case 0:
$this-&gt;userFakeid = $this-&gt;getUserFakeid();
break;
}
}
if(preg_match('/^set-cookie:[\s]+([^=]+)=([^;]+)/i', $value,$match)){//获取cookie
$this-&gt;cookie .=$match[1].'='.$match[2].'; ';
}
if(preg_match('/"ErrMsg"/i', $value,$match)){//获取token
$this-&gt;token = rtrim(substr($value,strrpos($value,'=')+1),'",');
}
}
}

二、信息发送部分代码:

//单发消息
private function send($fakeid,$content){
$url = 'https://mp.weixin.qq.com/cgi-bin/singlesend?t=ajax-response&amp;lang=zh_CN';
$this-&gt;send_data = array(
'type' =&gt; 1,
'content' =&gt; $content,
'error' =&gt; 'false',
'tofakeid' =&gt; $fakeid,
'token' =&gt; $this-&gt;token,
'ajax' =&gt; 1,
);
$this-&gt;referer = 'https://mp.weixin.qq.com/cgi-bin/singlemsgpage?token='.$this-&gt;token.'&amp;fromfakeid='.$fakeid.'&amp;msgid=&amp;source=&amp;count=20&amp;t=wxm-singlechat&amp;lang=zh_CN';
return $this-&gt;curlPost($url);
}

三、群发信息代码:

//群发消息
public function sendMessage($content='',$userId='') {
if(is_array($userId) &amp;&amp; !empty($userId)){
foreach($userId as $v){
$json = json_decode($this-&gt;send($v,$content));
if($json-&gt;ret!=0){
$errUser[] = $v;
}
}
}else{
foreach($this-&gt;userFakeid as $v){
$json = json_decode($this-&gt;send($v['fakeid'],$content));
if($json-&gt;ret!=0){
$errUser[] = $v['fakeid'];
}
}
}

//共发送用户数
$count = count($this-&gt;userFakeid);
//发送失败用户数
$errCount = count($errUser);
//发送成功用户数
$succeCount = $count-$errCount;

$data = array(
'status'=&gt;0,
'count'=&gt;$count,
'succeCount'=&gt;$succeCount,
'errCount'=&gt;$errCount,
'errUser'=&gt;$errUser
);

return json_encode($data);
}

四、获取所有用户信息代码片段:

//获取所有用户信息
public function getAllUserInfo(){
foreach($this-&gt;userFakeid as $v){
$info[] = $this-&gt;getUserInfo($v['groupid'],$v['fakeid']);
}

return $info;
}

//获取用户信息
public function getUserInfo($groupId,$fakeId){
$url = "https://mp.weixin.qq.com/cgi-bin/getcontactinfo?t=ajax-getcontactinfo&amp;lang=zh_CN&amp;fakeid={$fakeId}";
$this-&gt;getHeader = 0;
$this-&gt;referer = 'https://mp.weixin.qq.com/cgi-bin/contactmanagepage?token='.$this-&gt;token.'&amp;t=wxm-friend&amp;lang=zh_CN&amp;pagesize='.$this-&gt;pageSize.'&amp;pageidx=0&amp;type=0&amp;groupid='.$groupId;
$this-&gt;send_data = array(
'token'=&gt;$this-&gt;token,
'ajax'=&gt;1
);
$message_opt = $this-&gt;curlPost($url);
return $message_opt;
}

//获取所有用户fakeid
private function getUserFakeid(){
ini_set('max_execution_time',600);
$pageSize = 1000000;
$this-&gt;referer = "https://mp.weixin.qq.com/cgi-bin/home?t=home/index&amp;lang=zh_CN&amp;token={$_SESSION['token']}";
$url = "https://mp.weixin.qq.com/cgi-bin/contactmanage?t=user/index&amp;pagesize={$pageSize}&amp;pageidx=0&amp;type=0&amp;groupid=0&amp;token={$this-&gt;token}&amp;lang=zh_CN";
$user = $this-&gt;vget($url);
$preg = "/\"id\":(\d+),\"name\"/";
preg_match_all($preg,$user,$b);
$i = 0;
foreach($b[1] as $v){
$url = 'https://mp.weixin.qq.com/cgi-bin/contactmanage?t=user/index&amp;pagesize='.$pageSize.'&amp;pageidx=0&amp;type=0&amp;groupid='.$v.'&amp;token='.$this-&gt;token.'&amp;lang=zh_CN';
$user = $this-&gt;vget($url);
$preg = "/\"id\":(\d+),\"nick_name\"/";
preg_match_all($preg,$user,$a);
foreach($a[1] as $vv){
$arr[$i]['fakeid'] = $vv;
$arr[$i]['groupid'] = $v;
$i++;
}
}
return $arr;
}

附源代码下载地址:http://download.csdn.net/detail/wander112900/6359879

[转载]Android 常用dialog提示对话框 - Livingstone - 博客园

mikel阅读(824)

[转载]Android 常用dialog提示对话框 – Livingstone – 博客园.

Android应用程序中,经常需要用到dialog对话框让用户知道现在所在进行的操作(比如耗时的操作),或者提示某些信息和状态等,算是比较常用的一个知识点;

1、简单对话框

复制代码
    protected void dialog1(AlertDialog.Builder builder) {
        builder.setTitle("标题");
        builder.setPositiveButton("确定", null);
        builder.setIcon(R.drawable.ic_launcher);
        builder.setMessage("简单消息框");
        builder.show();
    }
复制代码

2、带自定义内容对话框

复制代码
    protected void study2(AlertDialog.Builder builder) {
        builder.setTitle("标题");
        builder.setView(new EditText(this));
        builder.setPositiveButton("确定", null);
        builder.setIcon(android.R.drawable.ic_dialog_info);
        builder.setMessage("简单消息框");
        builder.show();
    }
复制代码

3、带单选按钮对话框

复制代码
    protected void study3(AlertDialog.Builder builder) {
        builder.setTitle("请选择")
                .setIcon(android.R.drawable.ic_dialog_info)
                .setSingleChoiceItems(
                        new String[] { "item1", "item2", "item3", "item4" }, 0,
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog,
                                    int which) {
                                Log.e("选择", "" + which);
                                dialog.dismiss();
                            }
                        }).setNegativeButton("取消", null).show();
    }
复制代码

在选择了某一项之后,onClick回调事件会把选择的项的索引返回给用户;

4、带多选组合框对话框

复制代码
    protected void study4(AlertDialog.Builder builder) {
        builder.setTitle("请选择")
                .setIcon(android.R.drawable.ic_dialog_info)
                .setMultiChoiceItems(
                        new String[] { "item1", "item2", "item3", "item4" },
                        new boolean[] { true, true, false, true },
                        new OnMultiChoiceClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog,
                                    int which, boolean isChecked) {
                                ListView lv = ((AlertDialog) dialog).getListView();
                                Log.e("项" + which, "选择" + lv.getCheckedItemPositions().get(which));
                            }
                        }).setNegativeButton("取消", null).show();
    }
复制代码

在多选对话框中,选择了某一项并不会导致对话框隐藏,同样Android也通过回调接口返回用户所选择的项;

5、进度条对话框

复制代码
    public void study5() {
        ProgressDialog dialog = new ProgressDialog(MainActivity.this);
        dialog.setCancelable(true);
        dialog.setMessage("加载中...");
        // dialog.setTitle("进度条框窗口");
        // dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        // dialog.setMax(100);
        dialog.show();
    }
复制代码

 

6、除了上述的添加用户界面友好提示的方法,还可以通过WindowManager添加一个View到界面上向用户反馈信息,此种方法也更灵活

复制代码
    protected void study6() {
        ViewGroup vg = (ViewGroup) getLayoutInflater().inflate(R.layout.dia,null);
        pb = (ProgressBar) vg.findViewById(R.id.pb);
        vg.removeAllViews();
        WindowManager.LayoutParams lp = new WindowManager.LayoutParams(160,
                160, WindowManager.LayoutParams.TYPE_APPLICATION,
                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
                PixelFormat.TRANSLUCENT);
        WindowManager windowManager = (WindowManager)getSystemService(Context.WINDOW_SERVICE);
        windowManager.addView(pb, lp);
    }
复制代码

重要的步骤即是从lp开始,设置LayoutParams参数,然后添加到窗口;