第四章:Android用户界面

一、菜单

Android中菜单分为三种类型:选项菜单(Option Menu)、上下文菜单(Context Menu)、子菜单(Sub Menu)。

1、选项菜单(Option Menu)

选项菜单的菜单项最多只能有六个,超过六个,第六个自动显示“更多”选项来展开显示。

/**
 * 创建一个菜单项需要的步骤:
 * 1、覆盖Activity的onCreateOptionsMenu(Menu menu)方法,当我们第一次打开菜单时该方法被自动调用
 * 2、调用Menu的add()方法添加菜单项(MenuItem),可以调用MenuItem的setIcon()方法为菜单项设置图标
 * 3、当菜单项(MenuItem)被选择时,覆盖Activity的onOptionsItemSelected(MenuItem item)方法来响应事件
 */
public class TestOptionMenuActivity extends Activity {
	//菜单项Id常量
	private static final int ITEM1 = Menu.FIRST;
	private static final int ITEM2 = Menu.FIRST + 1;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
	}	
	//覆盖该方法添加菜单项
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		menu.add(0, ITEM1, 0, "开始");
		menu.add(0, ITEM2,0, "退出");
		return true;
	}	
	//覆盖该方法、响应菜单选项被单击事件
	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		switch (item.getItemId()) {
		case ITEM1:
			//设置Activity标题
			setTitle("开始游戏!");
			break;
		case ITEM2:
			setTitle("退出!");
			break;
		}
		return true;
	}
}

2、上下文菜单(Context Menu)

/**
 *1、覆盖Activity的onCreateContextMenu()方法,调用Menu的add方法添加菜单项(MenuItem)
 *2、覆盖onContextItemSelected()方法,响应菜单单击事件
 *3、调用registerForContextMenu()方法,为视图注册上下文菜单
 */
public class TestContentMenuActivity extends Activity {
	private static final int ITME1 = Menu.FIRST;
	private static final int ITME2 = Menu.FIRST + 1;
	private static final int ITME3 = Menu.FIRST + 2;
	private TextView myTV;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        myTV = (TextView) findViewById(R.id.TextView01);
        myTV.setText("这是Text");
        //注册上下文菜单
        registerForContextMenu(myTV);
    }
    
    @Override
    public void onCreateContextMenu(ContextMenu menu, View v,
    		ContextMenuInfo menuInfo) {
    	//添加菜单项
    	menu.add(0, ITME1, 0, "红色背景");
    	menu.add(0, ITME2, 0, "绿色背景");
    	menu.add(0, ITME3, 0, "白色背景");
    }
    
    @Override
    public boolean onContextItemSelected(MenuItem item) {
    	switch(item.getItemId()){
    		case ITME1:
    			myTV.setBackgroundColor(Color.RED);
    			break;
    		case ITME2:
    			myTV.setBackgroundColor(Color.GREEN);
    			break;
    		case ITME3:
    			myTV.setBackgroundColor(Color.WHITE);
    			break;
    	}
    	return true;
    }
}

3、子菜单(Sub Menu)

/**
 * 子菜单(Sub Menu)
 * 1、覆盖Activity的onCreateOptionsMenu()方法,调用Menu的addSubMenu()方法添加菜单项(Sub Menu)
 * 2、调用SubMenu的add()方法,添加子菜单
 * 3、覆盖onOptionsItemSelected()方法,响应菜单单击事件
 */
public class TestSubMenuActivity extends Activity {
	private static final int ITEM1 = Menu.FIRST;
	private static final int ITEM2 = Menu.FIRST + 1;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
	}
	
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		//添加子菜单
		SubMenu file = menu.addSubMenu("文件");
		SubMenu edit = menu.addSubMenu("编辑");
		//为子菜单添加菜单项
		file.add(0, ITEM1, 0, "新建");
		file.add(0, ITEM2, 0, "打开");
		return true;
	}
	
	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		switch (item.getItemId()) {
		case ITEM1:
			setTitle("新建文件");
			break;
		case ITEM2:
			setTitle("打开文件");
			break;
		}
		return true;
	}
}

二、对话框

Android系统提供了四种对话框:警告对话框(AlertDialog)、进度对话框(ProgressDailog)、日期选择对话框(DatePickerDialog)、时间选择对话框(TimePickerDialog)。

/**
 * 警告对话框(AlertDialog)
 * 1、获得AlertDialog的静态内部类Builder对象,由该类来创建对话框
 * 2、通过Builder对象设置对话框的标题、按钮以及按钮将要响应的事件
 * 3、调用Builder的create()方法创建对话框
 * 4、调用AlertDialog的show()方法显示对话框
 */
public class TestAlertDialogActivity extends Activity {
	private TextView myTextView = null;
	private Button myButton = null;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		myTextView = (TextView) findViewById(R.id.dialogTextView01);
		myButton = (Button) findViewById(R.id.dialogButton01);
		final AlertDialog.Builder builder = new AlertDialog.Builder(this);
		myButton.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				//设置显示信息
				builder.setMessage("确定要删除该记录吗?").
					setPositiveButton("是",new DialogInterface.OnClickListener() {
						//设置确定按钮
						@Override
						public void onClick(DialogInterface dialog, int which) {
							myTextView.setText("删除成功!");
						}
					}).setNegativeButton("否",new DialogInterface.OnClickListener() {
						@Override
						public void onClick(DialogInterface dialog, int which) {
							myTextView.setText("取消成功!");
						}
					});
				AlertDialog ad = builder.create();
				ad.show();
			}
		});
	}
}

除了上述对话框之外,还可以像上下文菜单一样来设置多个条目选项,供用户选择。

public class TestAlertDialogActivity2 extends Activity {
	private TextView myTextView = null;
	private Button myButton = null;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		myTextView = (TextView) findViewById(R.id.dialogTextView01);
		myButton = (Button) findViewById(R.id.dialogButton01);
		//对话框选项数组
		final String[] items = {"奥尔良鸡腿堡","嘛辣鸡腿堡","咖啡"};
		//实例化AlertDialog.Builder对象
		final AlertDialog.Builder builder = new AlertDialog.Builder(this);
		myButton.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				//设置标题和选项。以单项按钮样式显示
				builder.setTitle("请 点 餐").setSingleChoiceItems(items, -1, new DialogInterface.OnClickListener() {
					@Override
					public void onClick(DialogInterface dialog, int id) {
						myTextView.setText(items[id]);
					}
				});
				AlertDialog ad = builder.create();
				ad.show();
			}
		});
	}
}

