<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_Benjamin Wang's Blog</title><subtitle type="text"/><id>http://feed.cnblogs.com/blog/u/28528/rss</id><updated>2011-04-30T10:15:28Z</updated><author><name>Benjamin  Wang</name><uri>http://www.cnblogs.com/chunhui588/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chunhui588/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/28528/rss"/><entry><id>http://www.cnblogs.com/chunhui588/archive/2010/10/03/Android_How_to_Use_AutoCompleteTextView_Spinner_ListView.html</id><title type="text">Android AutoCompleteTextView,Spinner和ListView的使用</title><summary type="text">本篇主要讲一下AutoCompleteTextView,Spinner和ListView这几个控件的使用。(1) AutoCompleteTextViewAutoCompleteTextView自动完成文本框，它继承自EditText，并和EditText一样可以输入文本，但它可以根据用户输入的文本弹出一个智能提示的下拉列表，这样用户便可以选择相应的选项，类似我们在搜索框输入内容出现提示下拉列表一...</summary><published>2010-10-03T10:14:00Z</published><updated>2010-10-03T10:14:00Z</updated><author><name>Benjamin  Wang</name><uri>http://www.cnblogs.com/chunhui588/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chunhui588/archive/2010/10/03/Android_How_to_Use_AutoCompleteTextView_Spinner_ListView.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chunhui588/archive/2010/10/03/Android_How_to_Use_AutoCompleteTextView_Spinner_ListView.html"/><content type="html">&lt;p&gt;本篇主要讲一下AutoCompleteTextView,Spinner和ListView这几个控件的使用。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;(1) AutoCompleteTextView&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;AutoCompleteTextView自动完成文本框，它继承自EditText，并和EditText一样可以输入文本，但它可以根据用户输入的文本弹出一个智能提示的下拉列表，这样用户便可以选择相应的选项，类似我们在搜索框输入内容出现提示下拉列表一样的功能。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;新建一个项目，修改res/layout/main.xml内容为：&lt;/p&gt;&#xD;
&lt;pre &gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&#xD;
&amp;lt;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"&#xD;
	android:orientation="horizontal" android:layout_width="fill_parent"&#xD;
	android:layout_height="wrap_content"&amp;gt;&#xD;
	&amp;lt;TextView android:layout_width="wrap_content"&#xD;
		android:layout_height="wrap_content" android:text="Country" /&amp;gt;&#xD;
	&amp;lt;AutoCompleteTextView android:id="@+id/edit"&#xD;
		android:layout_width="fill_parent" android:layout_height="wrap_content" android:completionThreshold="1"/&amp;gt;&#xD;
&amp;lt;/LinearLayout&amp;gt;&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;java代码如下：&lt;/p&gt;&#xD;
&lt;pre &gt;public class AutoCompleteDemo extends Activity {&#xD;
	final String[] COUNTRIES = new String[] {"Afghanistan", "Australia","America","Canada", "Chile", "China"};&#xD;
	&#xD;
	@Override&#xD;
	public void onCreate(Bundle savedInstanceState) {&#xD;
		super.onCreate(savedInstanceState);&#xD;
		setContentView(R.layout.main);&#xD;
&#xD;
		AutoCompleteTextView textView = (AutoCompleteTextView) findViewById(R.id.edit);&#xD;
		ArrayAdapter&amp;lt;String&amp;gt; adapter = new ArrayAdapter&amp;lt;String&amp;gt;(this,&#xD;
				android.R.layout.simple_dropdown_item_1line, COUNTRIES);&#xD;
		textView.setAdapter(adapter);&#xD;
	}&#xD;
}&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在这里定义一个国家名称的字符串数组，AutoCompleteTextView会根据用户输入在这个数组查找相匹配的国家名称，这个可以定义在res/values/strings.xml里面，这里为了演示方便定义在代码里。在onCreate()定义ArrayAdapter&amp;lt;String&amp;gt;用来把每个国家名称与Android内置的布局项simple_dropdown_item_1line绑定，最后把ArrayAdapter&amp;lt;String&amp;gt;对象与AutoCompleteTextView 对象关联起来。 &lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;AutoCompleteTextView 有个属性android:completionThreshold表示用户在输入几个字符后出现下拉列表，默认值为2。运行效果如下：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/chunhui588/WindowsLiveWriter/AndroidAutoCompleteTextViewSpinnerListVi_D82D/image_2.png"&gt;&lt;img style="display: inline; border-width: 0px;" title="image" src="http://images.cnblogs.com/cnblogs_com/chunhui588/WindowsLiveWriter/AndroidAutoCompleteTextViewSpinnerListVi_D82D/image_thumb.png" border="0" alt="image" width="328" height="441" /&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;(2) Spinner&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Spinner下拉列表，类似于.NET中的DropdownList。&lt;/p&gt;&#xD;
&lt;p&gt;新建一个项目，修改res/layout/main.xml内容为：&lt;/p&gt;&#xD;
&lt;pre &gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&#xD;
&amp;lt;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"&#xD;
	android:orientation="vertical" android:padding="10dip"&#xD;
	android:layout_width="fill_parent" android:layout_height="wrap_content"&amp;gt;&#xD;
	&amp;lt;TextView android:layout_width="fill_parent"&#xD;
		android:layout_height="wrap_content" android:layout_marginTop="10dip"&#xD;
		android:text="Please select a country:" /&amp;gt;&#xD;
	&amp;lt;Spinner android:id="@+id/spinner" android:layout_width="fill_parent"&#xD;
		android:layout_height="wrap_content" android:drawSelectorOnTop="true" /&amp;gt;&#xD;
&amp;lt;/LinearLayout&amp;gt;&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;java代码如下：&lt;/p&gt;&#xD;
&lt;pre &gt;public class SpinnerDemo extends Activity {&#xD;
	final String[] COUNTRIES = new String[] { "Afghanistan", "Australia",&#xD;
			"America", "Canada", "Chile", "China" };&#xD;
&#xD;
	@Override&#xD;
	public void onCreate(Bundle savedInstanceState) {&#xD;
		super.onCreate(savedInstanceState);&#xD;
		setContentView(R.layout.main);&#xD;
&#xD;
		Spinner s = (Spinner) findViewById(R.id.spinner);&#xD;
		ArrayAdapter&amp;lt;String&amp;gt; adapter = new ArrayAdapter&amp;lt;String&amp;gt;(this,&#xD;
				android.R.layout.simple_spinner_item, COUNTRIES);&#xD;
		adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);&#xD;
		s.setAdapter(adapter);&#xD;
	}&#xD;
}&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;代码与前面很类似，这里调用ArrayAdapter对象的setDropDownViewResource()设置下拉列表的布局为Android内置的simple_spinner_dropdown_item。运行效果如下：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/chunhui588/WindowsLiveWriter/AndroidAutoCompleteTextViewSpinnerListVi_D82D/image_4.png"&gt;&lt;img style="display: inline; border-width: 0px;" title="image" src="http://images.cnblogs.com/cnblogs_com/chunhui588/WindowsLiveWriter/AndroidAutoCompleteTextViewSpinnerListVi_D82D/image_thumb_1.png" border="0" alt="image" width="332" height="471" /&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;(3) ListView&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;ListView就是竖向滚动显示的列表。实现ListView方式有两种，先来看一下与上面Spinner类似的方式：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;新建一项目，修改res/layout/main.xml内容为：&lt;/p&gt;&#xD;
&lt;pre &gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&#xD;
&amp;lt;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"&#xD;
	android:orientation="vertical" android:layout_width="fill_parent"&#xD;
	android:layout_height="fill_parent"&amp;gt;&#xD;
	&amp;lt;ListView android:id="@+id/listview" android:layout_width="fill_parent"&#xD;
		android:layout_height="fill_parent" android:drawSelectorOnTop="false" /&amp;gt;&#xD;
&amp;lt;/LinearLayout&amp;gt;&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;java代码如下：&lt;/p&gt;&#xD;
&lt;pre &gt;public class ListViewDemo extends Activity {&#xD;
	final String[] COUNTRIES = new String[] { "Afghanistan", "Australia",&#xD;
			"America", "Canada", "Chile", "China" };&#xD;
	&#xD;
    @Override&#xD;
    public void onCreate(Bundle savedInstanceState) {&#xD;
        super.onCreate(savedInstanceState);&#xD;
        setContentView(R.layout.main);&#xD;
        &#xD;
        ListView listview = (ListView)findViewById(R.id.listview);&#xD;
        &#xD;
        ArrayAdapter&amp;lt;String&amp;gt; adapter = new ArrayAdapter&amp;lt;String&amp;gt;(this, &#xD;
        					android.R.layout.simple_list_item_1, COUNTRIES);&#xD;
        listview.setAdapter(adapter);&#xD;
    }&#xD;
}&lt;/pre&gt;&#xD;
&lt;p&gt;代码与上面Spinner类似，下面来看另一种方式就是使用ListActivity，ListActivity包含了一个ListView, 如果你的Activity就是显示一个列表，那么你可以让你的Activity直接继承ListActivity, 甚至不用设置布局，ListActivity就可以生成一个全屏显示的列表。如果需要自定义布局，必须设置ListView的android:id="@android:id/list", 这样ListActivity才会知道对应哪个ListView。 &lt;/p&gt;&#xD;
&lt;p&gt;main.xml代码如下：&lt;/p&gt;&#xD;
&lt;pre &gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&#xD;
&amp;lt;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"&#xD;
	android:orientation="vertical" android:layout_width="fill_parent"&#xD;
	android:layout_height="fill_parent"&amp;gt;&#xD;
	&amp;lt;ListView android:id="@android:id/list" android:layout_width="fill_parent"&#xD;
		android:layout_height="fill_parent" android:drawSelectorOnTop="false" /&amp;gt;&#xD;
