android里面,TabHost確實應用很廣泛,也很好用,但就是有一個問題,同一個Tab中的頁面如果有下一級頁面的話,如果用startActivity來跳轉的話,會跳出TabHost,即Tab就不會顯示了,這樣確實很不方便,項目用到了,想跳到下級頁面的時候還顯示Tab,找了很多方案都不能解決,后來在國外的網站上面看到了別人的解決方案,確實很好用。
第一步是添加一個這樣的類
/** * The purpose of this Activity is to manage the activities in a tab. Note: * Child Activities can handle Key Presses before they are seen here. * * @author Eric Harlow */ public class TabGroupActivity extends ActivityGroup { private ArrayList<String> mIdList; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (mIdList == null) mIdList = new ArrayList<String>(); } /** * This is called when a child activity of this one calls its finish method. * This implementation calls {@link LocalActivityManager#destroyActivity} on * the child activity and starts the previous activity. If the last child * activity just called finish(),this activity (the parent), calls finish to * finish the entire group. */ @Override public void finishFromChild(Activity child) { LocalActivityManager manager = getLocalActivityManager(); int index = mIdList.size() - 1; if (index < 1) { finish(); return; } manager.destroyActivity(mIdList.get(index), true); mIdList.remove(index); index--; String lastId = mIdList.get(index); Intent lastIntent = manager.getActivity(lastId).getIntent(); Window newWindow = manager.startActivity(lastId, lastIntent); setContentView(newWindow.getDecorView()); } /** * Starts an Activity as a child Activity to this. * * @param Id * Unique identifier of the activity to be started. * @param intent * The Intent describing the activity to be started. * @throws android.content.ActivityNotFoundException. */ public void startChildActivity(String Id, Intent intent) { Window window = getLocalActivityManager().startActivity(Id, intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)); if (window != null) { mIdList.add(Id); setContentView(window.getDecorView()); } } /** * The primary purpose is to prevent systems before * android.os.Build.VERSION_CODES.ECLAIR from calling their default * KeyEvent.KEYCODE_BACK during onKeyDown. */ @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { // preventing default implementation previous to // android.os.Build.VERSION_CODES.ECLAIR return true; } return super.onKeyDown(keyCode, event); } /** * Overrides the default implementation for KeyEvent.KEYCODE_BACK so that * all systems call onBackPressed(). */ @Override public boolean onKeyUp(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { onBackPressed(); return true; } return super.onKeyUp(keyCode, event); } /** * If a Child Activity handles KeyEvent.KEYCODE_BACK. Simply override and * add this method. * * 只適用於2.0及以上版本 */ @Override public void onBackPressed() { int length = mIdList.size(); if (length > 1) { Activity current = getLocalActivityManager().getActivity( mIdList.get(length - 1)); current.finish(); }else{ System.exit(0); } } }
第二步是點擊每一個Tab都會跳到相應的頁面,讓這些頁面繼承上面這個類
public class Tab1 extends TabGroupActivity { @Override public void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); Intent intent = new Intent(getParent(),HomeActivity.class); startChildActivity("HomeActivity", intent); } }
用的時候注意
Intent intent = new Intent(getParent(),HomeActivity.class);
startChildActivity("HomeActivity", intent);
這兩行就可以了。
這樣的問題相信曾經纏繞了很多人,我也是用了很長的時間在找解決方案,希望會幫到你哦