三、提示信息(Toast)

/**
 * 提示信息(Toast)
 * 1、调用Toast的静态方法makeText()添加显示文本和时长
 * 2、调用Toast的show()方法显示
 */
public class TestToastActivity extends Activity {
	private Button myButton1;
	private Button myButton2;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		myButton1 = (Button) findViewById(R.id.toastButton01);
		myButton2 = (Button) findViewById(R.id.toastButton02);
		//定义Toast显示时间属性
		final int l = Toast.LENGTH_LONG;
		final int s = Toast.LENGTH_SHORT;
		//定义Toast显示内容属性
		final String str1 = "我多显示一会儿";
		final String str2 = "我少显示一会儿";
		myButton1.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				//创建Toast
				Toast t1 = Toast.makeText(getApplicationContext(), str1, l);
				//显示Toast
				t1.show();
			}
		});
		myButton2.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				Toast.makeText(getApplicationContext(), str2, s).show();
			}
		});
	}
}

四、事件处理

1、事件处理机制

Java中的事件角色有三个:

  • event object:就是事件产生时具体的“事件”,用于listener的相应方法之中,作为参数,一般存在于listener的方法之中
  • event source:具体接受事件的实体,比如说单击一个Button,那么Button就是event source
  • event listener:事件监听器,当有其对应的event object产生时,它就调用相应的方法进行处理。这种方法也被称为方法回调(callback)

例子代码:

/**
 * 着火事件类,绑定事件源
 */
public class FireEvent extends EventObject {
	private static final long serialVersionUID = 1L;
	//定义事件源对象
	private Object eventSource;
	
	//构造方法
	public FireEvent(Object obj){
		super(obj);
		this.eventSource = obj;
	}
	
	//获得事件源
	public Object getEventSource(){
		return eventSource;
	}
}
/**
 * 着火监听器,监听着火事件
 */
public interface Listener extends EventListener {
	//事件方法
	public void listen(FireEvent e);
}
/**
 * 着火监听类实现类
 */
public class FireListener implements Listener{
	@Override
	public void listen(FireEvent e) {
		System.out.println("房子着火了!");
	}
}
/**
 * 事件源房子类
 */
public class House {
	private boolean flag = false;//定义标识
	private List listeners = new ArrayList();//监听器列表
	//获得标识
	public boolean getFlag() {
		return flag;
	}
	//设置标识
	public void setFlag(boolean flag) {
		this.flag = flag;
		if(flag){
			ntf();
		}
	}
	//添加监听器
	public void addListener(Listener l){
		listeners.add(l);
	}
	//获得监听器
	public List getListeners(){
		return listeners;
	}
	//通知方法
	public void ntf(){
		//遍历监听器
		for (int i = 0; i < listeners.size(); i++) {
			//获得监听器
			Listener l = (Listener) listeners.get(i);
			//监听
			l.listen(new FireEvent(this));
		}
	}
}
/**
 * 测试类
 */
public class TestFire {
	public static void main(String[] args) {
		//事件源房子
		House h = new House();
		//添加监听器
		h.addListener(new FireListener());
		//匿名内部类实现
		h.addListener(new Listener() {			
			@Override
			public void listen(FireEvent e) {
				System.out.println("冒烟了!");
			}
		});
		h.setFlag(true);
	}
}

2、Android中的事件监听器

在Android系统中常见的事件监听器有如下几种:

  • 单击事件(View.OnClickListener):当用户触碰到某个组件或者方向键被按下时产生该事件,事件处理方法是onClick()。
  • 焦点事件(View.OnFocusChangeListener):组件得到或者失去焦点时产生该事件,事件处理方法是onFocusChange()。
  • 按键事件(View.OnKeyListener):用户按下或者释放设备上的某个按键时产生,事件处理方法onKey()。
  • 触碰事件(View.OnTouchListener):设备具有触摸屏功能时,触碰屏幕产生该事件,事件处理方法是onTouch()。
  • 创建上下文菜单事件(View.OnCreateContextMenuListener):创建上下文菜单时产生该事件,事件处理方法是onCreateContextMenu()。

3、事件处理步骤

/**
 * 事件处理步骤:
 * 1、创建事件监听器
 * 2、给要响应的事件的组件注册事件监听器
 * 3、在事件处理方法中编写实现代码
 */
public class TestEventActivity extends Activity {
	private EditText myEdit1,myEdit2;
	private CheckBox cb;
	private Button b1,b2;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		myEdit1 = (EditText) findViewById(R.id.eventEditText01);
		myEdit2 = (EditText) findViewById(R.id.eventEditText02);
		cb = (CheckBox) findViewById(R.id.eventCheckBox01);
		b1 = (Button) findViewById(R.id.eventLoginButton);
		b2 = (Button) findViewById(R.id.eventCalcelButton);
		
		//编辑文本框的按键事件
		myEdit1.setOnKeyListener(new OnKeyListener() {
			@Override
			public boolean onKey(View v, int keyCode, KeyEvent event) {
				myEdit1.setText("");//清空EditText
				return false;
			}
		});
		myEdit2.setOnKeyListener(new OnKeyListener() {
			@Override
			public boolean onKey(View v, int keyCode, KeyEvent event) {
				myEdit2.setText("");//清空EditText
				return false;
			}
		});
		//编辑文本框的焦点事件
		myEdit1.setOnFocusChangeListener(new OnFocusChangeListener() {
			@Override
			public void onFocusChange(View v, boolean hasFocus) {
				//使用toast显示文本内容
				Toast.makeText(getApplicationContext(), myEdit1.getText(), Toast.LENGTH_SHORT).show();
			}
		});
		myEdit2.setOnFocusChangeListener(new OnFocusChangeListener() {
			@Override
			public void onFocusChange(View v, boolean hasFocus) {
				//使用toast显示文本内容
				Toast.makeText(getApplicationContext(), myEdit2.getText(), Toast.LENGTH_SHORT).show();
			}
		});
		//多选框的选择事件
		cb.setOnCheckedChangeListener(new OnCheckedChangeListener() {
			@Override
			public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
				Toast.makeText(getApplicationContext(), cb.isChecked()+"", Toast.LENGTH_SHORT).show();
			}
		});
		//按钮的选择事件
		b1.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				Toast.makeText(getApplicationContext(), b1.getText(), Toast.LENGTH_SHORT).show();
			}
		});
		b2.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				Toast.makeText(getApplicationContext(), b2.getText(), Toast.LENGTH_SHORT).show();
			}
		});
	}
}