&amp;lt;/LinearLayout&amp;gt;&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;java代码如下：&lt;/p&gt;&#xD;
&lt;pre &gt;public class ListViewDemo2 extends ListActivity {&#xD;
	final String[] COUNTRIES = new String[] { "Afghanistan", "Australia",&#xD;
			"America", "Canada", "Chile", "China" };&#xD;
	&#xD;
    @Override&#xD;
    public void onCreate(Bundle savedInstanceState) {&#xD;
        super.onCreate(savedInstanceState);&#xD;
        setContentView(R.layout.main);&#xD;
        &#xD;
        &#xD;
        ArrayAdapter&amp;lt;String&amp;gt; adapter = new ArrayAdapter&amp;lt;String&amp;gt;(this, &#xD;
        					android.R.layout.simple_list_item_1, COUNTRIES);&#xD;
        setListAdapter(adapter);&#xD;
    }&#xD;
}&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;运行效果如下：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/chunhui588/WindowsLiveWriter/AndroidAutoCompleteTextViewSpinnerListVi_D82D/image_6.png"&gt;&lt;img style="display: inline; border-width: 0px;" title="image" src="http://images.cnblogs.com/cnblogs_com/chunhui588/WindowsLiveWriter/AndroidAutoCompleteTextViewSpinnerListVi_D82D/image_thumb_2.png" border="0" alt="image" width="328" height="478" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;希望本文对您有所帮助，其它与Android相关文章如下：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://www.cnblogs.com/chunhui588/archive/2010/06/26/Android-debug-main-out-xml-parsing-error.html" target="_blank"&gt;Android程序调试时生成main.out.xml文件&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://www.cnblogs.com/chunhui588/archive/2010/07/04/Using-Git-Repo-To-Get-Android-SourceCode.html" target="_blank"&gt;使用Git和Repo获取Android源码&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://www.cnblogs.com/chunhui588/archive/2010/07/10/Introducing-Android.html" target="_blank"&gt;Introducing Android&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://www.cnblogs.com/chunhui588/archive/2010/07/10/Hello-Android.html" target="_blank"&gt;Hello Android&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://www.cnblogs.com/chunhui588/archive/2010/07/16/Android-Project-Structure.html" target="_blank"&gt;Android Project Structure(项目结构)&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://www.cnblogs.com/chunhui588/archive/2010/10/01/Android_Toast_And_AlertDialog.html" target="_blank"&gt;Android消息提示框和对话框&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://www.cnblogs.com/chunhui588/archive/2010/10/02/Android_Layout.html" target="_blank"&gt;Android Layout 布局&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;参考书籍：Beginning Android 2 和Android官方文档&lt;/p&gt;&lt;img src="http://www.cnblogs.com/chunhui588/aggbug/1841673.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chunhui588/archive/2010/10/03/Android_How_to_Use_AutoCompleteTextView_Spinner_ListView.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/chunhui588/archive/2010/10/02/Android_Layout.html</id><title type="text">Android Layout 布局</title><summary type="text">一个Android视图有很多控件，那么怎么来控制它们的位置排列呢?我们需要容器来存放这些控件并控制它们的位置排列，就像HTML中div, table一样，Android布局也起到同样的作用。 Android布局主要有以下几种: LinearLayout, RelativeLayout,TableLayout,AbsoluteLayout. 最后一种AbsoluteLayout是通过指定控件的x/y...</summary><published>2010-10-02T04:39:00Z</published><updated>2010-10-02T04:39:00Z</updated><author><name>Benjamin  Wang</name><uri>http://www.cnblogs.com/chunhui588/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chunhui588/archive/2010/10/02/Android_Layout.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chunhui588/archive/2010/10/02/Android_Layout.html"/><content type="html">&lt;p&gt;一个Android视图有很多控件，那么怎么来控制它们的位置排列呢?我们需要容器来存放这些控件并控制它们的位置排列，就像HTML中div, table一样，Android布局也起到同样的作用。&lt;/p&gt; &lt;p&gt;Android布局主要有以下几种: LinearLayout, RelativeLayout,TableLayout,AbsoluteLayout. 最后一种AbsoluteLayout是通过指定控件的x/y坐标来定位的，不太灵活所以已经不推荐使用了。&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;(1) LinearLayout&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;LinearLayout线性布局，包含在LinearLayout里面的控件按顺序排列成一行或者一列，类似于Swing里的FlowLayout和Silverlight里的StackPanel，它的常用的属性主要包括：&lt;/p&gt; &lt;p&gt;Orientation方向，即指定LinearLayout是代表一行还是一列，可以为horizontal或vertical，如android:orientation="vertical"，当然也在可以在代码里通过setOrientation()方法来设置。&lt;/p&gt; &lt;p&gt;Fill Mode填充方式，所有在LinearLayout的控件都必须指定它的填充方式, 即设置android:layout_width和android:layout_height，可以为三种值(1)具体的像素值，如20px (2) wrap_content, 表示按控件文本实际长度显示 (3) fill_parent, 表示填充剩下的所有可用空间。&lt;/p&gt; &lt;p&gt;Weight权重，如果你想让一行或一列的控件按比例显示，这时候权重就起到作用了，如想让一行里面两控件其中一控件占两倍于另一控件的空间，可以把其中一控件的android:layout_weight设置为1, 另一个为2 即可。&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;在前面一篇&lt;a href="http://www.cnblogs.com/chunhui588/archive/2010/10/01/Android_Toast_And_AlertDialog.html" target="_blank"&gt;Android消息提示框和对话框&lt;/a&gt;也有个LinearLayout的例子, 现在来看一下Android官方的一个Demo:&lt;/p&gt;&lt;pre &gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&#xD;
&amp;lt;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"&#xD;
	android:orientation="vertical" android:layout_width="fill_parent"&#xD;
	android:layout_height="fill_parent"&amp;gt;&#xD;
	&amp;lt;LinearLayout android:orientation="horizontal"&#xD;
		android:layout_width="fill_parent" android:layout_height="fill_parent"&#xD;
		android:layout_weight="1"&amp;gt;&#xD;
		&amp;lt;TextView android:text="red" android:gravity="center_horizontal"&#xD;
			android:background="#aa0000" android:layout_width="wrap_content"&#xD;
			android:layout_height="fill_parent" android:layout_weight="1" /&amp;gt;&#xD;
		&amp;lt;TextView android:text="green" android:gravity="center_horizontal"&#xD;
			android:background="#00aa00" android:layout_width="wrap_content"&#xD;
			android:layout_height="fill_parent" android:layout_weight="1" /&amp;gt;&#xD;
		&amp;lt;TextView android:text="blue" android:gravity="center_horizontal"&#xD;
			android:background="#0000aa" android:layout_width="wrap_content"&#xD;
			android:layout_height="fill_parent" android:layout_weight="1" /&amp;gt;&#xD;
		&amp;lt;TextView android:text="yellow" android:gravity="center_horizontal"&#xD;
			android:background="#aaaa00" android:layout_width="wrap_content"&#xD;
			android:layout_height="fill_parent" android:layout_weight="1" /&amp;gt;&#xD;
	&amp;lt;/LinearLayout&amp;gt;&#xD;
	&amp;lt;LinearLayout android:orientation="vertical"&#xD;
		android:layout_width="fill_parent" android:layout_height="fill_parent"&#xD;
		android:layout_weight="1"&amp;gt;&#xD;
		&amp;lt;TextView android:text="row one" android:textSize="15pt"&#xD;
			android:layout_width="fill_parent" android:layout_height="wrap_content"&#xD;
			android:layout_weight="1" /&amp;gt;&#xD;
		&amp;lt;TextView android:text="row two" android:textSize="15pt"&#xD;
			android:layout_width="fill_parent" android:layout_height="wrap_content"&#xD;
			android:layout_weight="1" /&amp;gt;&#xD;
		&amp;lt;TextView android:text="row three" android:textSize="15pt"&#xD;
			android:layout_width="fill_parent" android:layout_height="wrap_content"&#xD;
			android:layout_weight="1" /&amp;gt;&#xD;
		&amp;lt;TextView android:text="row four" android:textSize="15pt"&#xD;
			android:layout_width="fill_parent" android:layout_height="wrap_content"&#xD;
			android:layout_weight="1" /&amp;gt;&#xD;
	&amp;lt;/LinearLayout&amp;gt;&#xD;
