Android页面跳转实现方法:activity&TabActivity

通用的页面跳转方法有两种:

1、Intent

Intent适合Activity与Activity之间的跳转,按返回键可以直接返回前一页面

缺点:需要到Manifest注册Activity

2、setContentView

适合同一Activity里的不同View之间跳转

优点:按返回键不会返回到前一页面,需要自己添加按键监听代码来实现

    

IntentTest.java代码

 

[java]  view plain copy
  1. import android.app.Activity;  
  2. import android.content.Intent;  
  3. import android.os.Bundle;  
  4. import android.view.KeyEvent;  
  5. import android.view.View;  
  6. import android.view.View.OnClickListener;  
  7. import android.widget.*;  
  8.   
  9. public class IntentTest extends Activity {  
  10.       
  11.     private LinearLayout mainView=null;  
  12.     private Button button1=null;  
  13.     private Button button2=null;  
  14.       
  15.     private LinearLayout layout=null;  
  16.     private TextView tv=null;  
  17.       
  18.     /* 
  19.      * 由于setContentVeiw()函数返回是void,系统中没有提供获取当前View的函数 
  20.      * 所以此处添加一个整形变量用来指示当前View的id 
  21.      */  
  22.     private int currentViewId;  
  23.       
  24.     public void onCreate(Bundle savedInstanceState) {  
  25.         super.onCreate(savedInstanceState);  
  26.         //tv初始化  
  27.         tv=new TextView(this);  
  28.         tv.setText("这是layout里面的tv");  
  29.         //layout初始化  
  30.         layout=new LinearLayout(this);  
  31.         layout.setId(100);//这里需要指定id,否则默认的id会和mainView一样,都是-1  
  32.         layout.setLayoutParams(new LinearLayout.LayoutParams(-1,-1));  
  33.         layout.addView(tv);  
  34.         //button1初始化  
  35.         button1=new Button(this);  
  36.         button1.setLayoutParams(new LinearLayout.LayoutParams(-2,-2));  
  37.         button1.setText("Intent方式跳转");  
  38.         button1.setOnClickListener(new OnClickListener(){  
  39.             public void onClick(View v) {  
  40.                 /*此处用Intent来实现Activity与Activity之间的跳转*/  
  41.                 Intent intent=new Intent();  
  42.                 intent.setClass(IntentTest.this,MyActivity.class);  
  43.                 //Intent intent=new Intent(IntentTest.this,MyActivity.class);  
  44.                 startActivity(intent);  
  45.             }  
  46.         });  
  47.         //button2初始化  
  48.         button2=new Button(this);  
  49.         button2.setLayoutParams(new LinearLayout.LayoutParams(-2,-2));  
  50.         button2.setText("setContentView方式跳转");  
  51.         button2.setOnClickListener(new OnClickListener(){  
  52.             public void onClick(View v) {  
  53.                 //此处用setContentView方式来实现统一Activity不同View跳转  
  54.                 setCurrentView(layout);  
  55.             }  
  56.         });  
  57.         //mianView初始化  
  58.         mainView=new LinearLayout(this);  
  59.         mainView.setId(1000);//指定id  
  60.         mainView.setLayoutParams(new LinearLayout.LayoutParams(-1,-1));  
  61.         mainView.setOrientation(LinearLayout.VERTICAL);  
  62.         mainView.addView(button1);  
  63.         mainView.addView(button2);  
  64.         //显示mainView  
  65.         setCurrentView(mainView);  
  66.     }  
  67.       
  68.     /* 
  69.      * 这里重写onKeyDown()函数,实现返回键的监听 
  70.      * 如果通过显示的View对keyListener进行监听,则返回键监听不到 
  71.      * 所以此处是通过在Activity里面重写onKeyDown()函数来实现监听 
  72.      * 此处如果不拦截监听的话,在显示layout后按返回键则直接执行退出程序 
  73.      */  
  74.     public boolean onKeyDown(int keyCode, KeyEvent event) {   
  75.         if (keyCode == KeyEvent.KEYCODE_BACK) {   
  76.             if(currentViewId==layout.getId()){  
  77.                 setCurrentView(mainView);  
  78.             }else{  
  79.                 System.exit(0);  
  80.             }  
  81.             return false;   
  82.         }   
  83.         return false;   
  84.     }  
  85.       
  86.     /*自定义函数setCurrentView()*/  
  87.     public void setCurrentView(View view){  
  88.         currentViewId=view.getId();  
  89.         //此处用setContentView方式来实现统一Activity不同View跳转  
  90.         setContentView(view);  
  91.     }  
  92. }  