main.xml

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

    <TableLayout 
        android:id="@+id/TableLayout01"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
		<TableRow>
		    <TextView 
		        android:id="@+id/eventTextView01"
		        android:layout_width="wrap_content"
        		android:layout_height="wrap_content"
        		android:text="用户名称:" />
		    <EditText 
		        android:id="@+id/eventEditText01"
		        android:text="admin"
		        android:layout_width="fill_parent"
		        android:scrollHorizontally="true" />
		</TableRow>
		<TableRow>
		    <TextView 
		        android:id="@+id/eventTextView02"
		        android:layout_width="wrap_content"
        		android:layout_height="wrap_content"
        		android:text="用户密码:" />
		    <EditText 
		        android:id="@+id/eventEditText02"
		        android:text="123123"
		        android:password="true"
		        android:layout_width="fill_parent"
		        android:scrollHorizontally="true" />
		</TableRow>
		<TableRow>
		    <TextView 
		        android:id="@+id/eventTextView03"
		        android:layout_width="wrap_content"
        		android:layout_height="wrap_content"
        		android:text="自动登录:" />
		    <CheckBox 
		        android:text=""
		        android:id="@+id/eventCheckBox01"
		        android:layout_width="wrap_content"
		        android:layout_height="wrap_content" />
		</TableRow>
		<TableRow android:gravity="right">
			<Button android:text="登录" android:id="@+id/eventLoginButton"/>		    
			<Button android:text="取消" android:id="@+id/eventCalcelButton"/>		    
		</TableRow>
    </TableLayout>
    
</LinearLayout>

五、布局管理(Layout)

Android提供了以下两种创建布局的方式:

1)、在XML配置文件中声明:这种方式是将需要呈现的组件在配置文件中进行声明,在程序中通过setContentView(R.layout.main)方法将视图呈现在Activity中,通过findViewById方法获得组件实例(推荐)。

2)、在程序中通过“硬代码”直接实例化布局组件。

在Android中常见的布局方式有如下几种:

  • 线性布局(LinearLayout):按照垂直或者水平方向布局组件
  • 帧布局(FrameLayout):组件从屏幕的左上角坐标布局组件
  • 表格布局(TableLayout):按照行列方式布局组件
  • 相对布局(RelativeLayout):相对其他组件的布局方式
  • 绝对布局(AbsoluteLayout):按照绝对坐标来布局组件

1、线性布局

线性布局是将组件按照垂直或者水平的方向来布局,方向控制由“android:orientation”属性来控制,属性值有垂直(vertical)和水平(horizontal)。另外一个常用属性是“android:gravity”,来控制左右上下对齐方式,其属性值有上(top)、下(bottom)、左(left)、右(right)。

<!-- 线性布局	LinearLayout -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <LinearLayout 
        android:orientation="horizontal"
        android:layout_width="fill_parent"
    	android:layout_height="fill_parent"
    	android:layout_weight="1">
        <TextView 
            android:text="red"
            android:gravity="center_horizontal"
            android:background="#aa0000"
            android:layout_width="wrap_content"
    	   android:layout_height="fill_parent"
    	   android:layout_weight="1" />
        <TextView 
            android:text="green"
            android:gravity="center_horizontal"
            android:background="#00aa00"
            android:layout_width="wrap_content"
    	   android:layout_height="fill_parent"
    	   android:layout_weight="1" />
        <TextView 
            android:text="blue"
            android:gravity="center_horizontal"
            android:background="#0000aa"
            android:layout_width="wrap_content"
    	   android:layout_height="fill_parent"
    	   android:layout_weight="1" />
        <TextView 
            android:text="yellow"
            android:gravity="center_horizontal"
            android:background="#aaaa00"
            android:layout_width="wrap_content"
    	   android:layout_height="fill_parent"
    	   android:layout_weight="1" />
    </LinearLayout>
    
    <LinearLayout 
        android:orientation="vertical"
        android:layout_width="fill_parent"
    	android:layout_height="fill_parent"
    	android:layout_weight="1">
        <TextView 
            android:text="row one"
            android:textSize="15pt"
            android:layout_width="fill_parent"
    	   android:layout_height="wrap_content"
    	   android:layout_weight="1" />
        <TextView 
            android:text="row two"
            android:textSize="15pt"
            android:layout_width="fill_parent"
    	   android:layout_height="wrap_content"
    	   android:layout_weight="1" />
        <TextView 
            android:text="row three"
            android:textSize="15pt"
            android:layout_width="fill_parent"
    	   android:layout_height="wrap_content"
    	   android:layout_weight="1" />
        <TextView 
            android:text="row four"
            android:textSize="15pt"
            android:layout_width="fill_parent"
    	   android:layout_height="wrap_content"
    	   android:layout_weight="1" />
    </LinearLayout>

</LinearLayout>

2、帧布局

帧布局是从屏幕的左上角(0,0)坐标开始布局,多个组件层叠排序,后面的组件覆盖前面的组件。下面的实例在FrameLayout布局中放置了三个TextView,分别设置了TextView的大小、背景色及层叠显示。

<!-- 帧布局	FrameLayout -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <FrameLayout 
        android:id="@+id/FrameLayout01"
        android:layout_width="wrap_content"
    	android:layout_height="wrap_content">
        <TextView 
            android:background="#aa0000"
            android:layout_width="wrap_content"
    	   android:layout_height="wrap_content"
	   android:width="150px"
	   android:height="150px" />
        <TextView 
            android:background="#00aa00"
            android:layout_width="wrap_content"
    	   android:layout_height="wrap_content"
	   android:width="100px"
	   android:height="100px" />
        <TextView 
            android:background="#0000aa"
            android:layout_width="wrap_content"
    	   android:layout_height="wrap_content"
	   android:width="80px"
	   android:height="80px" />
    </FrameLayout>