&amp;lt;/LinearLayout&amp;gt;&lt;/pre&gt;&lt;pre &gt;&lt;/pre&gt;&#xD;
&lt;p&gt;可以看到父类LinearLayout包含了一个水平布局的LinearLayout和一个垂直布局的LinearLayout，它们分别包含了四个平分宽度和高度的TextView，运行效果如下：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/chunhui588/WindowsLiveWriter/AndroidLayout_A56F/image_2.png"&gt;&lt;img title="image" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="485" alt="image" src="http://images.cnblogs.com/cnblogs_com/chunhui588/WindowsLiveWriter/AndroidLayout_A56F/image_thumb.png" width="327" border="0"&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;(2) RelativeLayout&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;相对布局，它是依靠与父容器，同一容器中其它控件的相对位置来排列显示的。主要常用的属性如下：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;相对父容器的属性：&lt;/p&gt;&#xD;
&lt;p&gt;android:layout_alignParentTop: 控件的顶部与父容器的顶部对齐，类似的几个属性从名字可以看出它们的作用：android:layout_alignParentBottom, android:layout_alignParentLeft, android:layout_alignParentRight.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;相对同一容器中其它控件的属性：&lt;/p&gt;&#xD;
&lt;p&gt;android:layout_above: 表示此控件在另一控件的上面，类似的还有android:layout_below, android:layout_toLeftOf, android:layout_toRightOf.&lt;/p&gt;&#xD;
&lt;p&gt;android:layout_alignTop: 表示此控件与另一控件顶部对齐，类似的还有android:layout_alignBottom, android:layout_alignLeft, android:layout_alignRight.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;既然是相对于另一个控件，就必须在定义这控件时候指定是哪个控件，如控件A的ID为@+id/widget_a, 控件B若要在控件A下面可以这样设置android:layout_below="@id/widget_a"。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;来看一下官方的一个Demo:&lt;/p&gt;&lt;pre &gt;&amp;lt;RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"&#xD;
	android:layout_width="fill_parent" android:layout_height="fill_parent"&amp;gt;&#xD;
	&amp;lt;TextView android:id="@+id/label" android:layout_width="fill_parent"&#xD;
		android:layout_height="wrap_content" android:text="Type here:" /&amp;gt;&#xD;
	&amp;lt;EditText android:id="@+id/entry" android:layout_width="fill_parent"&#xD;
		android:layout_height="wrap_content" android:background="@android:drawable/editbox_background"&#xD;
		android:layout_below="@id/label" /&amp;gt;&#xD;
	&amp;lt;Button android:id="@+id/ok" android:layout_width="wrap_content"&#xD;
		android:layout_height="wrap_content" android:layout_below="@id/entry"&#xD;
		android:layout_alignParentRight="true" android:layout_marginLeft="10dip"&#xD;
		android:text="OK" /&amp;gt;&#xD;
	&amp;lt;Button android:layout_width="wrap_content"&#xD;
		android:layout_height="wrap_content" android:layout_toLeftOf="@id/ok"&#xD;
		android:layout_alignTop="@id/ok" android:text="Cancel" /&amp;gt;&#xD;
&amp;lt;/RelativeLayout&amp;gt;&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;运行效果如下：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/chunhui588/WindowsLiveWriter/AndroidLayout_A56F/image_4.png"&gt;&lt;img title="image" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="449" alt="image" src="http://images.cnblogs.com/cnblogs_com/chunhui588/WindowsLiveWriter/AndroidLayout_A56F/image_thumb_1.png" width="331" border="0"&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;(3) TableLayout&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;表格布局，类似于HTML的Table和Silverlight的Grid。通过TableRow来定义一行，如果一个控件占用多列可以设置android:layout_span, 类似于HTML的colspan。默认情况下一个控件是按顺序放置在每一列的(column 0, column 1….), 也可以通过android:layout_column指定放在哪一列。如果一列内容过长或者过短，可以通过android:stretchColumns和android:shrinkColumns来增加或者减少此列的宽度。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;来看一下官方的一个Demo:&lt;/p&gt;&lt;pre &gt;&amp;lt;TableLayout xmlns:android="http://schemas.android.com/apk/res/android"&#xD;
	android:layout_width="fill_parent" android:layout_height="fill_parent"&#xD;
	android:stretchColumns="1"&amp;gt;&#xD;
	&amp;lt;TableRow&amp;gt;&#xD;
		&amp;lt;TextView android:layout_column="1" android:text="Open..."&#xD;
			android:padding="3dip" /&amp;gt;&#xD;
		&amp;lt;TextView android:text="Ctrl-O" android:gravity="right"&#xD;
			android:padding="3dip" /&amp;gt;&#xD;
	&amp;lt;/TableRow&amp;gt;&#xD;
	&amp;lt;TableRow&amp;gt;&#xD;
		&amp;lt;TextView android:layout_column="1" android:text="Save..."&#xD;
			android:padding="3dip" /&amp;gt;&#xD;
		&amp;lt;TextView android:text="Ctrl-S" android:gravity="right"&#xD;
			android:padding="3dip" /&amp;gt;&#xD;
	&amp;lt;/TableRow&amp;gt;&#xD;
	&amp;lt;TableRow&amp;gt;&#xD;
		&amp;lt;TextView android:layout_column="1" android:text="Save As..."&#xD;
			android:padding="3dip" /&amp;gt;&#xD;
		&amp;lt;TextView android:text="Ctrl-Shift-S" android:gravity="right"&#xD;
			android:padding="3dip" /&amp;gt;&#xD;
	&amp;lt;/TableRow&amp;gt;&#xD;
	&amp;lt;View android:layout_height="2dip" android:background="#FF909090" /&amp;gt;&#xD;
	&amp;lt;TableRow&amp;gt;&#xD;
		&amp;lt;TextView android:text="X" android:padding="3dip" /&amp;gt;&#xD;
		&amp;lt;TextView android:text="Import..." android:padding="3dip" /&amp;gt;&#xD;
	&amp;lt;/TableRow&amp;gt;&#xD;
	&amp;lt;TableRow&amp;gt;&#xD;
		&amp;lt;TextView android:text="X" android:padding="3dip" /&amp;gt;&#xD;
		&amp;lt;TextView android:text="Export..." android:padding="3dip" /&amp;gt;&#xD;
		&amp;lt;TextView android:text="Ctrl-E" android:gravity="right"&#xD;
			android:padding="3dip" /&amp;gt;&#xD;
	&amp;lt;/TableRow&amp;gt;&#xD;
	&amp;lt;View android:layout_height="2dip" android:background="#FF909090" /&amp;gt;&#xD;
	&amp;lt;TableRow&amp;gt;&#xD;
		&amp;lt;TextView android:layout_column="1" android:text="Quit"&#xD;
			android:padding="3dip" /&amp;gt;&#xD;
	&amp;lt;/TableRow&amp;gt;&#xD;
