2011-04-07 111 views
1

我的应用程序有5个不同的活动(将它们命名为A,B,C,D,E),并且有一个菜单(由屏幕底部的按钮制作)可在A,B之间切换。 ..E活动和子活动

当我显示A时,会出现一些按钮,用户在A上面执行另一个活动A1,然后从那里进入A12,所以我的活动堆栈就像A> A1> A12,现在用户点击B的菜单按钮,然后他从那里继续B1。 (堆栈就像A> A1> A12> B> B1)现在如果用户按下按钮切换回A,所以它应该显示A12,因为它位于A之上。

如何管理此操作scanario?我在所有

+0

它看起来像经常使用的堆栈,我不知道,但。你已经尝试过了吗? – olamotte 2011-04-07 13:17:40

回答

0

我建议你应该创建一个tabHost没有暗示包含所有5活动A,B,C,d,E

后初始化tabHost,让这个隐藏标签栏致电:

tabHost.getTabWidget.setVisibility(View.GONE); 

你应该像这样各活动之间进行切换:

public boolean onOptionsItemSelected(MenuItem item) 
{ 
switch (item.getItemId()) 
{ 
    case R.id.menu_item_A: 
     tabHost.setCurrentTab(0); 
     return true; 

    case R.id.menu_item_B: 
     tabHost.setCurrentTab(1); 
     return true; 

    case R.id.menu_item_C: 
     tabHost.setCurrentTab(2); 
     return true; 

    case R.id.menu_item_D: 
     tabHost.setCurrentTab(3); 
     return true; 

    case R.id.menu_item_E: 
     tabHost.setCurrentTab(4); 
     return true; 

    return false; 
} 

所以,当你在A1 - > A2,并切换到活动B,并使用菜单切换回A,你还在在A2中。

希望它能帮助你。

4

而不是屏幕底部的按钮,使用TabHost和ActivityGroup显示选定选项卡下的多个活动。

<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"> 

    <FrameLayout 
     android:id="@android:id/tabcontent" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" /> 

    <TabWidget 
     android:id="@android:id/tabs" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_weight="0" /> 

    </LinearLayout> 

</TabHost> 

主要活动:

/** 
* Activity that displays the main tabs and manages separate activity for the 
* selected tab. 
*/ 
public class MainActivity extends TabActivity { 

    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 


    // load main view 
    setContentView(R.layout.main_activity); 

    // get the TabHost 
    TabHost tabHost = getTabHost(); 

    // resusable TabSpec for each tab 
    TabHost.TabSpec spec; 

    // reusable Intent for each tab 
    Intent intent; 

    // first tab 
    intent = new Intent(this, TabGroupActivity.class); 
    spec = tabHost.newTabSpec("first") 
     .setIndicator(createTabIndicatorView(tabHost, "First", R.drawable.ic_tab_first)) 
     .setContent(intent); 
    tabHost.addTab(spec); 

    // second tab 
    intent = new Intent(this, TabGroupActivity.class); 
    spec = tabHost.newTabSpec("second") 
     .setIndicator(createTabIndicatorView(tabHost, "Second", R.drawable.ic_tab_second)) 
     .setContent(intent); 
    tabHost.addTab(spec); 

    tabHost.setCurrentTab(0); 
    } 

    /** 
    * Creates tabs with custom layout. 
    * 
    * @param tabHost the tab host 
    * @param tabTitle the title of the tab 
    * @param icon the icon of the tab 
    * @return the view representing single tab 
    */ 
    private View createTabIndicatorView(TabHost tabHost, CharSequence tabTitle, int icon) { 
    LayoutInflater inflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    View tabIndicator = inflater.inflate(R.layout.tab_indicator, tabHost, false); 
    final TextView tv = (TextView) tabIndicator.findViewById(R.id.title); 
    tv.setText(tabTitle); 
    final ImageView iconView = (ImageView) tabIndicator.findViewById(R.id.icon); 
    iconView.setImageDrawable(getResources().getDrawable(icon)); 
    return tabIndicator; 
    } 

} 

的activty组:

/** 
* 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. 
*/ 
public class TabGroupActivity extends ActivityGroup { 

    private ArrayList<String> mIdList; 

    public TabGroupActivity() { 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    if (mIdList == null) { 
     mIdList = new ArrayList<String>(); 
    } 

    startChildActivity("firstChildActivity", new Intent(this, FirstChildActivity.class)); 
    } 

    /** 
    * 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. 
    */ 
    @Override 
    public void onBackPressed() { 
    int length = mIdList.size(); 
    if (length > 1) { 

     Activity current = getLocalActivityManager().getActivity(mIdList.get(length - 1)); 
     current.finish(); 

    } else { 
     super.onBackPressed(); 
    } 
    } 

}