</LinearLayout>

3、表格布局

表格布局以行、列表格的方式布局子组件。TableLayout使用TableRow对象来定义多行。

<!-- 表格布局	TableLayout -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TableLayout 
        android:id="@+id/TableLayout01"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:collapseColumns="2"
        android:stretchColumns="1">
        <TableRow 
            android:layout_width="wrap_content"
    	   android:layout_height="wrap_content">
           <TextView 
                android:text="用户名称:"
	       android:layout_width="wrap_content"
        	       android:layout_height="wrap_content" />
		   <EditText 
		        android:text="admin"
		        android:layout_width="wrap_content"
		        android:layout_height="wrap_content" />
        </TableRow>
        <TableRow
            android:layout_width="wrap_content"
	   android:layout_height="wrap_content">
		    <TextView 
	         android:layout_width="wrap_content"
        		android:layout_height="wrap_content"
        		android:text="用户密码:" />
		    <EditText 
		        android:text="123123"
		        android:password="true"
		        android:layout_width="wrap_content"
		        android:layout_height="wrap_content" />
		</TableRow>
		<TableRow 
		    android:layout_width="wrap_content"
		    android:layout_height="wrap_content">
			<Button 
			    android:text="注册"
			    android:layout_width="wrap_content"
			    android:layout_height="wrap_content"/>		    
			<Button 
			    android:text="登录"
			    android:layout_width="wrap_content"
			    android:layout_height="wrap_content"/>		    
		</TableRow>
    </TableLayout>

</LinearLayout>

4、相对布局

相对布局是指按照组件之间的相对位置来布局,如在某个组件的左边、右边、上面和下面等。例如:android:layout_below属性指定在某个组件的下面;android_layout_toLeftOf属性指定在某个组件的左边等。

下面的实例通过相对布局,在屏幕上放置四个按钮,B在A的右边,C在A的下面,D在B的下面,在C的右边。

<!-- 相对布局	RelativeLayout -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

   <RelativeLayout 
       android:layout_width="wrap_content"
       android:layout_height="wrap_content">
       <Button 
           android:text="A"
           android:id="@+id/a"
           android:layout_width="wrap_content"
    	  android:layout_height="wrap_content" />
       <Button 
           android:text="B"
           android:id="@+id/b"
           android:layout_width="wrap_content"
    	  android:layout_height="wrap_content"
    	  android:layout_toRightOf="@id/a" />
       <Button 
           android:text="C"
           android:id="@+id/c"
           android:layout_width="wrap_content"
    	  android:layout_height="wrap_content"
    	  android:layout_below="@id/a" />
       <Button 
           android:text="D"
           android:id="@+id/d"
           android:layout_width="wrap_content"
    	  android:layout_height="wrap_content"
    	  android:layout_below="@id/b"
    	  android:layout_toRightOf="@id/c" />
   </RelativeLayout>

</LinearLayout>

5、绝对布局

通过指定子组件的确切X、Y坐标来确定组件的位置。主要设置参数是android:layout_X及android:layout_Y。

<!-- 绝对布局	AbsoluteLayout -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

   <AbsoluteLayout 
       android:layout_width="wrap_content"
       android:layout_height="wrap_content">
       <Button 
           android:text="A"
           android:id="@+id/a"
           android:layout_width="wrap_content"
    	  android:layout_height="wrap_content"
    	  android:layout_x="20px"
    	  android:layout_y="20px" />
       <Button 
           android:text="B"
           android:id="@+id/b"
           android:layout_width="wrap_content"
    	  android:layout_height="wrap_content"
    	  android:layout_x="60px"
    	  android:layout_y="20px" />
       <Button 
           android:text="C"
           android:id="@+id/c"
           android:layout_width="wrap_content"
    	  android:layout_height="wrap_content"
    	  android:layout_x="20px"
    	  android:layout_y="80px" />
       <Button 
           android:text="D"
           android:id="@+id/d"
           android:layout_width="wrap_content"
    	  android:layout_height="wrap_content"
    	  android:layout_x="60px"
    	  android:layout_y="80px" />
   </AbsoluteLayout>

</LinearLayout>

六、组件(Widget)

1、常用组件

在这里我们以一个用户注册会员为例,演示了有关文本框(TextView)、编辑框(EditText)、单选按钮(RadioButton)、复选按钮(CheckBox)、开关按钮(ToggleButton)和下拉列表(Spinner)的用法。

public class RegisterCustomer extends Activity {
	private Button register,cancel;//按钮
	private ToggleButton marriged;//开关按钮
	private RadioButton male,female;//单选按钮
	private EditText username,password;//文本编辑框
	private Spinner position;//下拉列表
	private CheckBox reading,swimming;//多选按钮
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);		
		username = (EditText) findViewById(R.id.widget_username);
		password = (EditText) findViewById(R.id.widget_password);		
		male = (RadioButton) findViewById(R.id.widget_male);
		female = (RadioButton) findViewById(R.id.widget_female);		
		reading = (CheckBox) findViewById(R.id.widget_reading);
		swimming = (CheckBox) findViewById(R.id.widget_swimming);		
		marriged = (ToggleButton) findViewById(R.id.widget_marriged);		
		position = (Spinner) findViewById(R.id.widget_position);		
		register = (Button) findViewById(R.id.widget_register);
		cancel = (Button) findViewById(R.id.widget_cancel);
		//下拉列表项数组
		String[] str = {"CEO","CFO","PM"};
		//数组下拉列表适配器
		ArrayAdapter aa = new ArrayAdapter(this, android.R.layout.simple_spinner_item,str);
		position.setAdapter(aa);
		register.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				//实例化Bundle对象,保存属性
				Bundle b = new Bundle();
				b.putString("username", "用户名称:" + username.getText().toString());
				b.putString("password", "用户密码:" + password.getText().toString());
				
				if(male.isChecked()){
					b.putString("gender", "性别:男");
				}else{
					b.putString("gender", "性别:女");
				}
				String temp = "爱好:";
				if(reading.isChecked()){
					temp += "阅读";
				}
				if(swimming.isChecked()){
					temp += " ";
					temp += "游泳";
				}
				b.putString("hobby", temp);
				if(marriged.isChecked()){
					b.putString("marriged", "婚否:已婚");
				}else{
					b.putString("marriged", "婚否:未婚");
				}
				b.putString("position", "职务:" + position.getSelectedItem().toString());
				//实例化Intent,并跳转
				Intent intent = new Intent(RegisterCustomer.this,RegisterCustomer_Result.class);
				intent.putExtra("data", b);
				startActivity(intent);
			}
		});
	}
}
public class RegisterCustomer_Result extends Activity {
	private ListView listView;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.result);
		listView = (ListView) findViewById(R.id.widget_ListView01);
		Intent intent = this.getIntent();
		//从Intent中获得Bundle
		Bundle b = intent.getBundleExtra("data");
		//实例化list
		List list = new ArrayList();
		list.add(b.getString("username"));
		list.add(b.getString("password"));
		list.add(b.getString("position"));
		list.add(b.getString("gender"));
		list.add(b.getString("hobby"));
		list.add(b.getString("marriged"));
		
		ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_checked,list);
		listView.setAdapter(adapter);
	}
}