&amp;lt;/TableLayout&amp;gt;&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这个表格有三列，通过设置android:stretchColumns="1"来增加了第二列的宽度。运行效果如下：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/chunhui588/WindowsLiveWriter/AndroidLayout_A56F/image_6.png"&gt;&lt;img title="image" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="451" alt="image" src="http://images.cnblogs.com/cnblogs_com/chunhui588/WindowsLiveWriter/AndroidLayout_A56F/image_thumb_2.png" width="332" border="0"&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;希望本文对您有所帮助，其它与Android相关文章如下：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://www.cnblogs.com/chunhui588/archive/2010/06/26/Android-debug-main-out-xml-parsing-error.html" target="_blank"&gt;Android程序调试时生成main.out.xml文件&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://www.cnblogs.com/chunhui588/archive/2010/07/04/Using-Git-Repo-To-Get-Android-SourceCode.html" target="_blank"&gt;使用Git和Repo获取Android源码&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://www.cnblogs.com/chunhui588/archive/2010/07/10/Introducing-Android.html" target="_blank"&gt;Introducing Android&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://www.cnblogs.com/chunhui588/archive/2010/07/10/Hello-Android.html" target="_blank"&gt;Hello Android&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://www.cnblogs.com/chunhui588/archive/2010/07/16/Android-Project-Structure.html" target="_blank"&gt;Android Project Structure(项目结构)&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://www.cnblogs.com/chunhui588/archive/2010/10/01/Android_Toast_And_AlertDialog.html" target="_blank"&gt;Android消息提示框和对话框&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;参考书籍：Beginning Android 2 和Android官方文档&lt;/p&gt;&lt;img src="http://www.cnblogs.com/chunhui588/aggbug/1841279.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chunhui588/archive/2010/10/02/Android_Layout.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/chunhui588/archive/2010/10/01/Android_Toast_And_AlertDialog.html</id><title type="text">Android消息提示框和对话框</title><summary type="text">在某些情况下需要向用户弹出提示消息，如显示错误信息，收到短消息等，Android提供两种弹出消息的方式，消息提示框toasts和对话框alerts。  Toast是一种短暂的消息提示，显示一段时间后不需要用户交互会自动消失，所以用来显示一些建议性的不太重要的消息，如提示用户后台一个任务完成了。 使用Toast来弹出提示消息也很简单，调用Toast类的静态方法makeText():  public ...</summary><published>2010-10-01T11:05:00Z</published><updated>2010-10-01T11:05:00Z</updated><author><name>Benjamin  Wang</name><uri>http://www.cnblogs.com/chunhui588/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chunhui588/archive/2010/10/01/Android_Toast_And_AlertDialog.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chunhui588/archive/2010/10/01/Android_Toast_And_AlertDialog.html"/><content type="html">&lt;p&gt;在某些情况下需要向用户弹出提示消息，如显示错误信息，收到短消息等，Android提供两种弹出消息的方式，消息提示框toasts和对话框alerts。&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;Toast是一种短暂的消息提示，显示一段时间后不需要用户交互会自动消失，所以用来显示一些建议性的不太重要的消息，如提示用户后台一个任务完成了。&lt;/p&gt; &lt;p&gt;使用Toast来弹出提示消息也很简单，调用Toast类的静态方法makeText():&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;public static Toast makeText (Context context, CharSequence text, int duration)&lt;/p&gt; &lt;p&gt;context: 调用的上下文，通常为Application或Activity对象 &lt;/p&gt; &lt;p&gt;text: 显示的消息 &lt;/p&gt; &lt;p&gt;duration: 显示的时间长短，为 Toast.LENGTH_LONG或Toast.LENGTH_SHORT &lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;如可以这样调用：Toast.makeText(this, "Deleted Successfully!", Toast.LENGTH_LONG).show(); 效果如下：&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/chunhui588/WindowsLiveWriter/Android_10C36/image_2.png"&gt;&lt;img title="image" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="487" alt="image" src="http://images.cnblogs.com/cnblogs_com/chunhui588/WindowsLiveWriter/Android_10C36/image_thumb.png" width="329" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;AlertDialog类似于传统的模式对话框，需要与用户交互后才会关闭。&lt;/p&gt; &lt;p&gt;最简单的创建AlertDialog对话框的方法是使用AlertDialog的嵌套类Builder，它有下面几个主要的方法：&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;setMessage(): 设置显示的消息内容&lt;/p&gt; &lt;p&gt;setTitle() 和setIcon(): 设置对话框的标题栏的文字和图标&lt;/p&gt; &lt;p&gt;setPositiveButton(), setNeutralButton()和setNegativeButton(): 设置对话框的按钮，包括按钮显示的文字，按钮点击的事件&lt;/p&gt; &lt;p&gt;setView(): 设置对话框显示一个自定义的视图&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;自定义视图addemployee.xml代码如下, 需要注意的是布局文件的名称只能包含“a-z0-9_.”，不然就会报这样的错误：“Invalid file name: must contain only [a-z0-9_.]”&lt;/p&gt;&lt;pre &gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&#xD;
&amp;lt;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"&#xD;
	android:layout_width="fill_parent" android:layout_height="fill_parent"&#xD;
	android:orientation="vertical"&amp;gt;&#xD;
	&amp;lt;LinearLayout android:layout_width="fill_parent"&#xD;
		android:layout_height="wrap_content" android:orientation="horizontal"&amp;gt;&#xD;
		&amp;lt;TextView android:layout_width="wrap_content"&#xD;
			android:layout_height="wrap_content" android:text="Name:" /&amp;gt;&#xD;
		&amp;lt;EditText android:layout_width="fill_parent"&#xD;
			android:layout_height="wrap_content" android:id="@+id/editName"&amp;gt;&amp;lt;/EditText&amp;gt;&#xD;
	&amp;lt;/LinearLayout&amp;gt;&#xD;
	&amp;lt;LinearLayout android:layout_width="fill_parent"&#xD;
		android:layout_height="wrap_content" android:orientation="horizontal"&amp;gt;&#xD;
		&amp;lt;TextView android:layout_width="wrap_content"&#xD;
			android:layout_height="wrap_content" android:text="Age:"&amp;gt;&amp;lt;/TextView&amp;gt;&#xD;
		&amp;lt;EditText android:layout_width="fill_parent"&#xD;
			android:layout_height="wrap_content" android:id="@+id/editAge" android:inputType="number"&amp;gt;&amp;lt;/EditText&amp;gt;&#xD;
	&amp;lt;/LinearLayout&amp;gt;&#xD;
&amp;lt;/LinearLayout&amp;gt;&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;生成对话框的代码如下所示：&lt;/p&gt;&lt;pre &gt;LayoutInflater layoutInflater = LayoutInflater.from(this);&#xD;
	     viewAddEmployee = layoutInflater.inflate(R.layout.addemployee, null);&#xD;
&#xD;
	     new AlertDialog.Builder(this).setTitle("Add Employee").setView(&#xD;
				viewAddEmployee).setPositiveButton("OK",&#xD;
				new DialogInterface.OnClickListener() {&#xD;
					@Override&#xD;
					public void onClick(DialogInterface dialog, int which) {&#xD;
						insertEmployee();&#xD;
					}&#xD;
				}).setNegativeButton("Cancel",&#xD;
				new DialogInterface.OnClickListener() {&#xD;
					@Override&#xD;
					public void onClick(DialogInterface dialog, int which) {&#xD;
						&#xD;
					}&#xD;
				}).show();&lt;/pre&gt;&lt;pre &gt;&lt;/pre&gt;&#xD;
