Android 在从按钮单击切换意图时保留tabhost

Android 在从按钮单击切换意图时保留tabhost,android,button,android-tabhost,Android,Button,Android Tabhost,我正在向我的应用程序添加新的选项卡布局。我的应用程序有4个活动 之前,导航是通过活动中显示的按钮完成的,例如活动1中的按钮使您转到第4节。每个按钮都以新的意图开始新的活动。若要返回,用户可以点击本机设备返回按钮 按钮示例: Button b1= (Button) findViewById(R.id.b1); b1.setOnClickListener(new OnClickListener() { @Override public void onClick

我正在向我的应用程序添加新的选项卡布局。我的应用程序有4个活动

之前,导航是通过活动中显示的按钮完成的,例如活动1中的按钮使您转到第4节。每个按钮都以新的意图开始新的活动。若要返回,用户可以点击本机设备返回按钮

按钮示例:

Button b1= (Button) findViewById(R.id.b1);
    b1.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent i = new Intent(this, ActivityTab4.class);
            startActivity(i);                           
        }
   });
现在,使用tabhost,用户直接进入desire活动,每个活动都是我的tabhost的子活动。但是,我仍然需要在布局中保留一些直接跳到特定活动的按钮

这些按钮的问题在于,当它们开始一个新的活动时,tabhost就会消失。我需要一直保存它

那么,我怎样才能正常使用tabhost,但在它的顶部,在我的分区布局中也使用自定义按钮,当我点击它们时,这些按钮将保留tabhost

我的tabhost结构非常基本:

public class TabWidget extends TabActivity {    

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.global_tabs);
    setTabs() ;     
    }   

private void setTabs() {        
    addTab("Act1", R.drawable.tab1, ActivityTab1.class);
    addTab("Act2", R.drawable.tab2, ActivityTab2.class);        
    addTab("Act3", R.drawable.tab1, ActivityTab3.class);
    addTab("Act4", R.drawable.tab2, ActivityTab4.class);
    }

private void addTab(String labelId, int drawableId, Class<?> c) {

    TabHost tabHost = getTabHost();
    Intent intent = new Intent(this, c);
    TabHost.TabSpec spec = tabHost.newTabSpec("tab" + labelId); 

    // SET TITLETAB
    View tabIndicator = LayoutInflater.from(this).inflate(R.layout.tab_indicator, getTabWidget(), false);
    TextView title = (TextView) tabIndicator.findViewById(R.id.titleTab);
    title.setText(labelId);

    // SET IMAGETAB
    ImageView icon = (ImageView) tabIndicator.findViewById(R.id.icon);
    icon.setImageResource(drawableId);

    spec.setIndicator(tabIndicator);
    spec.setContent(intent);
    tabHost.addTab(spec);
    }}
公共类TabWidget扩展了TabActivity{
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.global_选项卡);
setTabs();
}   
私有void setTabs(){
addTab(“Act1”,R.drawable.tab1,ActivityTab1.class);
addTab(“Act2”,R.drawable.tab2,ActivityTab2.class);
addTab(“Act3”,R.drawable.tab1,ActivityTab3.class);
addTab(“Act4”,R.drawable.tab2,ActivityTab4.class);
}
私有void addTab(字符串labelId,int-drawableId,c类){
TabHost TabHost=getTabHost();
意向=新意向(本,c);
TabHost.TabSpec spec=TabHost.newTabSpec(“tab”+labelId);
//设置标题选项卡
查看tabIndicator=LayoutInflater.from(this).充气(R.layout.tab_indicator,getTabWidget(),false);
TextView title=(TextView)tabIndicator.findViewById(R.id.titleTab);
标题:setText(labelId);
//设置图像选项卡
ImageView图标=(ImageView)选项卡indicator.findViewById(R.id.icon);
icon.setImageResource(drawableId);
规格设置指示器(tabIndicator);
规格设置内容(意图);
tabHost.addTab(spec);
}}
谢谢你的帮助


编辑:我宁愿避免使用片段,因为实现它们要花很多时间,而且最重要的是要使它与API兼容为什么要使用tabhost和activities而不是片段?我想你会发现碎片更适合你想做的事情

至于您的问题-您可以使用切换显示的选项卡

 void   setCurrentTab(int index) 
 void   setCurrentTabByTag(String tag)

因此,无需在按下按钮时手动启动活动,只需使用以下方法切换显示的选项卡即可。

好的,多亏了这个答案,我找到了它:

基本上,在主tabhost活动中,添加以下内容

private static Main theInstance;

public static Main getInstance() {
    return Main.theInstance;
}

public Main () {
    Main.theInstance = this;
}
在子项中,您可以使用一个按钮将用户发送到任何选项卡+相应的活动:

Button b1_3= (Button) findViewById(R.id.b1_3);
    b1_3.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {

            TabWidget.getInstance().getTabHost().setCurrentTab(3);
        }
   });

谢谢你的回复。如果我在我的子活动中使用此代码,我如何“调用”tabHost函数?我已经看到它是通过从子活动调用tabHost活动并在定义应显示哪个选项卡的意图中放置一个键来完成的。因此,无论何时创建,父活动都会检查intent键,并根据它调用tabhost上的方法?