在网页的世界里,想要在两个网页间做转换,只要利用超链接(HyperLink)就可以实现,但在手机的世界里,要如何实现手机页面之间的转换呢?最简单的方式就是改变Activity的Layout。在这个范例里头,将布局两个Layout,分别为Layout1(main.xml)与Layout2(myLayout.xml),默认载入的Layout为main.xml,并且Layout1当中创建一个按钮,当单机按钮时,显示第二个Layout(myLayout.xml);同样地,在Layout2里也设计一个按钮,当单机第二个Layout的按钮之后,则显示回原来的Layout1。
运行结果:
点击Go to layout2跳到如下界面
再点击Go to layout1回到上个界面
步骤:
step1:新建Android项目EX03_08_setContentViewDemo
step2:res->values 添加 color.xml
<?xml version="1.0" encoding="UTF-8"?>
<resources>
<color name="white">#FFFFFF</color>
<color name="black">#000000</color>
<color name="pink">#FFC0CB</color>
<color name="red">#FF0000</color>
</resources>
step3:res->value->main.xml
为了凸显Layout间切换的效果,特别改变两个Layout的背景色及字体颜色和输出文字。在main.xml中定义其背景色为黑色,字体颜色为红色,输出文字为“Layout1”。
<?xml version="1.0" encoding="utf-8"?>
<AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@color/black">
<TextView
android:id="@+id/text1"
android:textSize="20sp"
android:textColor="@color/red"
android:layout_width="220dp"
android:layout_height="40dp"
android:layout_x="50dp"
android:layout_y="32dp"
android:text="layout1"/>
<Button
android:id="@+id/button1"
android:textColor="@color/red"
android:layout_width="220dp"
android:layout_height="wrap_content"
android:layout_x="50dp"
android:layout_y="82dp"
android:text="Go to Layout2"/>
</AbsoluteLayout>
step4:res->value 添加 mylayout.xml
mylayout.xml中背景色为粉色,字体颜色为黑色,输出文字为“Layout2”。
<?xml version="1.0" encoding="UTF-8"?>
<AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@color/pink" >
<TextView
android:id="@+id/text2"
android:textSize="20sp"
android:textColor="@color/black"
android:layout_width="220dp"
android:layout_height="40dp"
android:layout_x="50dp"
android:layout_y="32dp"
android:text="layout2"
/>
<Button
android:id="@+id/button2"
android:textColor="@color/black"
android:layout_width="220dp"
android:layout_height="wrap_content"
android:layout_x="50dp"
android:layout_y="82dp"
android:text="Go to Layout1"/></AbsoluteLayout>
step5:EX03_08_setContentViewDemo.java
在主程序中,预加载的Layout是main.xml,屏幕上显示的是黑色背景的"Layout1",在第一个Layout上的按钮被单击的同时,改变Activity的Layout为mylayout.xml,屏幕上显示变为粉色背景的“Layout2”,并利用Button单击时,调用方法的不同做两个Layout间的切换。
package com.example.ex03_08_setcontentviewdemo;
import android.os.Bundle;
import android.app.Activity;
import android.view.View;
import android.widget.Button;
public class EX03_08_setContentViewDemo extends Activity {
/**Called when the Activity is first created*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/*载入main.xml Layout*/
setContentView(R.layout.main);
/*以findViewById()取得Button对象,并添加onCLickListener*/
Button b1 = (Button)findViewById(R.id.button1);
b1.setOnClickListener(new Button.OnClickListener(){
public void onClick(View v){
jumpToLayout2();
}
});
}
/*method jumpToLayout2:将layout由main.xml切换成mylayout.xml*/
public void jumpToLayout2(){
/*将layout改成mylayout.xml*/
setContentView(R.layout.mylayout);
/*以findViewById()取得Button对象,并添加onClickListener*/
Button b2 = (Button)findViewById(R.id.button2);
b2.setOnClickListener(new Button.OnClickListener(){
public void onClick(View v){
jumpToLayout1();
}
});
}
/*method jumpToLayout1:将layout由mylayout.xml切换成main.xml*/
public void jumpToLayout1(){
/*将layout改成main.xml*/
setContentView(R.layout.main);
/*以findViewById()取得Button对象,并添加onClickListener*/
Button b1 = (Button)findViewById(R.id.button1);
b1.setOnClickListener(new Button.OnClickListener(){
public void onClick(View v){
jumpToLayout2();
}
});
}
}
扩展学习:
运用改变Activity Layout这个技巧,就可作出手机页面转换的效果,当然亦可搭配Style和Theme的设置,进行更加灵活的布局配置运用,例如,让用户自行决定要使用的系统样式,背景及文字颜色等,接着直接应用来改变布局。
再者,利用setContentView来置换页面还有一个特别的有点,即所有程序里的变量皆存在相同的状态,无论是类成员变量,类函数等,皆可以在一个Activity的状态中直接取得,并没有参数传递的问题。打个比喻:Layout1收集了用户输入的信用卡卡号等付款信息,在“下一步”显示Layout2使之显示订单信息,让用户进行确认,并在单机按钮后,调用Layout3进行刷卡Gateway的授权操作,这当中皆没有需要传递的宾亮,其手法是将所需要的字段数据以类成员变量作如下声明:
public class EX03_08 extends Activity{
public String colVar1;
public String colVar2;
public String colVar3;
/*Called when the activity is first created*/
public void onCreate(Bundle savedInstanceState){
//
........
}
}