TabHost中,同一个页面向下级页面跳转时的解决方案
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);
这两行就可以了。
这样的问题相信曾经缠绕了很多人,我也是用了很长的时间在找解决方案,希望会帮到你哦