main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
    
    <TableLayout 
        android:id="@+id/widget_TableLayout01"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:collapseColumns="3"
        android:stretchColumns="1">
        <TableRow 
            android:id="@+id/widget_TableRow01"
            android:layout_width="wrap_content"
    	   android:layout_height="wrap_content">
           <TextView 
                android:text="用户名称:"	       android:id="@+id/widget_TextView01"
                android:layout_width="wrap_content"
        	       android:layout_height="wrap_content" />
		   <EditText 
		        android:text=""
		        android:id="@+id/widget_username"
		        android:layout_width="wrap_content"
		        android:layout_height="wrap_content" />
        </TableRow>
        <TableRow
            android:id="@+id/widget_TableRow02"
            android:layout_width="wrap_content"
	   android:layout_height="wrap_content">
		    <TextView 
		        android:text="用户密码:"
		        android:id="@+id/widget_TextView02"
		        android:layout_width="wrap_content"
        		android:layout_height="wrap_content" />
		    <EditText 
		        android:text=""
		        android:id="@+id/widget_password"
		        android:password="true"
		        android:layout_width="wrap_content"
		        android:layout_height="wrap_content" />
		</TableRow>
		<TableRow 
		    android:id="@+id/widget_TableRow03"
		    android:layout_width="wrap_content"
		    android:layout_height="wrap_content">
		    <TextView 
		        android:text="性别:"
		        android:id="@+id/widget_TextView03"
		        android:layout_width="wrap_content"
        		android:layout_height="wrap_content" />
		    <RadioGroup 
		        android:id="@+id/widget_gender_group"
		        android:layout_width="wrap_content"
        		        android:layout_height="wrap_content">
        		<RadioButton
        		    android:text="男"
        		    android:id="@+id/widget_male"
        		    android:layout_width="wrap_content"
        		    android:layout_height="wrap_content"/>
		        <RadioButton 
		            android:text="女"
		            android:id="@+id/widget_female"
		            android:layout_width="wrap_content"
        			   android:layout_height="wrap_content"/>
		    </RadioGroup>			
		</TableRow>
		<TableRow 
		    android:id="@+id/widget_TableRow04"
		    android:layout_width="wrap_content"
        		    android:layout_height="wrap_content">
		    <TextView 
		        android:text="婚否"
		        android:id="@+id/widget_TextView04"
		        android:layout_width="wrap_content"
        		        android:layout_height="wrap_content"/>
		    <ToggleButton 
		        android:id="@+id/widget_marriged"
		        android:layout_width="wrap_content"
        		        android:layout_height="wrap_content" />
		</TableRow>
		<TableRow 
		    android:id="@+id/widget_TableRow05"
		    android:layout_width="wrap_content"
        		    android:layout_height="wrap_content">
		    <TextView 
		        android:text="爱好:"
		        android:id="@+id/widget_hobby"
		        android:layout_width="wrap_content"
        		        android:layout_height="wrap_content" />
		    <CheckBox 
		        android:text="阅读"
		        android:id="@+id/widget_reading"
		        android:layout_width="wrap_content"
        		        android:layout_height="wrap_content" />
		    <CheckBox 
		        android:text="游泳"
		        android:id="@+id/widget_swimming"
		        android:layout_width="wrap_content"
        		        android:layout_height="wrap_content" />
		</TableRow>
		<TableRow 
		    android:id="@+id/widget_TableRow06"
		    android:layout_width="wrap_content"
        	 	    android:layout_height="wrap_content">
		    <TextView 
		        android:text="职务"
		        android:id="@+id/widget_TextView05"
		        android:layout_width="wrap_content"
        		        android:layout_height="wrap_content" />
		    <Spinner 
		        android:id="@+id/widget_position"
		        android:layout_width="wrap_content"
        		        android:layout_height="wrap_content" />
		</TableRow>
		<TableRow 
		    android:id="@+id/widget_TableRow07"
		    android:layout_width="wrap_content"
        		    android:layout_height="wrap_content">
		    <Button 
		        android:text="取消"
		        android:id="@+id/widget_cancel"
		        android:layout_width="wrap_content"
        		        android:layout_height="wrap_content" />
		    <Button 
		        android:text="注册"
		        android:id="@+id/widget_register"
		        android:layout_width="wrap_content"
        		        android:layout_height="wrap_content"/>
		</TableRow>		
    </TableLayout>    
</LinearLayout>

result.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >   
    <ListView 
        android:id="@+id/widget_ListView01"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">        
    </ListView>   
</LinearLayout>

2、自动完成文本框(AutoComplete TextView)

