用ActivityGroup解決TabHost中多個Activity跳轉問題
最近在做一個程序,剛開始沒考慮全,就用TabHost做了,後來才發現程序中,需要在一個TabHost內實現多個Activity的跳轉,網上搜了一翻,有人建議把TabHost改成Button,然後每個Activity中都處理加入的Button,這樣是可以解決問題,但是修改起來很繁瑣,所以還是繼續尋找替代方法。在網上搜到了《使用ActivityGroup來切換Activity和Layout》一文,但是用在我的程序中還需要有大的改動,所以索性我就自己寫了個測試例子,不錯,成功了,拿出來和大家分享一下,希望對大家有幫助!
下麵圖片是測試程序的效果圖
兩個選項卡的實現
布局文件 main.xml
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
- android:orientation="vertical" android:layout_width="fill_parent"
- android:layout_height="fill_parent">
- <TabHost xmlns:android="https://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" />
- <FrameLayout android:id="@android:id/tabcontent"
- android:layout_width="fill_parent" android:layout_height="wrap_content"
- android:layout_weight="3">
- </FrameLayout>
- </LinearLayout>
- </TabHost>
- </LinearLayout>
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:andro android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TabHost xmlns:andro android: 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: android:layout_width="fill_parent" android:layout_height="wrap_content" /> <FrameLayout android: android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="3"> </FrameLayout> </LinearLayout> </TabHost> </LinearLayout>
Java代碼實現 MainActivity.java
- package hkp.test;
- import android.app.TabActivity;
- import android.content.Intent;
- import android.os.Bundle;
- import android.widget.TabHost;
- public class MainActivity extends TabActivity {
- private TabHost tabHost;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- tabHost = getTabHost();
- tabHost.addTab(tabHost.newTabSpec("tab1")
- .setIndicator("First")
- .setContent(new Intent(this,FirstGroupTab.class)));//第一個選項卡使用一個ActivityGroup
- tabHost.addTab(tabHost.newTabSpec("tab2")
- .setIndicator("Second")
- .setContent(new Intent(this, SecondTab.class)));//第二個選項卡是一個Activity
- tabHost.setCurrentTab(0);
- }
- }
package hkp.test; import android.app.TabActivity; import android.content.Intent; import android.os.Bundle; import android.widget.TabHost; public class MainActivity extends TabActivity { private TabHost tabHost; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.main); tabHost = getTabHost(); tabHost.addTab(tabHost.newTabSpec("tab1") .setIndicator("First") .setContent(new Intent(this,FirstGroupTab.class)));//第一個選項卡使用一個ActivityGroup tabHost.addTab(tabHost.newTabSpec("tab2") .setIndicator("Second") .setContent(new Intent(this, SecondTab.class)));//第二個選項卡是一個Activity tabHost.setCurrentTab(0); } }
使用 ActivityGroup的管理
- package hkp.test;
- import android.app.ActivityGroup;
- import android.content.Intent;
- import android.os.Bundle;
- import android.view.View;
- import android.view.Window;
- /**
- * @author HuangKaipeng hkp2006@gmail.com
- * 2011-10-5
- *
- */
- public class FirstGroupTab extends ActivityGroup {
- /**
- * 一個靜態的ActivityGroup變量,用於管理本Group中的Activity
- */
- public static ActivityGroup group;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- super.onCreate(savedInstanceState);
- group = this;
- }
- @Override
- public void onBackPressed() {
- // TODO Auto-generated method stub
- // super.onBackPressed();
- //把後退事件交給子Activity處理
- group.getLocalActivityManager()
- .getCurrentActivity().onBackPressed();
- }
- @Override
- protected void onResume() {
- // TODO Auto-generated method stub
- super.onResume();
- //把界麵切換放到onResume方法中是因為,從其他選項卡切換回來時,
- //調用搞得是onResume方法
- //要跳轉的界麵
- Intent intent = new Intent(this, FirstActivity.class).
- addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
- //把一個Activity轉換成一個View
- Window w = group.getLocalActivityManager().startActivity("FirstActivity",intent);
- View view = w.getDecorView();
- //把View添加大ActivityGroup中
- group.setContentView(view);
- }
package hkp.test; import android.app.ActivityGroup; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.Window; /** * @author HuangKaipeng hkp2006@gmail.com * 2011-10-5 * */ public class FirstGroupTab extends ActivityGroup { /** * 一個靜態的ActivityGroup變量,用於管理本Group中的Activity */ public static ActivityGroup group; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); group = this; } @Override public void onBackPressed() { // TODO Auto-generated method stub // super.onBackPressed(); //把後退事件交給子Activity處理 group.getLocalActivityManager() .getCurrentActivity().onBackPressed(); } @Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); //把界麵切換放到onResume方法中是因為,從其他選項卡切換回來時, //調用搞得是onResume方法 //要跳轉的界麵 Intent intent = new Intent(this, FirstActivity.class). addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); //把一個Activity轉換成一個View Window w = group.getLocalActivityManager().startActivity("FirstActivity",intent); View view = w.getDecorView(); //把View添加大ActivityGroup中 group.setContentView(view); }
ActivityGroup中的第一個Activity
- package hkp.test;
- import android.app.Activity;
- import android.content.Intent;
- import android.os.Bundle;
- import android.view.View;
- import android.view.Window;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- /**
- * @author HuangKaipeng hkp2006@gmail.com
- * 2011-10-5
- *
- */
- public class FirstActivity extends Activity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- super.onCreate(savedInstanceState);
- setContentView(R.layout.first_activity);
- //跳轉到第二個界麵
- Button btn = (Button) findViewById(R.id.btn);
- btn.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- Intent intent = new Intent(FirstActivity.this, SecondActivity.class).
- addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
- //把一個Activity轉換成一個View
- Window w = FirstGroupTab.group.getLocalActivityManager()
- .startActivity("SecondActivity",intent);
- View view = w.getDecorView();
- //把View添加大ActivityGroup中
- FirstGroupTab.group.setContentView(view);
- }
- });
- }
- }
package hkp.test; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.Window; import android.view.View.OnClickListener; import android.widget.Button; /** * @author HuangKaipeng hkp2006@gmail.com * 2011-10-5 * */ public class FirstActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.first_activity); //跳轉到第二個界麵 Button btn = (Button) findViewById(R.id.btn); btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub Intent intent = new Intent(FirstActivity.this, SecondActivity.class). addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); //把一個Activity轉換成一個View Window w = FirstGroupTab.group.getLocalActivityManager() .startActivity("SecondActivity",intent); View view = w.getDecorView(); //把View添加大ActivityGroup中 FirstGroupTab.group.setContentView(view); } }); } }
XML
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- >
- <TextView
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="這個是ActivityGroup中的第一個界麵!"
- />
- <Button android:id="@+id/btn"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="跳轉到本組中的另一個Activity中"/>
- </LinearLayout>
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:andro android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="這個是ActivityGroup中的第一個界麵!" /> <Button android: android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="跳轉到本組中的另一個Activity中"/> </LinearLayout>
- GroupInTab.rar (50.1 KB)
最後更新:2017-04-02 22:16:28