【问题标题】:Activities and sub activities活动和子活动
【发布时间】:2011-07-31 16:43:18
【问题描述】:

我的应用程序有 5 个不同的活动(将它们命名为 A、B、C、D、E)并且有一个菜单(由屏幕底部的按钮组成),用于在 A、B...E 之间切换/p>

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

我该如何管理这个扫描仪?我一点提示都没有

【问题讨论】:

  • 它看起来像堆栈的常规使用,但我不确定。你已经尝试过了吗?

标签: android android-activity subactivity activity-stack


【解决方案1】:

代替屏幕底部的按钮,使用 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;
  }

}

活动组:

/**
 * 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();
    }
  }

}

【讨论】:

    【解决方案2】:

    我建议你应该创建一个包含所有 5 个 Activity A、B、C、D、E 的 tabHost。

    初始化tabHost后,通过调用隐藏这个标签栏:

    tabHost.getTabWidget.setVisibility(View.GONE);
    

    你应该像这样在每个 Activity 之间切换:

    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,并切换到 Activity B,并使用菜单切换回 A,你仍然在 A2。

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-11
      相关资源
      最近更新 更多