public class TestAutoCompleteTextViewActivity extends Activity {
	private AutoCompleteTextView atv;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		atv = (AutoCompleteTextView) findViewById(R.id.AutoCompleteTextView01);
		//声明字符串数组
		String[] strs = {"abc","abcd","bcd","bcde"};
		//创建适配器
		ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_dropdown_item_1line,strs);
		atv.setAdapter(adapter);
	}
}
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
    
	<TextView 
        android:text="自动完成文本框演示"
        android:id="@+id/autoTextView01"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
	
	<AutoCompleteTextView 
	    android:text=""
	    android:id="@+id/AutoCompleteTextView01"
	    android:layout_width="fill_parent"
      	    android:layout_height="wrap_content" />    
</LinearLayout>

3、选项卡(Tab)

/**
 * 1、在布局文件中使用FrameLayout列出Tab组件及Tab中的内容组件
 * 2、Activity要继承TabActivity
 * 3、调用TabActivity的getTabHost()方法获得TabHost对象
 * 4、通过TabHost创建Tab选项
 */
public class TestTabActivity extends TabActivity{
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		//不需要这句了:setContentView(R.layout.main);
		//获得TabHost
		TabHost tabHost = getTabHost();
		LayoutInflater.from(this).inflate(R.layout.main, tabHost.getTabContentView(),true);
		//设置Tab的标签内容和显示内容
		tabHost.addTab(tabHost.newTabSpec("All").setIndicator("所有通话记录").setContent(R.id.tabTextView01));
		tabHost.addTab(tabHost.newTabSpec("OK").setIndicator("已接来电").setContent(R.id.tabTextView02));
		tabHost.addTab(tabHost.newTabSpec("Cancel").setIndicator("未接来电录").setContent(R.id.tabTextView03));
	}
}
/**
 * 选项卡(Tab)
 * 关于Tab的内容还可以通过实现一个接口TabHost.TabContentFactory的createTabContent方法来指定
 */
public class TestTabActivity2 extends TabActivity implements TabContentFactory{
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		//不需要这句了:setContentView(R.layout.main);
		//获得TabHost对象
		TabHost tabHost = getTabHost();
		//LayoutInflater.from(this).inflate(R.layout.main, tabHost.getTabContentView(),true);
		tabHost.addTab(tabHost.newTabSpec("All").setIndicator("所有通话记录").setContent(this));
		//setContent(Intent i)也可以传递一个Intent对象,用来添加内容
		tabHost.addTab(tabHost.newTabSpec("OK").setIndicator("已接来电").setContent(this));
		tabHost.addTab(tabHost.newTabSpec("Cancel").setIndicator("未接来电录").setContent(this));
	}

	//创建Tab的方法
	@Override
	public View createTabContent(String tag) {
		//实例化ListView
		ListView lv = new ListView(this);
		//实例化List
		List<String> list = new ArrayList<String>();
		//在list中添加标签内容
		list.add(tag);
		//在list中添加显示内容
		if(tag.equals("All")){
			list.add("tom");
			list.add("kite");
			list.add("rose");
		}else if(tag.equals("OK")){
			list.add("lucy");
			list.add("lily");
		}else{
			list.add("nody");
		}
		//实例化数组适配器
		ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_checked,list);
		//为ListView设置适配器
		lv.setAdapter(adapter);
		return lv;
	}
}
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/FrameLayout01"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" >
    
    <TabHost 
        android:id="@+id/TabHost01"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />   
    <TextView 
        android:id="@+id/tabTextView01"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="所有通话记录" />
    <TextView 
        android:id="@+id/tabTextView02"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="已接来电" />
    <TextView 
        android:id="@+id/tabTextView03"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="未接来电" />    
</FrameLayout>

4、进度条(ProgressBar)

/**
 * 对话框进度条
 * 1、覆盖Activity的onCreateDialog()方法,并在其中创建对话框
 * 2、调用Activity的showDialog()方法,显示进度条对话框
 */
public class TestProgressBarActivity1 extends Activity{
	private Button myButton;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		myButton = (Button) findViewById(R.id.progress1Button01);
		myButton.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				//显示对话框
				showDialog(0);
			}
		});
	}
	@Override
	protected Dialog onCreateDialog(int id) {
		//实例化进度条对话框ProgressDialog
		ProgressDialog dialog = new ProgressDialog(this);
		dialog.setTitle("测试对话框");
		dialog.setIndeterminate(true);
		dialog.setMessage("程序正在加载,请稍候...");
		dialog.setCancelable(true);
		return dialog;
	}
}
/**
 * 标题栏进度条
 * 1、调用Activity的requestWindowFeature()方法,获得进度条
 * 2、调用Activity的setProgressBarIndeterminateVisibility()方法显示进度条
 */
public class TestProgressBarActivity2 extends Activity{
	private Button b1,b2;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);		
		//设置窗口特征,这句话必须写在setContentView()前面
		requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
		setContentView(R.layout.main);
		b1 = (Button) findViewById(R.id.progress2Button01);
		b2 = (Button) findViewById(R.id.progress2Button02);
		b1.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				//在窗口标题栏显示进度条
				setProgressBarIndeterminateVisibility(true);
			}
		});
		b2.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				//在窗口标题栏取消进度条
				setProgressBarIndeterminateVisibility(false);
			}
		});
	}
}
/**
 * 水平进度条
 * 1、在布局文件中声明ProgressBar
 * 2、在Activity中获得ProgressBar实例
 * 3、调用ProgressBar的incrementProgressBy()方法增加或减少进度
 */
public class TestProgressBarActivity3 extends Activity{
	private Button b1,b2;
	private ProgressBar progressBar;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		b1 = (Button) findViewById(R.id.progress3Button01);
		b2 = (Button) findViewById(R.id.progress3Button02);
		progressBar = (ProgressBar) findViewById(R.id.ProgressBar01);
		b1.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				//增加进度
				progressBar.incrementProgressBy(1);
			}
		});
		b2.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				//减少进度
				progressBar.incrementProgressBy(-1);
			}
		});
	}
}

5、日期、时间选择对话框(DataPickerDialog、TimePickerDialog)

/**
 * 1、调用Activity的onCreateDialog()方法创建对话框
 * 2、分别在OnDateSetListener的onDateSet()方法和OnTimeSetListener的onTimeSet()事件方法中更改日期和时间
 * 3、调用Activity的showDialog()方法显示对话框
 */