MyActivity.java代码

[java]  view plain copy
  1. import android.app.Activity;  
  2. import android.os.Bundle;  
  3. import android.widget.TextView;  
  4.   
  5. public class MyActivity extends Activity{  
  6.     public void onCreate(Bundle savedInstanceState) {  
  7.         super.onCreate(savedInstanceState);  
  8.         TextView tv=new TextView(this);  
  9.         tv.setText("我是MyActivity里的tv");  
  10.         setContentView(tv);  
  11.     } 


但有时若不想有activity跳转效果,则需要用到以下方法:

Android中TabActivity使用范例

如果希望在Activity中出现多个Tab可以点击,并且点击每个Tab之后跳转到相应的Activity,可以使用TabActivity类。以下演示一个简单的范例。

首先要定义一个继承TabActivity的类,这里我们定义MainActivity,并且使其作为应用程序的入口。其代码为

[java]  view plain copy
  1. package com.myandroid.tabtest;  
  2.   
  3. import android.app.TabActivity;  
  4. import android.content.Intent;  
  5. import android.os.Bundle;  
  6. import android.widget.TabHost;  
  7. import android.widget.TabHost.TabSpec;  
  8.   
  9. public class MainActivity extends TabActivity {  
  10.     private TabHost m_tabHost;  
  11.     /** Called when the activity is first created. */  
  12.     @Override  
  13.     public void onCreate(Bundle savedInstanceState) {  
  14.         super.onCreate(savedInstanceState);  
  15.         setContentView(R.layout.tabs);  
  16.           
  17.         //getTabHost返回的TabHost用于装载tabs  
  18.         m_tabHost = getTabHost();  
  19.           
  20.         //add tabs,这里用于添加具体的Tabs,并用Tab触发相应的Activity  
  21.         addOneTab();  
  22.         addTwoTab();  
  23.         addThreeTab();  
  24.         addFourTab();  
  25.     }  
  26.       
  27.     public void addOneTab(){  
  28.         Intent intent = new Intent();  
  29.         intent.setClass(MainActivity.this, OneActivity.class);  
  30.           
  31.         TabSpec spec = m_tabHost.newTabSpec("One");  
  32.         spec.setIndicator(getString(R.string.one), null);  
  33.         spec.setContent(intent);          
  34.         m_tabHost.addTab(spec);  
  35.     }  
  36.       
  37.     public void addTwoTab(){  
  38.         Intent intent = new Intent();  
  39.         intent.setClass(MainActivity.this, TwoActivity.class);  
  40.           
  41.         TabSpec spec = m_tabHost.newTabSpec("Two");  
  42.         spec.setIndicator(getString(R.string.two), null);  
  43.         spec.setContent(intent);          
  44.         m_tabHost.addTab(spec);  
  45.     }  
  46.     public void addThreeTab(){  
  47.         Intent intent = new Intent();  
  48.         intent.setClass(MainActivity.this, ThreeActivity.class);  
  49.           
  50.         TabSpec spec = m_tabHost.newTabSpec("Three");  
  51.         spec.setIndicator(getString(R.string.three), null);  
  52.         spec.setContent(intent);          
  53.         m_tabHost.addTab(spec);  
  54.     }  
  55.     public void addFourTab(){  
  56.         Intent intent = new Intent();  
  57.         intent.setClass(MainActivity.this, FourActivity.class);  
  58.           
  59.         TabSpec spec = m_tabHost.newTabSpec("Four");  
  60.         spec.setIndicator(getString(R.string.four), null);  
  61.         spec.setContent(intent);          
  62.         m_tabHost.addTab(spec);  
  63.     }  
  64. }  

 

可以看到在MainActivity中,我们使用getTabHost()返回一个TabHost,而TabHost正是用来添加Tabs的。这里我们添加了4个Tabs,使用4个函数完成:addOneTab(),addTwoTab(),addThreeTab(),addFourTab().在这4个函数中我们使用TabSpec来描述每个的Tab,并且设置Intent,完成点击该Tab时跳转到相应的Activity的功能。

当然,这个应用还有一个关键点,就是这里的布局tabs.xml.其代码为:

[xhtml]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <TabHost  
  3.     xmlns:android="http://schemas.android.com/apk/res/android"  
  4.     android:id="@android:id/tabhost"  
  5.     android:layout_width="fill_parent"  
  6.     android:layout_height="fill_parent">  
  7.     <LinearLayout  
  8.         android:orientation="vertical"  
  9.         android:layout_width="fill_parent"  
  10.         android:layout_height="fill_parent">  
  11.      
  12.         <TabWidget android:id="@android:id/tabs"  
  13.             android:layout_width="fill_parent"  
  14.             android:layout_height="wrap_content"  
  15.             android:paddingLeft="1dip"  
  16.             android:paddingRight="1dip"  
  17.             android:paddingTop="4dip"  
  18.         />  
  19.           
  20.         <FrameLayout android:id="@android:id/tabcontent"  
  21.             android:layout_width="fill_parent"  
  22.             android:layout_height="0dip"  
  23.             android:layout_weight="1"  
  24.         />       
  25.     </LinearLayout>  
  26. </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

Java代码   收藏代码
  1. <?xml version="1.0" encoding="utf-8"?>  
  2.   
  3.    
  4.   
  5. <TabHost xmlns:android="http://schemas.android.com/apk/res/android"  
  6.   
  7.          android:id="@android:id/tabhost" android:layout_width="fill_parent"  
  8.   
  9.          android:layout_height="fill_parent">  
  10.   
  11.          <LinearLayout android:orientation="vertical"  
  12.   
  13.                    android:layout_width="fill_parent" android:layout_height="fill_parent"  
  14.   
  15.                    android:padding="5dp">  
  16.   
  17.                    <TabWidget android:id="@android:id/tabs"  
  18.   
  19.                             android:layout_width="fill_parent" android:layout_height="wrap_content" />  
  20.   
  21.                    <FrameLayout android:id="@android:id/tabcontent"  
  22.   
  23.                             android:layout_width="fill_parent" android:layout_height="fill_parent"  
  24.   
  25.                             android:padding="5dp" />  
  26.   
  27.          </LinearLayout>  
  28.   
  29. </TabHost>   

 

 

 

这里要说明一下,TabWidget为图一中的按钮控件,FrameLayout为要显示的内容。内容可以是如下两种方式来填充:

q      使用一个Activity中的两个不同的View。

q      使用完全不相关的两个Activity。

在图1中,我使用的是后者,两个完全不同的Activity。下面就来一起编写一个TabActivity的例子。

1.首先创建TabActivityDemo项目。

2.然后依次创建ArtistsActivity, AlbumsActivity, 和 SongsActivity。然后为每一例子添加一个TextView用于区分不同的Activity,如下面代码所示:

Java代码   收藏代码
  1. public class ArtistsActivity extends Activity {  
  2.   
  3.     public void onCreate(Bundle savedInstanceState) {  
  4.   
  5.         super.onCreate(savedInstanceState);  
  6.   
  7.    
  8.   
  9.         TextView textview = new TextView(this);  
  10.   
  11.         textview.setText("This is the Artists tab");  
  12.   
  13.         setContentView(textview);  
  14.   
  15.     }  
  16.   
  17. }  

 

 

 

 

3.我们有了不同的显示内容,就要为每一个按钮设置不同的图标。每一组都需要两张图片用于区分是否是被选中状态。通常的设计原则是使用灰色的图片作为选中图片,白色的作为未选中的图片。可以使用图2中两幅图片。

图2 示例图片

将要使用的图片保存到res/drawable目录中,然后创建一个名为ic_tab_artists.xml的文件在drawable文件夹中。文件代码如下:

Java代码   收藏代码
  1. <?xml version="1.0" encoding="utf-8"?>  
  2.   
  3. <selector xmlns:android="http://schemas.android.com/apk/res/android">  
  4.   
  5.     <!-- When selected, use grey -->  
  6.   
  7.     <item android:drawable="@drawable/ic_tab_artists_grey"  
  8.   
  9.           android:state_selected="true" />  
  10.   
  11.     <!-- When not selected, use white-->  
  12.   
  13.     <item android:drawable="@drawable/ic_tab_artists_white" />  
  14.   
  15. </selector>  

 

 

 

 

4.修改我们的main.xml文件如下所示:

Java代码   收藏代码
  1. <?xml version="1.0" encoding="utf-8"?>  
  2.   
  3. <TabHost xmlns:android="http://schemas.android.com/apk/res/android"  
  4.   
  5.     android:id="@android:id/tabhost"  
  6.   
  7.     android:layout_width="fill_parent"  
  8.   
  9.     android:layout_height="fill_parent">  
  10.   
  11.     <LinearLayout  
  12.   
  13.         android:orientation="vertical"  
  14.   
  15.         android:layout_width="fill_parent"  
  16.   
  17.         android:layout_height="fill_parent"  
  18.   
  19.         android:padding="5dp">  
  20.   
  21.         <TabWidget  
  22.   
  23.             android:id="@android:id/tabs"  
  24.   
  25.             android:layout_width="fill_parent"  
  26.   
  27.             android:layout_height="wrap_content" />  
  28.   
  29.         <FrameLayout  
  30.   
  31.             android:id="@android:id/tabcontent"  
  32.   
  33.             android:layout_width="fill_parent"  
  34.   
  35.             android:layout_height="fill_parent"  
  36.   
  37.             android:padding="5dp" />  
  38.   
  39.     </LinearLayout>  
  40.   
  41. </TabHost>  

 

 

 

 

TabHost将根据用户的选择,自动的切换FramLayout与TabWidget的显示内容。

5.接下来修改我们的主Activity,让其继承TabActivity。

6.然后使用为我们的主Activity添加OnCreate()方法如下所示:

Java代码   收藏代码
  1. public void onCreate(Bundle savedInstanceState) {  
  2.   
  3.     super.onCreate(savedInstanceState);  
  4.   
  5.     setContentView(R.layout.main);  
  6.   
  7.    
  8.   
  9.     Resources res = getResources(); // Resource object to get Drawables  
  10.   
  11.     TabHost tabHost = getTabHost();  // The activity TabHost  
  12.   
  13.     TabHost.TabSpec spec;  // Resusable TabSpec for each tab  
  14.   
  15.     Intent intent;  // Reusable Intent for each tab  
  16.   
  17.    
  18.   
  19.     // Create an Intent to launch an Activity for the tab (to be reused)  
  20.   
  21.     intent = new Intent().setClass(this, ArtistsActivity.class);  
  22.   
  23.    
  24.   
  25.     // Initialize a TabSpec for each tab and add it to the TabHost  
  26.   
  27.     spec = tabHost.newTabSpec("artists").setIndicator("Artists",  
  28.   
  29.                       res.getDrawable(R.drawable.ic_tab_artists))  
  30.   
  31.                   .setContent(intent);  
  32.   
  33.     tabHost.addTab(spec);  
  34.   
  35.    
  36.   
  37.     // Do the same for the other tabs  
  38.   
  39.     intent = new Intent().setClass(this, AlbumsActivity.class);  
  40.   
  41.     spec = tabHost.newTabSpec("albums").setIndicator("Albums",  
  42.   
  43.                       res.getDrawable(R.drawable.ic_tab_albums))  
  44.   
  45.                   .setContent(intent);  
  46.   
  47.     tabHost.addTab(spec);  
  48.   
  49.    
  50.   
  51.     intent = new Intent().setClass(this, SongsActivity.class);  
  52.   
  53.     spec = tabHost.newTabSpec("songs").setIndicator("Songs",  
  54.   
  55.                       res.getDrawable(R.drawable.ic_tab_songs))  
  56.   
  57.                   .setContent(intent);  
  58.   
  59.     tabHost.addTab(spec);  
  60.   
  61.    
  62.   
  63.     tabHost.setCurrentTab(2);  
  64.   
  65. }  

 

 

 

通常我们需要先得到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.看看我们的成果吧

 

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值