通用的页面跳转方法有两种:
1、Intent
Intent适合Activity与Activity之间的跳转,按返回键可以直接返回前一页面
缺点:需要到Manifest注册Activity
2、setContentView
适合同一Activity里的不同View之间跳转
优点:按返回键不会返回到前一页面,需要自己添加按键监听代码来实现
IntentTest.java代码
- import android.app.Activity;
- import android.content.Intent;
- import android.os.Bundle;
- import android.view.KeyEvent;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.*;
- public class IntentTest extends Activity {
- private LinearLayout mainView=null;
- private Button button1=null;
- private Button button2=null;
- private LinearLayout layout=null;
- private TextView tv=null;
- /*
- * 由于setContentVeiw()函数返回是void,系统中没有提供获取当前View的函数
- * 所以此处添加一个整形变量用来指示当前View的id
- */
- private int currentViewId;
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- //tv初始化
- tv=new TextView(this);
- tv.setText("这是layout里面的tv");
- //layout初始化
- layout=new LinearLayout(this);
- layout.setId(100);//这里需要指定id,否则默认的id会和mainView一样,都是-1
- layout.setLayoutParams(new LinearLayout.LayoutParams(-1,-1));
- layout.addView(tv);
- //button1初始化
- button1=new Button(this);
- button1.setLayoutParams(new LinearLayout.LayoutParams(-2,-2));
- button1.setText("Intent方式跳转");
- button1.setOnClickListener(new OnClickListener(){
- public void onClick(View v) {
- /*此处用Intent来实现Activity与Activity之间的跳转*/
- Intent intent=new Intent();
- intent.setClass(IntentTest.this,MyActivity.class);
- //Intent intent=new Intent(IntentTest.this,MyActivity.class);
- startActivity(intent);
- }
- });
- //button2初始化
- button2=new Button(this);
- button2.setLayoutParams(new LinearLayout.LayoutParams(-2,-2));
- button2.setText("setContentView方式跳转");
- button2.setOnClickListener(new OnClickListener(){
- public void onClick(View v) {
- //此处用setContentView方式来实现统一Activity不同View跳转
- setCurrentView(layout);
- }
- });
- //mianView初始化
- mainView=new LinearLayout(this);
- mainView.setId(1000);//指定id
- mainView.setLayoutParams(new LinearLayout.LayoutParams(-1,-1));
- mainView.setOrientation(LinearLayout.VERTICAL);
- mainView.addView(button1);
- mainView.addView(button2);
- //显示mainView
- setCurrentView(mainView);
- }
- /*
- * 这里重写onKeyDown()函数,实现返回键的监听
- * 如果通过显示的View对keyListener进行监听,则返回键监听不到
- * 所以此处是通过在Activity里面重写onKeyDown()函数来实现监听
- * 此处如果不拦截监听的话,在显示layout后按返回键则直接执行退出程序
- */
- public boolean onKeyDown(int keyCode, KeyEvent event) {
- if (keyCode == KeyEvent.KEYCODE_BACK) {
- if(currentViewId==layout.getId()){
- setCurrentView(mainView);
- }else{
- System.exit(0);
- }
- return false;
- }
- return false;
- }
- /*自定义函数setCurrentView()*/
- public void setCurrentView(View view){
- currentViewId=view.getId();
- //此处用setContentView方式来实现统一Activity不同View跳转
- setContentView(view);
- }
- }
MyActivity.java代码
- import android.app.Activity;
- import android.os.Bundle;
- import android.widget.TextView;
- public class MyActivity extends Activity{
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- TextView tv=new TextView(this);
- tv.setText("我是MyActivity里的tv");
- setContentView(tv);
- }
-
但有时若不想有activity跳转效果,则需要用到以下方法:
如果希望在Activity中出现多个Tab可以点击,并且点击每个Tab之后跳转到相应的Activity,可以使用TabActivity类。以下演示一个简单的范例。
首先要定义一个继承TabActivity的类,这里我们定义MainActivity,并且使其作为应用程序的入口。其代码为
- package com.myandroid.tabtest;
- import android.app.TabActivity;
- import android.content.Intent;
- import android.os.Bundle;
- import android.widget.TabHost;
- import android.widget.TabHost.TabSpec;
- public class MainActivity extends TabActivity {
- private TabHost m_tabHost;
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.tabs);
- //getTabHost返回的TabHost用于装载tabs
- m_tabHost = getTabHost();
- //add tabs,这里用于添加具体的Tabs,并用Tab触发相应的Activity
- addOneTab();
- addTwoTab();
- addThreeTab();
- addFourTab();
- }
- public void addOneTab(){
- Intent intent = new Intent();
- intent.setClass(MainActivity.this, OneActivity.class);
- TabSpec spec = m_tabHost.newTabSpec("One");
- spec.setIndicator(getString(R.string.one), null);
- spec.setContent(intent);
- m_tabHost.addTab(spec);
- }
- public void addTwoTab(){
- Intent intent = new Intent();
- intent.setClass(MainActivity.this, TwoActivity.class);
- TabSpec spec = m_tabHost.newTabSpec("Two");
- spec.setIndicator(getString(R.string.two), null);
- spec.setContent(intent);
- m_tabHost.addTab(spec);
- }
- public void addThreeTab(){
- Intent intent = new Intent();
- intent.setClass(MainActivity.this, ThreeActivity.class);
- TabSpec spec = m_tabHost.newTabSpec("Three");
- spec.setIndicator(getString(R.string.three), null);
- spec.setContent(intent);
- m_tabHost.addTab(spec);
- }
- public void addFourTab(){
- Intent intent = new Intent();
- intent.setClass(MainActivity.this, FourActivity.class);
- TabSpec spec = m_tabHost.newTabSpec("Four");
- spec.setIndicator(getString(R.string.four), null);
- spec.setContent(intent);
- m_tabHost.addTab(spec);
- }
- }
可以看到在MainActivity中,我们使用getTabHost()返回一个TabHost,而TabHost正是用来添加Tabs的。这里我们添加了4个Tabs,使用4个函数完成:addOneTab(),addTwoTab(),addThreeTab(),addFourTab().在这4个函数中我们使用TabSpec来描述每个的Tab,并且设置Intent,完成点击该Tab时跳转到相应的Activity的功能。
当然,这个应用还有一个关键点,就是这里的布局tabs.xml.其代码为:
- <?xml version="1.0" encoding="utf-8"?>
- <TabHost
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@android:id/tabhost"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
- <LinearLayout
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
- <TabWidget android:id="@android:id/tabs"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:paddingLeft="1dip"
- android:paddingRight="1dip"
- android:paddingTop="4dip"
- />
- <FrameLayout android:id="@android:id/tabcontent"
- android:layout_width="fill_parent"
- android:layout_height="0dip"
- android:layout_weight="1"
- />
- </LinearLayout>
- </TabHost>
注意在tabs.xml中,定义TabHost标签,并且其中有一个TabWidget标签是装载整个Tabs的,其id必须为android:id/tabs
完成这些工作之后,接下来的任务就是定义前面的几个Activity,OneActivity,TwoActivity,ThreeActivity,FourActivity.这些Activity由大家根据自己的功能设定。
由于手机屏幕有限,所以我们要尽量充分利用屏幕资源。在我们的应用程序中通常有多个Activity,而且会经常切换显示,这样我们就可以用TabActivity来显示。其效果如图1所示。
图1 tabActivity显示效果
本文就来研究TabActivity。根据帮助文档的解释,该控件用于包含并且运行多可内嵌的Activity或者View。首先讲解TabActivity的使用。
TabActivity的使用
如图1所示,远程音乐列表和本地音乐列表为两个不同的按钮,在TabActivity中他是一个TabWidget而下面的两个列表都是在各自的Activity中设置,然后在将每一个Activity添加到TabActivity的FrameLayout中。也就是说在TabActivity的布局文件中必须包含TabWidget和FrameLayout两种控件。
这里值得一提的是,必须为TabActivity的布局文件的根节点设置为:TabHost。可以参考main.xml代码
main.xml
- <?xml version="1.0" encoding="utf-8"?>
- <TabHost xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@android:id/tabhost" android:layout_width="fill_parent"
- android:layout_height="fill_parent">
- <LinearLayout android:orientation="vertical"
- android:layout_width="fill_parent" android:layout_height="fill_parent"
- android:padding="5dp">
- <TabWidget android:id="@android:id/tabs"
- android:layout_width="fill_parent" android:layout_height="wrap_content" />
- <FrameLayout android:id="@android:id/tabcontent"
- android:layout_width="fill_parent" android:layout_height="fill_parent"
- android:padding="5dp" />
- </LinearLayout>
- </TabHost>
这里要说明一下,TabWidget为图一中的按钮控件,FrameLayout为要显示的内容。内容可以是如下两种方式来填充:
q 使用一个Activity中的两个不同的View。
q 使用完全不相关的两个Activity。
在图1中,我使用的是后者,两个完全不同的Activity。下面就来一起编写一个TabActivity的例子。
1.首先创建TabActivityDemo项目。
2.然后依次创建ArtistsActivity, AlbumsActivity, 和 SongsActivity。然后为每一例子添加一个TextView用于区分不同的Activity,如下面代码所示:
- public class ArtistsActivity extends Activity {
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- TextView textview = new TextView(this);
- textview.setText("This is the Artists tab");
- setContentView(textview);
- }
- }
3.我们有了不同的显示内容,就要为每一个按钮设置不同的图标。每一组都需要两张图片用于区分是否是被选中状态。通常的设计原则是使用灰色的图片作为选中图片,白色的作为未选中的图片。可以使用图2中两幅图片。
图2 示例图片
将要使用的图片保存到res/drawable目录中,然后创建一个名为ic_tab_artists.xml的文件在drawable文件夹中。文件代码如下:
- <?xml version="1.0" encoding="utf-8"?>
- <selector xmlns:android="http://schemas.android.com/apk/res/android">
- <!-- When selected, use grey -->
- <item android:drawable="@drawable/ic_tab_artists_grey"
- android:state_selected="true" />
- <!-- When not selected, use white-->
- <item android:drawable="@drawable/ic_tab_artists_white" />
- </selector>
4.修改我们的main.xml文件如下所示:
- <?xml version="1.0" encoding="utf-8"?>
- <TabHost xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@android:id/tabhost"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
- <LinearLayout
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:padding="5dp">
- <TabWidget
- android:id="@android:id/tabs"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content" />
- <FrameLayout
- android:id="@android:id/tabcontent"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:padding="5dp" />
- </LinearLayout>
- </TabHost>
TabHost将根据用户的选择,自动的切换FramLayout与TabWidget的显示内容。
5.接下来修改我们的主Activity,让其继承TabActivity。
6.然后使用为我们的主Activity添加OnCreate()方法如下所示:
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- Resources res = getResources(); // Resource object to get Drawables
- TabHost tabHost = getTabHost(); // The activity TabHost
- TabHost.TabSpec spec; // Resusable TabSpec for each tab
- Intent intent; // Reusable Intent for each tab
- // Create an Intent to launch an Activity for the tab (to be reused)
- intent = new Intent().setClass(this, ArtistsActivity.class);
- // Initialize a TabSpec for each tab and add it to the TabHost
- spec = tabHost.newTabSpec("artists").setIndicator("Artists",
- res.getDrawable(R.drawable.ic_tab_artists))
- .setContent(intent);
- tabHost.addTab(spec);
- // Do the same for the other tabs
- intent = new Intent().setClass(this, AlbumsActivity.class);
- spec = tabHost.newTabSpec("albums").setIndicator("Albums",
- res.getDrawable(R.drawable.ic_tab_albums))
- .setContent(intent);
- tabHost.addTab(spec);
- intent = new Intent().setClass(this, SongsActivity.class);
- spec = tabHost.newTabSpec("songs").setIndicator("Songs",
- res.getDrawable(R.drawable.ic_tab_songs))
- .setContent(intent);
- tabHost.addTab(spec);
- tabHost.setCurrentTab(2);
- }
通常我们需要先得到TabHost,可以使用方法getTabHost()得到。
为TabActivity每添加一项内容,都要通过TabHost对象得到一个TabHost.TabSpec对象,该类可以定义每一个tab的内容的属性,比如tabTidget的标题或者显示图标等。通过TabHost的newTabSpec()可以得到该对象。
可以使用setIndicator(CharSequence, Drawable)方法设置图标。使用setContent(Intent)设置内容。最后一定要将使用setContent(Intent)将这个TabHost.TabSpec对象添加到TabHost中。
在最后,可以使用setCurrentTab(int)来设置默认的显示页。
值得一提的是,TabWidget总是TabActivity的孩子结点。用于与用户交互。
7.看看我们的成果吧
- TabActivityDemo.rar (48.8 K):http://158067568.iteye.com/blog/941338