&lt;p&gt;这里先加载了一个自定义的视图, 并通过setView()设置对话框显示这个自定义视图, 并添加了两个按钮和相应的点击事件, 运行效果如下：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/chunhui588/WindowsLiveWriter/Android_10C36/image_4.png"&gt;&lt;img title="image" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="491" alt="image" src="http://images.cnblogs.com/cnblogs_com/chunhui588/WindowsLiveWriter/Android_10C36/image_thumb_1.png" width="334" border="0"&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;希望本文对您有所帮助。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;参考书籍：Beginning Android 2 和Android官方文档&lt;/p&gt;&lt;img src="http://www.cnblogs.com/chunhui588/aggbug/1840622.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chunhui588/archive/2010/10/01/Android_Toast_And_AlertDialog.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/chunhui588/archive/2010/09/12/Silverlight_The_URI_prefix_is_not_recognized.html</id><title type="text">Silverlight Exception: “The URI prefix is not recognized.”</title><summary type="text">在写前一篇Silverlight4中使用WebClient类下载压缩成zip格式的图片的过程中，遇到了下面这个异常:{System.Net.WebException: WebClient 请求期间发生异常。 ---&amp;gt; System.NotSupportedException: 无法识别 URI 前缀。 位于 System.Net.WebRequest.Create(Uri requestUr...</summary><published>2010-09-12T05:25:00Z</published><updated>2010-09-12T05:25:00Z</updated><author><name>Benjamin  Wang</name><uri>http://www.cnblogs.com/chunhui588/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chunhui588/archive/2010/09/12/Silverlight_The_URI_prefix_is_not_recognized.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chunhui588/archive/2010/09/12/Silverlight_The_URI_prefix_is_not_recognized.html"/><content type="html">&lt;p&gt;在写前一篇&lt;a target="_blank" href="http://www.cnblogs.com/chunhui588/archive/2010/09/12/Using_WebClient_Download_Pictures_Of_Zip_Format_In_Silverlight.html"&gt;Silverlight4中使用WebClient类下载压缩成zip格式的图片&lt;/a&gt;的过程中，遇到了下面这个异常:&lt;/p&gt;&#xD;
&lt;p&gt;{System.Net.WebException: WebClient 请求期间发生异常。 ---&amp;gt; System.NotSupportedException: 无法识别 URI 前缀。&lt;br /&gt;&amp;nbsp;&amp;nbsp; 位于 System.Net.WebRequest.Create(Uri requestUri)&lt;br /&gt;&amp;nbsp;&amp;nbsp; 位于 System.Net.WebClient.GetWebRequest(Uri address)&lt;br /&gt;&amp;nbsp;&amp;nbsp; 位于 System.Net.WebClient.OpenReadAsync(Uri address, Object userToken)&lt;br /&gt;&amp;nbsp;&amp;nbsp; --- 内部异常堆栈跟踪的结尾 ---}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [System.Net.WebException]: {System.Net.WebException: WebClient 请求期间发生异常。 ---&amp;gt; System.NotSupportedException: 无法识别 URI 前缀。&lt;br /&gt;&amp;nbsp;&amp;nbsp; 位于 System.Net.WebRequest.Create(Uri requestUri)&lt;br /&gt;&amp;nbsp;&amp;nbsp; 位于 System.Net.WebClient.GetWebRequest(Uri address)&lt;br /&gt;&amp;nbsp;&amp;nbsp; 位于 System.Net.WebClient.OpenReadAsync(Uri address, Object userToken)&lt;br /&gt;&amp;nbsp;&amp;nbsp; --- 内部异常堆栈跟踪的结尾 ---}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Data: {System.Collections.ListDictionaryInternal}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; InnerException: {System.NotSupportedException: 无法识别 URI 前缀。&lt;br /&gt;&amp;nbsp;&amp;nbsp; 位于 System.Net.WebRequest.Create(Uri requestUri)&lt;br /&gt;&amp;nbsp;&amp;nbsp; 位于 System.Net.WebClient.GetWebRequest(Uri address)&lt;br /&gt;&amp;nbsp;&amp;nbsp; 位于 System.Net.WebClient.OpenReadAsync(Uri address, Object userToken)}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Message: "WebClient 请求期间发生异常。"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; StackTrace: null &lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;调试后发现WebClient对象的BaseAddress值如下:&lt;/p&gt;&#xD;
&lt;p&gt;wc.BaseAddress&lt;br /&gt;file:///C:/&amp;hellip;./SilverlightApplication1/SilverlightApplication1/Bin/Debug/SilverlightApplication1.xap &lt;/p&gt;&#xD;
&lt;p&gt;怎么会是本地的地址呢?应该是基于HTTP的URI才对啊。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;最终发现我在运行Silverlight程序是通过直接在Silverlight Application项目里创建的TestPage来测试的，而没有创建Silverlight宿主网站来测试。虽然在有些情况下直接在Silverlight Application项目创建一个TestPage来测试也是可行的，这样只需build一个项目就可以看到运行结果，但某些情况下还是会出问题的，所以还是推荐大家在创建Silverlight Application项目的同时就创建一个宿主的网站。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/chunhui588/WindowsLiveWriter/SilverlightExceptionTheURIprefixisnotre_BCBF/image_2.png"&gt;&lt;img border="0" width="516" src="http://images.cnblogs.com/cnblogs_com/chunhui588/WindowsLiveWriter/SilverlightExceptionTheURIprefixisnotre_BCBF/image_thumb.png" alt="image" height="461" style="display: inline; border: 0px;" title="image" /&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;创建宿主网站后再运行发现wc.BaseAddress值变为"http://localhost:7908/ClientBin/MySilverlightApplication.xap&amp;rdquo;, 一切正常。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/chunhui588/aggbug/1824369.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chunhui588/archive/2010/09/12/Silverlight_The_URI_prefix_is_not_recognized.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/chunhui588/archive/2010/09/12/Using_WebClient_Download_Pictures_Of_Zip_Format_In_Silverlight.html</id><title type="text">Silverlight4中使用WebClient类下载压缩成zip格式的图片</title><summary type="text">Silverlight与其它系统通信的方式主要有三种，通过WCF或者Web Service,HTTP直接通信和Socket通信。  HTTP直接通信可以使用WebClient类和HttpWebRequest类。WebClient提供了一种简单的基于事件的模型来让你以流或者字符串的方式下载和上传资源, 而HttpWebRequest提供了更复杂的通信场景,使用.NET异步编程模式来发送请求。  这里...</summary><published>2010-09-12T00:51:00Z</published><updated>2010-09-12T00:51:00Z</updated><author><name>Benjamin  Wang</name><uri>http://www.cnblogs.com/chunhui588/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chunhui588/archive/2010/09/12/Using_WebClient_Download_Pictures_Of_Zip_Format_In_Silverlight.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chunhui588/archive/2010/09/12/Using_WebClient_Download_Pictures_Of_Zip_Format_In_Silverlight.html"/><content type="html">&lt;p&gt;Silverlight与其它系统通信的方式主要有三种，通过WCF或者Web Service,HTTP直接通信和Socket通信。&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;HTTP直接通信可以使用WebClient类和HttpWebRequest类。WebClient提供了一种简单的基于事件的模型来让你以流或者字符串的方式下载和上传资源, 而HttpWebRequest提供了更复杂的通信场景,使用.NET异步编程模式来发送请求。&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;这里我使用WebClient类来下载压缩成zip格式的图片, 这也是Silverlight的一个优点，就是图片，视频等资源文件可以压缩成zip格式，然后通过WebClient类下载到客户端, 然后把zip文件里面的资源与相应的MediaElement或者Image关联起来就可以显示了。本例运行之后的效果如下：&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/chunhui588/WindowsLiveWriter/Silverlight4WebClientzip_13A31/image_4.png"&gt;&lt;img title="image" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="442" alt="image" src="http://images.cnblogs.com/cnblogs_com/chunhui588/WindowsLiveWriter/Silverlight4WebClientzip_13A31/image_thumb_1.png" width="466" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;点击Download按钮去下载zip文件，ListBox是硬编码绑定了几张图片列表,在ListBox中点击图片列表在右边的Image控件中显示相应的图片。&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;先看一下XAML代码:&lt;/p&gt;&lt;pre &gt;&amp;lt;Grid x:Name="LayoutRoot" Background="White"&amp;gt;&#xD;
        &amp;lt;Button Content="Download" Height="25" HorizontalAlignment="Left" Margin="12,21,0,0" Name="downloadButton" VerticalAlignment="Top" Width="107" Click="downloadButton_Click" /&amp;gt;&#xD;
        &amp;lt;ListBox Name="imageListBox" Height="234" HorizontalAlignment="Left" Margin="12,54,0,0" VerticalAlignment="Top" Width="135" SelectionChanged="imageListBox_SelectionChanged" Visibility="Collapsed"/&amp;gt;&#xD;
        &amp;lt;Image Height="234" HorizontalAlignment="Left" Margin="164,54,0,0" Name="image" Stretch="Fill" VerticalAlignment="Top" Width="224" /&amp;gt;&#xD;
&amp;lt;/Grid&amp;gt;&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;接下来看一下WebClient类的一些成员:&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/chunhui588/WindowsLiveWriter/Silverlight4WebClientzip_13A31/image_8.png"&gt;&lt;img title="image" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="442" alt="image" src="http://images.cnblogs.com/cnblogs_com/chunhui588/WindowsLiveWriter/Silverlight4WebClientzip_13A31/image_thumb_3.png" width="820" border="0"&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这里用到OpenReadAsync方法以流的方式异步下载zip文件, 并在OpenReadCompleted事件中即下载完成后获得这个流。代码如下所示：&lt;/p&gt;&lt;pre &gt;private StreamResourceInfo imageResources;&#xD;
&#xD;
        private void downloadButton_Click(object sender, RoutedEventArgs e)&#xD;
        {&#xD;
            WebClient wc = new WebClient();&#xD;
&#xD;
            wc.OpenReadCompleted += new OpenReadCompletedEventHandler(wc_OpenReadCompleted);&#xD;
            wc.OpenReadAsync(new Uri("/Resource/images.zip", UriKind.Relative));&#xD;
        }&#xD;
&#xD;
        void wc_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)&#xD;
        {&#xD;
            if (e.Error == null)&#xD;
            {&#xD;
                imageResources = new StreamResourceInfo(e.Result, null);&#xD;
                this.imageListBox.Visibility = System.Windows.Visibility.Visible;&#xD;
            }&#xD;
            else&#xD;
            {&#xD;
                throw e.Error;&#xD;
            }&#xD;
        }&lt;/pre&gt;&#xD;
&lt;p&gt;在OpenReadCompleted事件若下载没有发生异常，ListBox被设置为可见并用System.Windows.Resources.StreamResourceInfo类对象来保存下载的zip流。&lt;/p&gt;&#xD;
&lt;p&gt;需要注意的是Uri路径的问题, 具有前导斜杠的相对 URI 表示相对于应用程序根的位置：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/chunhui588/WindowsLiveWriter/Silverlight4WebClientzip_13A31/image_6.png"&gt;&lt;img title="image" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="372" alt="image" src="http://images.cnblogs.com/cnblogs_com/chunhui588/WindowsLiveWriter/Silverlight4WebClientzip_13A31/image_thumb_2.png" width="304" border="0"&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;最后看一下取得图片并显示的代码：&lt;/p&gt;&lt;pre &gt;private void imageListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)&#xD;
        {&#xD;
            BitmapImage bitmapImageSource = new BitmapImage();&#xD;
&#xD;
            StreamResourceInfo imageResourceInfo = Application.GetResourceStream(imageResources, new Uri(this.imageListBox.SelectedItem.ToString(), UriKind.Relative));&#xD;
            bitmapImageSource.SetSource(imageResourceInfo.Stream);&#xD;
&#xD;
            this.image.Source = bitmapImageSource;&#xD;
        }&lt;/pre&gt;&#xD;
&lt;p&gt;这里使用Application.GetResourceStream去获得一个特定图片, 图片的相对路径是相对于zip文件的图片路径。&lt;/p&gt;&#xD;
&lt;p&gt;完整的后台代码如下：&lt;/p&gt;&lt;pre &gt;public partial class WebClientDemo : UserControl&#xD;
    {&#xD;
        private StreamResourceInfo imageResources;&#xD;
&#xD;
        public WebClientDemo()&#xD;
        {&#xD;
            InitializeComponent();&#xD;
&#xD;
            List&amp;lt;string&amp;gt; imageList = new List&amp;lt;string&amp;gt; { "01.jpg", "02.jpg", "03.jpg" };&#xD;
            imageListBox.ItemsSource = imageList;&#xD;
        }&#xD;
&#xD;
        private void downloadButton_Click(object sender, RoutedEventArgs e)&#xD;
        {&#xD;
            WebClient wc = new WebClient();&#xD;
&#xD;
            wc.OpenReadCompleted += new OpenReadCompletedEventHandler(wc_OpenReadCompleted);&#xD;
            wc.OpenReadAsync(new Uri("/Resource/images.zip", UriKind.Relative));&#xD;
        }&#xD;
&#xD;
        void wc_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)&#xD;
        {&#xD;
            if (e.Error == null)&#xD;
            {&#xD;
                imageResources = new StreamResourceInfo(e.Result, null);&#xD;
                this.imageListBox.Visibility = System.Windows.Visibility.Visible;&#xD;
            }&#xD;
            else&#xD;
            {&#xD;
                throw e.Error;&#xD;
            }&#xD;
        }&#xD;
