一、菜单
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>