public class TestDate_TimePickerDialog extends Activity {
	private Button b1,b2;
	private TextView tv1,tv2;
	private Calendar c;
	//年、月、日
	private int m_year,m_month,m_day;
	//小时、分钟
	private int m_hour,m_minute;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		b1 = (Button) findViewById(R.id.datetimeButton01);
		b2 = (Button) findViewById(R.id.datetimeButton02);
		tv1 = (TextView) findViewById(R.id.datetimeTextView01);
		tv2 = (TextView) findViewById(R.id.datetimeTextView02);
		//获得Calendar实例
		c = Calendar.getInstance();
		//获得年、月、日、时、分
		m_year = c.get(Calendar.YEAR);
		m_month = c.get(Calendar.MONTH);
		m_day = c.get(Calendar.DAY_OF_MONTH);
		m_hour = c.get(Calendar.HOUR);
		m_minute = c.get(Calendar.MINUTE);
		tv1.setText(m_year + ":" + (m_month + 1) + ":" + m_day);
		tv2.setText(m_hour + ":" + m_minute);
		b1.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View arg0) {
				//显示日期对话框
				showDialog(0);
			}
		});
		b2.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				//显示日期对话框
				showDialog(1);
			}
		});
	}
	//显示对话框方法
	@Override
	protected Dialog onCreateDialog(int id) {
		if(id == 0)//显示日期
			return new DatePickerDialog(this, d, m_year, m_month, m_day);
		else//显示时间
			return new TimePickerDialog(this, t, m_hour, m_minute, false);
		
	}
	//日期设置监听器
	private OnDateSetListener d = new OnDateSetListener() {
		@Override
		public void onDateSet(DatePicker view, int year, int monthOfYear,int dayOfMonth) {
			m_year = year;
			m_month = monthOfYear;
			m_day = dayOfMonth;
			//重新显示当前日期
			tv1.setText(m_year + ":" + (m_month + 1) + ":" + m_day);
		}
	};	
	//时间设置监听器
	private OnTimeSetListener t = new OnTimeSetListener() {
		@Override
		public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
			m_hour = hourOfDay;
			m_minute = minute;
			tv2.setText(m_hour + ":" + m_minute);
		}
	};
}

6、列表视图(ListView)

/**
 * 使用ArrayAdapter添加列表视图内容
 * 1、该类继承ListActivity
 * 2、创建ArrayAdapter
 * 3、调用ListActivity的setListAdapter()方法显示列表项
 */
public class TestListViewActivity1 extends ListActivity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		//列表项数组
		String[] strs = {"Java","C","C++","VB"};
		//数组适配器
		ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,strs);
		setListAdapter(adapter);
	}
}
/**
 * 使用SimpleCursorAdapter添加列表视图内容
 * 1、调用getContentResolver()方法返回ContentResolver对象,通过该对象查询得到Cursor对象
 * 2、创建SimpleCursorAdapter对象
 * 3、调用ListActivity的setListAdapter()方法显示列表项
 */
public class TestListViewActivity2 extends ListActivity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		//获得通讯录联系人游标对象Cursor
		Cursor c = getContentResolver().query(People.CONTENT_URI, null, null, null, null);
		startManagingCursor(c);
		
		//实例化列表适配器
		ListAdapter adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, c, 
				new String[]{People.NAME}, new int[]{android.R.id.text1});
		//为ListView设置列表适配器
		setListAdapter(adapter);
	}
}

7、网格视图(GridView)

public class TestGridViewActivity extends Activity {
	private GridView gv;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		gv = (GridView) findViewById(R.id.main);
		gv.setNumColumns(4);
		//为GridView设置适配器
		gv.setAdapter(new MyAdapter(this));
	}
	//自定义适配器
	class MyAdapter extends BaseAdapter{
		//图片ID数组
		private Integer[] imgs = {
			R.drawable.ic_launcher01,
			R.drawable.ic_launcher02,
			R.drawable.ic_launcher03,
			R.drawable.ic_launcher04,
			R.drawable.ic_launcher05,
			R.drawable.ic_launcher06,
			R.drawable.ic_launcher07,
			R.drawable.ic_launcher08,
			
			R.drawable.ic_launcher01,
			R.drawable.ic_launcher02,
			R.drawable.ic_launcher03,
			R.drawable.ic_launcher04,
			R.drawable.ic_launcher05,
			R.drawable.ic_launcher06,
			R.drawable.ic_launcher07,
			R.drawable.ic_launcher08,
		};
		//上下文对象
		Context context;
		//构造方法
		MyAdapter(Context contxt) {
			this.context = contxt;
		}
		//获取数量
		@Override
		public int getCount() {
			return imgs.length;
		}
		//获得当前选项
		@Override
		public Object getItem(int item) {
			return item;
		}
		//获得当前选项ID
		@Override
		public long getItemId(int id) {
			return id;
		}
		//创建view方法
		@Override
		public View getView(int position, View converView, ViewGroup parent) {
			ImageView imageView;
			if(converView == null){
				//实例化ImageView对象
				imageView = new ImageView(context);
				//设置ImageView对象布局
				imageView.setLayoutParams(new GridView.LayoutParams(45,45));
				//设置边界对齐
				imageView.setAdjustViewBounds(false);
				//设置刻度类型
				imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
				//设置间距
				imageView.setPadding(8, 8, 8, 8);
			}else{
				imageView = (ImageView) converView;
			}
			//为ImageView设置图片资源
			imageView.setImageResource(imgs[position]);
			return imageView;
		}
	}
}

8、画廊视图(Gallery)