&#xD;
        private void imageListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)&#xD;
        {&#xD;
            BitmapImage bitmapImageSource = new BitmapImage();&#xD;
&#xD;
            StreamResourceInfo imageResourceInfo = Application.GetResourceStream(imageResources, new Uri(this.imageListBox.SelectedItem.ToString(), UriKind.Relative));&#xD;
            bitmapImageSource.SetSource(imageResourceInfo.Stream);&#xD;
&#xD;
            this.image.Source = bitmapImageSource;&#xD;
        }&#xD;
    }&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;参考书籍: Introducing Silverlight 4, MSDN&lt;/p&gt;&lt;img src="http://www.cnblogs.com/chunhui588/aggbug/1824261.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chunhui588/archive/2010/09/12/Using_WebClient_Download_Pictures_Of_Zip_Format_In_Silverlight.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/chunhui588/archive/2010/09/10/Silverlight4_Unable_to_start_debugging.html</id><title type="text">“Unable to start debugging. The Silverlight Developer Runtime is not installed. Please install a matching version.” 解决办法</title><summary type="text">今天在调试Silverlight 4程序时遇到了下面一个错误: 觉得很奇怪，Silverlight的程序可以运行但怎么不能调试呢？说一下我的环境是Visual Studio 2010 Ultimate, Silverlight SDK 4和Silverlight 4 Tools for Visual Studio 2010.后来发现已有人遇到同样的问题, 根据提示安装了Silverlight De...</summary><published>2010-09-10T14:52:00Z</published><updated>2010-09-10T14:52:00Z</updated><author><name>Benjamin  Wang</name><uri>http://www.cnblogs.com/chunhui588/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chunhui588/archive/2010/09/10/Silverlight4_Unable_to_start_debugging.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chunhui588/archive/2010/09/10/Silverlight4_Unable_to_start_debugging.html"/><content type="html">&lt;p&gt;今天在调试Silverlight 4程序时遇到了下面一个错误:&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/chunhui588/WindowsLiveWriter/Unabletostartdebugging.TheSilverlightDe_1408E/image_2.png"&gt;&lt;img border="0" width="413" src="http://images.cnblogs.com/cnblogs_com/chunhui588/WindowsLiveWriter/Unabletostartdebugging.TheSilverlightDe_1408E/image_thumb.png" alt="image" height="166" style="display: inline; border: 0px;" title="image" /&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;觉得很奇怪，Silverlight的程序可以运行但怎么不能调试呢？&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;说一下我的环境是Visual Studio 2010 Ultimate, Silverlight SDK 4和Silverlight 4 Tools for Visual Studio 2010.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;后来发现已有人遇到&lt;a target="_blank" href="http://forums.silverlight.net/forums/p/176999/421658.aspx"&gt;同样的问题&lt;/a&gt;, 根据提示安装了&lt;a target="_blank" href="http://go.microsoft.com/fwlink/?LinkID=188039"&gt;Silverlight Developer Runtime&lt;/a&gt;, 重新试了一下发现可以调试Silverlight 4程序了。&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/chunhui588/aggbug/1823671.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chunhui588/archive/2010/09/10/Silverlight4_Unable_to_start_debugging.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/chunhui588/archive/2010/07/16/Android-Project-Structure.html</id><title type="text">Android Project Structure(项目结构)</title><summary type="text">Introducing Android Hello Android 接着前两篇的内容，本文简要介绍一下Android的项目结构。  一个Android项目会包括java源文件，资源文件如图片，基于xml的布局文件等，第三方的jar包等。这些文件最终会被编译成一个.apk文件即Android应用程序可执行文件Android package file, .apk文件可以安装在模拟设备或者真机上。  看...</summary><published>2010-07-16T00:18:00Z</published><updated>2010-07-16T00:18:00Z</updated><author><name>Benjamin  Wang</name><uri>http://www.cnblogs.com/chunhui588/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chunhui588/archive/2010/07/16/Android-Project-Structure.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chunhui588/archive/2010/07/16/Android-Project-Structure.html"/><content type="html">&lt;p&gt;&lt;a target="_blank" href="http://www.cnblogs.com/chunhui588/archive/2010/07/10/Introducing-Android.html"&gt;Introducing Android&lt;/a&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;a target="_blank" href="http://www.cnblogs.com/chunhui588/archive/2010/07/10/Hello-Android.html"&gt;Hello Android&lt;/a&gt; &lt;/p&gt;&#xD;
&lt;p&gt;接着前两篇的内容，本文简要介绍一下Android的项目结构。 &lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;一个Android项目会包括java源文件，资源文件如图片，基于xml的布局文件等，第三方的jar包等。这些文件最终会被编译成一个.apk文件即Android应用程序可执行文件Android package file, .apk文件可以安装在模拟设备或者真机上。 &lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;看一下&lt;a target="_blank" href="http://www.cnblogs.com/chunhui588/archive/2010/07/10/Hello-Android.html"&gt;前一篇&lt;/a&gt;我们创建的HelloAndroid项目的结构图： &lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/chunhui588/WindowsLiveWriter/AndroidProjectStructure_149C5/image_2.png"&gt;&lt;img border="0" width="256" src="http://images.cnblogs.com/cnblogs_com/chunhui588/WindowsLiveWriter/AndroidProjectStructure_149C5/image_thumb.png" alt="image" height="389" style="display: inline; border: 0px;" title="image" /&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;可以看到Android项目主要包括： &lt;/p&gt;&#xD;
&lt;p&gt;src/: 存放java源文件 &lt;/p&gt;&#xD;
&lt;p&gt;gen/: 存放由Android编译工具生成的java源文件, 这些文件不能手动修改。如R.java就定义了一些常量，这些常量是对资源文件的索引，以便我们很方便的引用这些资源文件。 &lt;/p&gt;&#xD;
&lt;p&gt;assets/: 存放一些静态文件并将会被一起打包成.apk文件 &lt;/p&gt;&#xD;
&lt;p&gt;res/：存放资源文件 &lt;/p&gt;&#xD;
&lt;p&gt;res/drawable: 存放图片如PNG,JPEG等 &lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;pre&gt;res/drawable-ldpi/my_icon.png&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 存放低分辨率的图片&lt;br /&gt;res/drawable-mdpi/my_icon.png&amp;nbsp;&amp;nbsp; // 存放中等分辨率的图片&lt;br /&gt;res/drawable-hdpi/my_icon.png&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 存放高分辨率的图片&lt;br /&gt;&lt;/pre&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;res/layout: 存放基于xml的布局文件 &lt;/p&gt;&#xD;
&lt;p&gt;res/menu: 存放基于xml的菜单文件 &lt;/p&gt;&#xD;
&lt;p&gt;res/values: 存放字符串等资源文件，如多语言的文件 &lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;bin/:存放编译后的文件 &lt;/p&gt;&#xD;
&lt;p&gt;bin/&lt;em&gt;yourpackagename&lt;/em&gt;/classes/:存放java编译后的.class文件 &lt;/p&gt;&#xD;
&lt;p&gt;bin/classes.dex: class文件被转换成针对&lt;strong&gt;Dalvik&lt;/strong&gt;虚拟机优化的dex文件, 在&lt;a href="http://www.cnblogs.com/chunhui588/archive/2010/07/10/Introducing-Android.html"&gt;Introducing Android&lt;/a&gt;中有提及。 &lt;/p&gt;&#xD;
&lt;p&gt;bin/resources.ap_: 被压缩的资源文件类似zip文件。 &lt;/p&gt;&#xD;
&lt;p&gt;bin/&lt;em&gt;yourapp&lt;/em&gt;.apk: Android应用程序可执行文件,其实它也是个压缩的文件，包含了.dex文件，各种资源文件等。 &lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;AndroidManifest.xml是一个当前应用程序的组件清单,它列出了应用程序包含的各种activities,services，权限等, 下面看一下HelloAndroid项目中的AndroidManifest.xml文件：&lt;/p&gt;&#xD;
&lt;pre &gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&#xD;
&amp;lt;manifest xmlns:android="http://schemas.android.com/apk/res/android"&#xD;
      package="com.benjamin.helloandroid"&#xD;
      android:versionCode="1"&#xD;
      android:versionName="1.0"&amp;gt;&#xD;
    &amp;lt;application android:icon="@drawable/icon" android:label="@string/app_name"&amp;gt;&#xD;
        &amp;lt;activity android:name=".HelloAndroid"&#xD;
                  android:label="@string/app_name"&amp;gt;&#xD;
            &amp;lt;intent-filter&amp;gt;&#xD;
                &amp;lt;action android:name="android.intent.action.MAIN" /&amp;gt;&#xD;
                &amp;lt;category android:name="android.intent.category.LAUNCHER" /&amp;gt;&#xD;
            &amp;lt;/intent-filter&amp;gt;&#xD;
        &amp;lt;/activity&amp;gt;&#xD;
    &amp;lt;/application&amp;gt;&#xD;
