`
fantaxy025025
  • 浏览: 1303013 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

TabHost_新的Activity仍然持有Tab_Tab内跳转新的Activity

 
阅读更多

 

TabHost_新的Activity仍然持有Tab_Tab内跳转新的Activity

 

问题:

  TabHost内的一个页面例如tab3,如果startActivity跳入新页面,则新页面是没有Tab栏的。而很多需求和蹩脚的产品非得这么搞(而且tab栏居然不能是样式不变的)。

 

解决方法:

用ActivityGroup,以LocalActivityManager(而这个类已经被deprecated了,参考这里官方文档)来管理当前的页面的显示和历史页面的切换。

 

其他问题:

Tab内很多页面跳转,有些如果不作处理,又会跳出本Tab。

比如tab3的页面A,跳入页面B,跳入页面C,C此时已经和页面A失去了联系,如果再调准,怎么能够仍在页面A的group管理范围内呢?

可以作singleton处理,或者其他共享方式,比如static的共享变量,虽然说这样不太好。

 

import java.util.ArrayList;

import android.app.Activity;
import android.app.ActivityGroup;
import android.app.LocalActivityManager;

import android.content.Intent;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.Window;

/*
 * 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.
   */
  @Override
  public void  onBackPressed  () {
      int length = mIdList.size();
      if ( length >=1) {
          Activity current = getLocalActivityManager().getActivity(mIdList.get(length-1));
          current.finish();
      }
  }
}

 

此类的使用 方法:

public class Tab_BookCityActivity extends TabGroupActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        startChildActivity("BookCityActivity", new Intent(this, BookCityActivity.class));
    }
}

 

 

参考资料:

Use Android ActivityGroup within TabHost to show different Activity

how to Keep Tabhost when start other activity

 

分享到:
评论

相关推荐

    TabHost 同一个Tab内实现Activity之间的跳转

    本文将详细介绍如何在`TabHost`同一个Tab内实现`Activity`之间的跳转。 首先,我们需要理解`TabHost`的基本结构。`TabHost`由两部分组成:`TabWidget`和`FrameLayout`。`TabWidget`负责显示选项卡,而`FrameLayout`...

    android tabhost tab内多个activity的跳转及返回

    总结来说,要解决“android tabhost tab内多个activity的跳转及返回”问题,你需要自定义TabHost的位置,通过监听Tab点击事件启动子Activity,并使用`startActivityForResult()`和`onActivityResult()`来处理返回...

    自定义tabhost实现activity 的跳转

    本篇文章将详细介绍如何通过自定义TabHost来实现Activity之间的跳转,以及如何设计一个简洁但功能完备的界面。 首先,理解TabHost的基本结构至关重要。TabHost是一个容器,它包含一个TabWidget(标签栏)和一个...

    TabHost中每个tab中放入多个Activity

    有时需要每个tab中有多个页面,也就是说需要 在一个tab中跳转不同的Activity。 当时,我只是简单的在一个Activity中使用了动态布局 (设置layout是否显示) 虽然效果还不错,但实际上依然是同一个Activity,这样的...

    tabhost单例模式小例子

    在Android开发中,TabHost是一个非常重要的组件,用于创建具有多个Tab标签的界面,每个标签页可以关联到不同的Activity或View。本示例是关于如何使用TabHost实现单例模式的小例子,旨在帮助开发者理解如何在TabHost...

    TabHost的各种实现方式

    总结,TabHost是Android开发中实现多Tab界面的经典组件,虽然在新版本的Android中,更多地推荐使用ViewPager和TabLayout的组合,但对于理解Android的历史和各种实现方式,TabHost仍然是不可或缺的一部分。...

    TabHost技巧

    1. **使用 Intent.FLAG_ACTIVITY_CLEAR_TOP 标志**:在添加标签页时,可以在 `Intent` 中加入 `Intent.FLAG_ACTIVITY_CLEAR_TOP` 标志,该标志会确保每次切换时都会重新创建 Activity 实例,从而实现页面的刷新。...

    Android tab 实现子Activity跳转

    参考了网上大虾们的例子,实现了tab 中的子Activity跳转,并且带有动画效果;这里没有抽取动画作为参数,也可以定制自己的跳转动画;tab bar 的外观可以自己定制,将自带的tab隐藏,控制自定义的view调用tab的动作就...

    Android中TabHost使用

    2. 如果使用Intent,记得使用`Intent.FLAG_ACTIVITY_CLEAR_TOP`标志,以确保当切换回已存在的Activity时,该Activity会被重新激活而不是创建新的实例。 3. 考虑使用`TabLayout`和`ViewPager`(Android Design ...

    Android tab的实现

    在“同一个tab内部实现多个activity的跳转”这一描述中,可能意味着每个Tab对应一个主Activity,而主Activity内可以根据用户的操作启动其他子Activity。这种情况下,可以使用Intent启动新Activity,或者在主Activity...

    Android源码——TabHost内嵌ActivityGroup界面管理源码_new_17.zip

    在内嵌ActivityGroup的TabHost中,每个tab下的界面不再是简单的View或者Fragment,而是整个Activity。这样,当用户在不同tab之间切换时,ActivityGroup会负责管理这些子Activity的创建、销毁和保存状态。 源码中,...

    Android TabHost组件使用方法详解

    在Android开发中,TabHost组件是一个非常实用的控件,用于创建带有标签页的应用界面,让用户可以在多个功能之间轻松切换。本文将详细讲解如何使用TabHost,并...不过,了解TabHost仍然是理解Android UI体系的重要部分。

    Tabhost界面详细应用

    `创建一个新的`TabHost`实例,然后使用`tabHost.setup();`初始化它。 2. 添加选项卡:使用`tabHost.addTab()`方法来添加每个选项卡。这个方法需要传入四个参数:`TabSpec`(定义选项卡的属性)、`Intent`(与选项卡...

    tabhost和ActivityGroup的组合使用

    在早期的Android版本中,ActivityGroup用于在一个Tab内管理多个Activity的堆栈。它的主要作用是在不离开TabHost的情况下,实现内部Activity的切换和堆栈管理。然而,从Android 3.0(API级别11)开始,ActivityGroup...

    Android TabHost 滑动效果 上拉刷新 下拉加载更多

    在Android开发中,TabHost是一个非常重要的组件,用于创建具有多个Tab标签的界面,每个标签页可以关联不同的Activity或者Fragment,实现多视图间的切换。本教程将详细讲解如何利用TabHost结合ListView、ViewPager和...

    Android tab 左右可滑动跳转

    在本场景中,"Android tab 左右可滑动跳转"的实现主要是通过结合这两个组件来完成的。 首先,我们需要引入必要的依赖库。在`build.gradle`文件中,确保你添加了以下依赖: ```gradle dependencies { ...

    Android应用源码之嵌套TabHost示例.rar

    每个Tab都可以关联一个Intent,这个Intent可以启动一个新的Activity或者Fragment。在这个源码示例中,你可能会看到以下关键知识点: 1. **TabWidget**:这是TabHost中的一个组件,显示了各个Tab标签。开发者可以...

    Tabhost综合实例

    4. **交互处理**: 当用户点击`ListView`的项时,你可以监听`onItemClick`事件来处理用户的选择,比如跳转到新的详情页面或者执行其他操作。 ```java listView.setOnItemClickListener(new AdapterView....

    TabActivity跳转

    这样,尽管用户实际上跳转到了新的Activity,但在视觉上他们仍能感知到是在当前`Tab`内的操作。 4. 使用`ViewModel`或`EventBus`进行通信:在更复杂的情况下,你可能需要在多个Activity之间传递数据或事件。这时,...

Global site tag (gtag.js) - Google Analytics