public class TestGalleryActivity extends Activity implements OnItemSelectedListener,ViewFactory{
	//声明ImageSwitcher
	private ImageSwitcher imageSwitch;
	private Gallery gallery;
	//图片Id数组
	private Integer[] mThumbIds = {R.drawable.s_1,R.drawable.s_2,R.drawable.s_3};
	private Integer[] mImageIes = {R.drawable.b_1,R.drawable.b_2,R.drawable.b_3};
	//Activity创建时调用
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		//设置窗口特征无标题
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.main);
		imageSwitch = (ImageSwitcher) findViewById(R.id.ImageSwitch);
		gallery = (Gallery) findViewById(R.id.Gallery01);
		//为ImageSwitcher设置工厂
		imageSwitch.setFactory(this);
		//设置动画效果
		imageSwitch.setInAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_in));
		imageSwitch.setOutAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_out));
		
		gallery.setAdapter(new ImageAdapter(this));
		gallery.setOnItemSelectedListener(this);
	}
	class ImageAdapter extends BaseAdapter{
		private Context mContext;
		//构造方法
		public ImageAdapter(Context c){
			mContext = c;
		}
		//获得数量
		@Override
		public int getCount() {
			return mThumbIds.length;
		}
		//获得当前选项
		@Override
		public Object getItem(int position) {
			return position;
		}
		//获得当前选项ID
		@Override
		public long getItemId(int position) {
			return position;
		}
		//获得View对象
		@Override
		public View getView(int position, View converView, ViewGroup parent) {
			//实例化ImageView对象
			ImageView i = new ImageView(mContext);
			//设置图片资源
			i.setImageResource(mThumbIds[position]);
			//设置边界对齐
			i.setAdjustViewBounds(true);
			//设置布局参数
			i.setLayoutParams(new Gallery.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
			return i;
		}
	}
	//创建视图方法
	@Override
	public View makeView() {
		//创建ImageView
		ImageView i = new ImageView(this);
		//设置背景色
		i.setBackgroundColor(0xFF000000);
		//设置精度类型
		i.setScaleType(ImageView.ScaleType.FIT_CENTER);
		//设置布局参数
		i.setLayoutParams(new ImageSwitcher.LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT));
		return i;
	}
	//选项被选择方法
	@Override
	public void onItemSelected(AdapterView<?> adapter, View view, int position,long id) {
		imageSwitch.setImageResource(mImageIes[position]);
	}
	//没有任何选择方法
	@Override
	public void onNothingSelected(AdapterView<?> adapter) {
		
	}
}

9、地图视图(MapView)

  • 在创建项目时“Build Target”要选择“Google APIs”,也就是要添加Google的 APIjar 文件 map.jar
  • 在选择“AVD”时要使“Target”成为“Google APIs”
  • 在AndroidManifest.xml配置文件中添加<uses-library android:name="com.google.android.maps" />
  • 在AndroidManifest.xml配置文件中声明权限<uses-permission android:name="android.permission.INTERNET"/>
  • 获得“Google Map API Key”,使用JDK的keytool生成MD5 key
  • 获得MD5认证指纹后到Google网站申请ApiKey

在命令行输入:

keytool -list -alias androiddebugkey -keystore  "<debug.keystore文件路径>" -storepass android -keypass android 

如:

keytool -list -alias androiddebugkey -keystore  "C:\Users\Administrator\.android\debug.keystore" -storepass android -keypass android 

回车,随机生成的的一个认证指纹(MD5)如下:90:7C:2E:BD:5E:73:CB:C2:68:B5:AF:83:84:8F:F6:68

http://code.google.com/intl/zh-CN/android/maps-api-signup.html 申请的Map API密钥为:0JimpYd0RKG8r4zDt58yzGgEhXKGN0Iz22gJAyQ

public class TestMapViewActivity extends MapActivity{
	LinearLayout linearLayout;//声明线性布局
	MapView mapView;//声明地图视图
	ZoomControls mZoom;//声明缩放控制
	@Override
	protected void onCreate(Bundle icicle) {
		super.onCreate(icicle);
		setContentView(R.layout.main);
		linearLayout = (LinearLayout) findViewById(R.id.zoomview);
		mapView = (MapView) findViewById(R.id.mapview);
		//从MapView中获得ZoomControls实例
		mZoom = (ZoomControls) mapView.getZoomControls();
		//在LinearLayout中添加ZoomControls
		linearLayout.addView(mZoom);
	}
	@Override//是否显示路径
	protected boolean isRouteDisplayed() {
		return false;
	}
}

main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:id="@+id/mainlayout" >
    <com.google.android.maps.MapView
        android:id="@+id/mapview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:clickable="true"
        android:apiKey="0JimpYd0RKG8r4zDt58yzGgEhXKGN0Iz22gJAyQ" />        
    <LinearLayout
        android:id="@+id/zoomview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@id/mapview"
        android:layout_centerHorizontal="true" />    
</RelativeLayout>

AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="mx.android.ch04" android:versionCode="1" android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="13" />
    
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
    <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
    <uses-permission android:name="android.permission.INTERNET"/>
    
    <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" >
        <activity android:name=".TestMapViewActivity" android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>        
        <uses-library android:name="com.google.android.maps" />
    </application> 
    
</manifest>

10、网络视图(WebView)

/**
 * Android的网络功能很强大,WebView组件支持直接加载网页,可以将其视为一个浏览器。
 * 1、在布局文件中声明WebView
 * 2、在Activity中实例化WebView
 * 3、调用WebView的loadUrl()方法,加载指定的URL地址网页
 * 4、为了让WebView能够响应超链接功能,调用setWebViewClient()方法设置WebView客户端
 * 5、为了让WebView支持回退功能,覆盖onKeyDown()方法
 * 6、在清单文件中添加访问互联网权限:<uses-permission android:name="android.permission.INTERNET"/>
 */
public class TestWebViewActivity extends Activity {
	WebView webView;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		webView = (WebView) findViewById(R.id.WebView01);
		//设置WebView属性,能够执行javascript脚本
		webView.getSettings().setJavaScriptEnabled(true);
		//加载URL内容
		webView.loadUrl("http://www.google.com");
		//设置Web视图客户端
		webView.setWebViewClient(new HelloWebClient());
	}
	//设置回退
	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		if((keyCode == KeyEvent.KEYCODE_BACK) && (webView.canGoBack())){
			webView.goBack();
			return true;
		}		
		return super.onKeyDown(keyCode, event);
	}
	//Web视图客户端
	private class HelloWebClient extends WebViewClient{
		@Override
		public boolean shouldOverrideUrlLoading(WebView view, String url) {
			view.loadUrl(url);
			return true;
		}
	}
}

main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
    
    <WebView 
        android:id="@+id/WebView01"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />
</LinearLayout>
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值