&amp;lt;/manifest&amp;gt;&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;可以看到根元素manifest的定义, 首先声明了命名空间，指定了包名。android:versionCode是Android应用程序的版本号，一个整形的数字，在应用程序升级的时候会进行比较是否决定要更新。android:versionName是你自己为你应用程序定义一个版本代号，不必一定是数字，如&amp;rdquo;Tiger 2000&amp;rdquo;, &amp;ldquo;System X&amp;rdquo;等。如果你的应用程序要发布在Android Market的话，都需要指定android:versionCode和android:versionName这两项。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;android:icon表示你的应用程序显示的图标，"@drawable/icon&amp;rdquo;表示读取res/drawable下面icon这个图片，android:label表示应用程序的名称，"@string/app_name&amp;rdquo;表示读取res/values/strings.xml中app_name的值。activity的两个属性android:name和android:label分别表示这个activity的类名，activity的显示名称。intent-filter表示在什么条件下这个activity会显示。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;AndroidManifest.xml还包含很多元素，更详细的可以参考&lt;a target="_blank" href="http://developer.android.com/guide/topics/manifest/manifest-intro.html"&gt;官方的文档&lt;/a&gt;。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/chunhui588/aggbug/1777807.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chunhui588/archive/2010/07/16/Android-Project-Structure.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/chunhui588/archive/2010/07/10/Hello-Android.html</id><title type="text">Hello Android</title><summary type="text">继上篇简单介绍了一下Android系统，本文扼要地讲一下如何创建一个Android的程序Hello Android。  关于Android的开发平台的搭建，园子里很多前辈都有讲过了，这里简单的提一下。 首先要安装JDK 5 or 6, Eclipse 3.4 or 3.5, 以及Eclipse的插件Android Development Tools (ADT) Plugin, 最新版应该是ADT ...</summary><published>2010-07-10T12:21:00Z</published><updated>2010-07-10T12:21:00Z</updated><author><name>Benjamin  Wang</name><uri>http://www.cnblogs.com/chunhui588/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chunhui588/archive/2010/07/10/Hello-Android.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chunhui588/archive/2010/07/10/Hello-Android.html"/><content type="html">&lt;p&gt;继&lt;a href="http://www.cnblogs.com/chunhui588/archive/2010/07/10/Introducing-Android.html" target="_blank"&gt;上篇&lt;/a&gt;简单介绍了一下Android系统，本文扼要地讲一下如何创建一个Android的程序Hello Android。&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;关于Android的开发平台的搭建，园子里很多前辈都有讲过了，这里简单的提一下。&lt;/p&gt; &lt;p&gt;首先要安装JDK 5 or 6, Eclipse 3.4 or 3.5, 以及Eclipse的插件Android Development Tools (ADT) Plugin, 最新版应该是&lt;a href="http://developer.android.com/"&gt;ADT 0.9.7&lt;/a&gt;, &lt;a href="http://developer.android.com/sdk/eclipse-adt.html" target="_blank"&gt;这里&lt;/a&gt;有详细的安装步骤。然后去这里下载&lt;a href="http://developer.android.com/sdk/index.html" target="_blank"&gt;Android SDK&lt;/a&gt;,装完了以后可以把SDK安装目录下tools目录路径加入PATH环境变量，如C:\android-sdk-windows\tools, 它包含一些实用的工具，如模拟器Emulator,Android Debug Bridge (adb)等，这样的话就可以通过命令行运行这些工具。最后一步就是通过the &lt;em&gt;Android SDK and AVD Manager&lt;/em&gt;去安装一些SDK的组件，如USB Driver for Windows，Google APIs,Samples, Docs等, 具体步骤可参见&lt;a href="http://developer.android.com/sdk/adding-components.html" target="_blank"&gt;官方文档&lt;/a&gt;。&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;在创建第一个项目前，需要创建一个虚拟设备，用来模拟运行你创建的程序。&lt;/p&gt; &lt;p&gt;打开Eclipse,菜单Window-&amp;gt;Android SDK And AVD Manager, 出来一个对话框，选中Virtual Device,右边点击New,在新建对话框中输入名字如my_avd,选择Target即模拟器要运行的Android SDK版本，如Android 2.1。其它的设置如SD卡，分辨率可以自行设置或者留空，点击Create AVD这样一个虚拟设备就创建好了，如下图：&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/chunhui588/WindowsLiveWriter/6fcc01022e99_A83B/image_2_2.png"&gt;&lt;img title="image_2" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="376" alt="image_2" src="http://images.cnblogs.com/cnblogs_com/chunhui588/WindowsLiveWriter/6fcc01022e99_A83B/image_2_thumb.png" width="644" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;接下来创建Hello Android项目。&lt;/p&gt; &lt;p&gt;点击File-&amp;gt;New-&amp;gt;Android Project, 出来一个对话框，填写如下几项&lt;/p&gt; &lt;li&gt;&lt;em&gt;Project name:&lt;/em&gt; HelloAndroid ----Eclipse项目名称  &lt;li&gt;&lt;em&gt;Application name:&lt;/em&gt; Hello,Android -----在模拟器上显示的应用程序的名字  &lt;li&gt;&lt;em&gt;Package name:&lt;/em&gt; com.benjamin.helloandroid ----包的命名空间  &lt;li&gt;&lt;em&gt;Create Activity:&lt;/em&gt; HelloAndroid ------我们要创建的Activity class的名字，它是继承自android.app.Activity。  &lt;li&gt;Build Target: Android 2.1---------您的应用程序所要运行的目标平台  &lt;p&gt;点击完成，这样Hello Android项目就创建完成了。&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;我们来看一下它的项目结构和相关代码：&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/chunhui588/WindowsLiveWriter/6fcc01022e99_A83B/image_6.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="548" alt="image" src="http://images.cnblogs.com/cnblogs_com/chunhui588/WindowsLiveWriter/6fcc01022e99_A83B/image_thumb_2.png" width="760" border="0"&gt;&lt;/a&gt; &lt;/p&gt;&lt;pre&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;可以看到HelloAndroid Activity继承自android.app.Activity, onCreate方法会在这个Activity启动时被调用，所以一般会把生成UI和初始化的操作放在这里。&lt;/p&gt;&#xD;
&lt;p&gt;接下来在onCreate方法里面添加三行代码：&lt;/p&gt;&lt;pre &gt;TextView tv = new TextView(this);&#xD;
tv.setText("Hello, Android");&#xD;
setContentView(tv);&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;并注释下面这一行代码：&lt;/p&gt;&lt;pre &gt;//setContentView(R.layout.main);&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;并导入相应的包，导入包的快捷键 &lt;strong&gt;Ctrl-Shift-O&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&lt;pre &gt;import android.widget.TextView;&lt;/pre&gt;&lt;pre&gt;&lt;/pre&gt;&lt;pre&gt;Android应用程序用户界面是由一系列UI元素组成，如文本框，按钮等，它们都继承自View类。这里创建一个TextView，类似于Label用来显示文本的，并设置它显示的文本&lt;strong&gt;"Hello, Android"&lt;/strong&gt;。&lt;code&gt;&lt;a href="http://developer.android.com/reference/android/app/Activity.html#setContentView%28android.view.View%29"&gt;&lt;span style="color: #000000"&gt;setContentView()&lt;/span&gt;&lt;/a&gt;方法设置当前Activity内容即为刚才创建的TextView。&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;&lt;/code&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;运行程序就会在Android模拟器上看到输出结果。&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;&lt;/code&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;前面我们的UI元素是在代码里创建的，但这样的话可能会忘记关联各个View,一点小的改动也会引起布局的错误。所以Google推荐的方法是将UI的创建放在基于XML的布局文件里，其实Flex, Silverlight也都是这样的。&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;&lt;/code&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;在刚才创建项目的时候，Eclipse已经帮我们创建一个这样的文件HelloAndroid\res\layout\main.xml, 如下所示:&lt;/code&gt;&lt;/pre&gt;&lt;pre &gt;&amp;lt;TextView  &#xD;
    android:layout_width="fill_parent" &#xD;
    android:layout_height="wrap_content" &#xD;
    android:text="@string/hello"&#xD;
    /&amp;gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;&lt;/code&gt;layout_width: 表示这个TextView横向填充的方式，fill_parent表示填满整个屏幕宽度，wrap_content则根据文本内容的宽度显示。&lt;/pre&gt;&lt;pre&gt;layout_height：与layout_width类似，只不过是竖向。&lt;/pre&gt;&lt;pre&gt;text：表示TextView要显示的内容。"@string/hello" 这种表示读取资源文件HelloAndroid\res\values\strings.xml中hello的字符串的值，这种方式让我们很方便地实现国际化多语言。&lt;/pre&gt;&lt;pre&gt;&lt;/pre&gt;&lt;pre&gt;这里我们修改一下hello字符串的值:&lt;/pre&gt;&lt;pre &gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&#xD;
&amp;lt;resources&amp;gt;&#xD;
    &amp;lt;string name="hello"&amp;gt;Hello Android, this is Benjamin!&amp;lt;/string&amp;gt;&#xD;
    &amp;lt;string name="app_name"&amp;gt;Hello, Android&amp;lt;/string&amp;gt;&#xD;
&amp;lt;/resources&amp;gt;&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;然后返回到HelloAndroid.java，在onCreate方法中删除之前添加的三行创建TextView的代码，取消注释setContentView这行代码后的onCreate方法如下：&lt;/p&gt;&lt;pre &gt;public void onCreate(Bundle savedInstanceState) {&#xD;
        super.onCreate(savedInstanceState);&#xD;
        setContentView(R.layout.main);&#xD;
    }&lt;/pre&gt;&#xD;
