Eclipse中实现跨Activity点击按钮跳转至指定TabHost标签页
如何从Activity2跳转至Activity1的指定TabHost标签页?
要实现从Activity2点击按钮跳转到Activity1的Tab2标签页,核心思路是通过Intent传递目标标签的标识,然后在Activity1中根据这个标识切换到对应标签。结合你给出的TabHost代码,这里分两步实现:
步骤1:在Activity2中传递目标标签信息
在Activity2的按钮点击事件里,创建Intent并添加额外参数,告诉Activity1要跳转到哪个标签。推荐使用标签的tag(就是你创建TabSpec时的"tab 2")来传递,这样比索引更直观,不容易出错:
// 假设你的按钮是button,在Activity2的onCreate中设置点击事件 Button button = findViewById(R.id.your_button_id); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(Activity2.this, Activity1.class); // 传递Tab2的tag值 intent.putExtra("TARGET_TAB_TAG", "tab 2"); // 如果不想重新创建Activity1实例,可以添加这个标志,把已存在的Activity1调到前台 intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); startActivity(intent); } });
步骤2:在Activity1中接收参数并切换标签
在Activity1中,完成TabHost的初始化后,接收从Activity2传来的参数,并切换到指定标签。如果Activity1是被重新创建的,就在onCreate中处理;如果是被调到前台(用了FLAG_ACTIVITY_REORDER_TO_FRONT),则需要在onNewIntent中处理:
情况1:Activity1被重新创建(默认情况)
在你的TabHost初始化代码之后,添加参数接收逻辑:
TabHost tabHost = (TabHost) findViewById(android.R.id.tabhost); tabHost.setup(); // 你的TabSpec代码保持不变 TabSpec tab1 = tabHost.newTabSpec("tab 1"); tab1.setIndicator("Time"); tab1.setContent(R.id.tab1); tabHost.addTab(tab1); TabSpec tab2 = tabHost.newTabSpec("tab 2"); tab2.setIndicator("Project"); tab2.setContent(R.id.tab2); tabHost.addTab(tab2); TabSpec tab3 = tabHost.newTabSpec("tab 3"); tab3.setIndicator("Category"); tab3.setContent(R.id.tab3); tabHost.addTab(tab3); // 接收从Activity2传来的标签标识 Intent intent = getIntent(); if (intent != null && intent.hasExtra("TARGET_TAB_TAG")) { String targetTabTag = intent.getStringExtra("TARGET_TAB_TAG"); // 根据tag切换到对应标签 tabHost.setCurrentTabByTag(targetTabTag); }
情况2:Activity1被调到前台(不重新创建)
如果添加了FLAG_ACTIVITY_REORDER_TO_FRONT,Activity1的onCreate不会再次执行,需要重写onNewIntent方法来处理参数:
// 先在Activity1中定义全局的TabHost变量 private TabHost tabHost; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.your_activity1_layout); tabHost = (TabHost) findViewById(android.R.id.tabhost); tabHost.setup(); // 你的TabSpec初始化代码... tabHost.addTab(tab1); tabHost.addTab(tab2); tabHost.addTab(tab3); // 首次创建时也处理一次参数 handleTargetTab(getIntent()); } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); setIntent(intent); // 更新当前Intent handleTargetTab(intent); } // 封装处理标签切换的方法 private void handleTargetTab(Intent intent) { if (intent != null && intent.hasExtra("TARGET_TAB_TAG")) { String targetTabTag = intent.getStringExtra("TARGET_TAB_TAG"); tabHost.setCurrentTabByTag(targetTabTag); } }
补充说明
- 如果习惯用索引切换,也可以传递索引值(Tab2的索引是1,因为TabHost的标签从0开始计数),然后调用
tabHost.setCurrentTab(1)即可。 - 使用
setCurrentTabByTag的好处是,即使后续调整标签的顺序,只要tag不变,代码就不需要修改,更健壮。
内容的提问来源于stack exchange,提问作者saraA
相关产品推荐
相关产品推荐