&lt;p&gt;这里我们调用setContentView不再是传递一个View的对象，而是一个布局资源的引用。当我们创建一个布局文件的时候,Eclipse会根据这个布局资源文件自动在gen包下创建资源文件的索引类R.java, 根据它我们就可以快速地引用我们定义的资源文件，可以看到每增加或者修改一个资源文件，R.java就会由Eclipse自动生成，所以我们不能自己手动编辑它，R.layout.main这个对象就代表引用资源文件main.xml。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;运行一下可以看到结果如下：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/chunhui588/WindowsLiveWriter/6fcc01022e99_A83B/image_8.png"&gt;&lt;img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="575" alt="image" src="http://images.cnblogs.com/cnblogs_com/chunhui588/WindowsLiveWriter/6fcc01022e99_A83B/image_thumb_3.png" width="808" border="0"&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Hope this helps!&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;img src="http://www.cnblogs.com/chunhui588/aggbug/1774943.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chunhui588/archive/2010/07/10/Hello-Android.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/chunhui588/archive/2010/07/10/Introducing-Android.html</id><title type="text">Introducing Android</title><summary type="text">本文简单介绍一下Android系统, Android是基于Linux内核的开源的应用于移动平台一款操作系统。它包含以下一些特色的功能：针对移动设备优化的Dalvik虚拟机, 基于开源浏览器引擎WebKit的集成浏览器，优化的2D图形库和基于OpenGL ES的3D图形库，用来存放结构化数据的SQLite，支持各种格式的多媒体，对蓝牙，WiFi,GPS的支持，当然最重要的还是强大的系统框架和API来...</summary><published>2010-07-10T08:24:00Z</published><updated>2010-07-10T08:24:00Z</updated><author><name>Benjamin  Wang</name><uri>http://www.cnblogs.com/chunhui588/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chunhui588/archive/2010/07/10/Introducing-Android.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chunhui588/archive/2010/07/10/Introducing-Android.html"/><content type="html">&lt;p&gt;本文简单介绍一下Android系统, Android是基于Linux内核的开源的应用于移动平台一款操作系统。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;它包含以下一些特色的功能：针对移动设备优化的&lt;strong&gt;Dalvik&lt;/strong&gt;虚拟机, 基于开源浏览器引擎&lt;a target="_blank" href="http://webkit.org/"&gt;WebKit&lt;/a&gt;的集成浏览器，优化的2D图形库和基于OpenGL ES的3D图形库，用来存放结构化数据的&lt;strong&gt;SQLite&lt;/strong&gt;，支持各种格式的多媒体，对蓝牙，WiFi,GPS的支持，当然最重要的还是强大的系统框架和API来方便我们重用它的组件，以及非常丰富的开发环境的支持，包括设备模拟器，Eclipse插件支持，内存性能剖析工具等。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;下面来看一下Android的系统架构图：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/chunhui588/WindowsLiveWriter/eac71a480a78_E653/system-architecture_2.jpg"&gt;&lt;img border="0" width="717" src="http://images.cnblogs.com/cnblogs_com/chunhui588/WindowsLiveWriter/eac71a480a78_E653/system-architecture_thumb.jpg" alt="system-architecture" height="516" style="display: inline; border: 0px;" title="system-architecture" /&gt;&lt;/a&gt; &lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这里可以看到Android需要Linux内核提供核心的功能，如驱动管理，内存管理，进程管理等。Android系统提供了供各种组件使用的C/C++类库。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Google针对移动设备内存小和处理器慢的特点，实现了一个非规范的Java虚拟机Dalvik。默认情况下，每个应用程序会在单独一个虚拟机的一个进程里运行，多个虚拟机可以并行运行。不像传统JVM运行class文件，Dalvik运行.dex格式的文件，它通常比同样class文件打成的.jar包要小，因为它进行了一些优化，比如同样的String只保存一个拷贝的String Interning方式。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;接下来简单介绍一下Android系统包含的几大组件：&lt;/p&gt;&#xD;
&lt;p&gt;1) Activities: Android系统的用户界面都是基于Activity创建的，一个应用程序可以包括一个或者多个Activity, 但都是继承于android.app.Activity这个基类。每个Activity包括一个默认窗口用来填充一系列的View,用户通这些View来与Activity交互，Android系统提供了很多View的控件，如按钮，文本框，滚动条等。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;2) Content providers: 它是对Android系统的数据访问的一种封装, 提供一系列标准的存取数据方法，不管数据是存在文件系统，还是SQLite数据库，各个应用程序都可以通过Content provider访问数据。如果想在各个应用程序之间共享数据也只有通过Content provider方式来实现。Android的编程模型也是鼓励我们创建自己的数据的同时，也可以让其它应用程序访问。比如在发送消息的应用程序用必然会调用到联系人的数据。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;3) Services: 类似于windosw平台上的服务。不同于Activity和Content providers的短生命周期，Services可以一直在后台运行，而且可以独立于任一Activity，比如播放背景音乐，定时检查软件是否需要更新等。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;4) Intents: 指Android中的系统消息。我们知道很多系统中各应用程序都是通过发送消息来进行交互的, Android正是通过Intents来通知应用程序的各种事件，比如电池电量不足，检测到存储卡等。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Hope this helps!&lt;/p&gt;&#xD;
&lt;pre&gt;&lt;/pre&gt;&lt;img src="http://www.cnblogs.com/chunhui588/aggbug/1772998.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chunhui588/archive/2010/07/10/Introducing-Android.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/chunhui588/archive/2010/07/04/Using-Git-Repo-To-Get-Android-SourceCode.html</id><title type="text">使用Git和Repo获取Android源码</title><summary type="text">在某些情况下我们需要查看Android的源码或对其进行重新编译，目前只支持在Linux或者Mac OS上编译Android源码，暂不支持Windows.所以本篇介绍一下如何在Ubuntu上获取Android源码。Android源码大约有2.1GB，在这里可以看到它的结构和更新记录。下载Android源码需要用到Git和Repo。Git是一个开源的分布式版本控制软件，它非常适合管理很大的项目，项目文...</summary><published>2010-07-03T17:33:00Z</published><updated>2010-07-03T17:33:00Z</updated><author><name>Benjamin  Wang</name><uri>http://www.cnblogs.com/chunhui588/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chunhui588/archive/2010/07/04/Using-Git-Repo-To-Get-Android-SourceCode.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chunhui588/archive/2010/07/04/Using-Git-Repo-To-Get-Android-SourceCode.html"/><content type="html">&lt;p&gt;在某些情况下我们需要查看Android的源码或对其进行重新编译，目前只支持在Linux或者Mac OS上编译Android源码，暂不支持Windows.所以本篇介绍一下如何在Ubuntu上获取Android源码。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Android源码大约有2.1GB，在&lt;a target="_blank" href="http://android.git.kernel.org/"&gt;这里&lt;/a&gt;可以看到它的结构和更新记录。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;下载Android源码需要用到Git和Repo。Git是一个开源的分布式版本控制软件，它非常适合管理很大的项目，项目文件可以分布储存在多个Git repositories(仓库), 这样可以很方便地创建分支，进行版本比较等，所以Android也用它来进行源码管理。 Repo是基于Git的工具，它可以让我们更方便地管理Git repositories.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;接下来我们要在Ubuntu上面安装这两个工具, 在安装之前要先安装一些必要的Linux Packages: JDK 5.0(Java 6不支持因为@Override的不兼容), lex, bison, gperf, libsdl-dev, libesd0-dev, libwxgtk2.6-dev (optional), build-essential, zip, curl.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在Ubuntu的Terminal运行以下命令: $ sudo apt-get install git-core gnupg flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl libncurses5-dev zlib1g-dev &lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这里需要注意的是sun-java5-jdk的源在Ubuntu9.10后就没有了, 所以安装sun-java5-jdk 要切换Sources.list才能安装，具体可以参考这篇&lt;a target="_blank" href="http://blog.csdn.net/sunrock/archive/2010/04/29/5542989.aspx"&gt;Blog&lt;/a&gt;.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Git(上面的git-core)装完了,接下来装Repo, 在home目录创建bin目录，然后获取Repo并授于它执行的权限:&lt;/p&gt;&#xD;
&lt;p&gt;$ cd ~&lt;br /&gt;$ mkdir bin&lt;br /&gt;$ curl &lt;a href="http://android.git.kernel.org/repo"&gt;http://android.git.kernel.org/repo&lt;/a&gt; &amp;gt;~/bin/repo&lt;br /&gt;$ chmod a+x ~/bin/repo &lt;/p&gt;&#xD;
&lt;p&gt;接下来把bin目录加入$PATH:&lt;/p&gt;&#xD;
&lt;p&gt;$ export PATH=$HOME/bin:$PATH&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;再接着在home目录创建mydroid目录用来存放Android源码&lt;/p&gt;&#xD;
&lt;p&gt;$ mkdir mydroid&lt;br /&gt;$ cd mydroid &lt;/p&gt;&#xD;
&lt;p&gt;最后下载Android源码: &lt;/p&gt;&#xD;
&lt;p&gt;$ repo init -u git://android.git.kernel.org/platform/manifest.git&lt;br /&gt;$ repo sync &lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/chunhui588/aggbug/1770715.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chunhui588/archive/2010/07/04/Using-Git-Repo-To-Get-Android-SourceCode.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
