一、 TabActivity之间跳转和传值已经成了一个很普遍的问题,下面先介绍一下跳转这个问题:
1.很多时候我们的项目跳转不在局限于点击TabWidget的时候跳转到TabAcitvity的子项,而是点击子项之间跳转到其他子项,如果我们之间用Intent跳转的话是不会进入子项的,只有通过mTabHost.setCurrentTabByTag("tab1"),这样的操作才能跳转到子项,这是两个Activity之间的传递我们可以通过广播或者借口来实现,本篇先介绍一下通过借口来传递任务吧:
首先我们建一个接口:
public interface Task {
/**
* 刷新跳转的当前页面
* @param page 跳转到该页面的标识
* @param map 传入的参数(自己可根据需要修改参数)
*/
void onRefresh(int page,HashMap<String, Object> map);
}
在TabActivity中实现该接口,在其他子项回调该接口,
主要要注意一点就是该怎么回调,要怎么回调才是我目前的TabActivity,我做了以下操作,把当前的Activity添加到了list集合里面,去的时候用集合里面的:
/**
* 工具类
* @author glacier
*
*/
public class Util {
private static ArrayList<Task> allActivity;
/**
* 重置allActivity
* @param iw 需要更新Activity
*/
public static void removeActivity() {
allActivity=null;
allActivity = new ArrayList<Task>();
}
/**
* 把需要更新Activity添加到集合里
* @param iw 需要更新Activity
*/
public static void addActivity(Task iw) {
allActivity.add(iw);
}
/**
* 根据Activity的名字获取要更新的界面
* @param name 需要更新Activity的名字
* @return
*/
public static Task getActivityByName(String name) {
System.out.println("ssss"+allActivity);
for (Task iw : allActivity) {
if (iw.getClass().getName().indexOf(name) >= 0) {
return iw;
}
}
return null;
}
}
如果我们点击子项跳转的时候我们就调用TabActivity的设置标签的方法,传参也是我无意中发现的,当我们设置标签的时候会用到Intent,我们都是用这个传的,经过试验设置标签的时候是会重新设置Intent的,这样我们的传参问题也解决了.我们就可以在主类和子类中任意切换了:
/**
* 初始化数据
*/
private void init() {
// 把这个Activity添加到集合里,从集合里面取,如果不这样添加回调回来的不是该Activity
Util.removeActivity();
Util.addActivity(this);
tab1 = (TextView) findViewById(R.id.tab1);
tab2 = (TextView) findViewById(R.id.tab2);
tab3 = (TextView) findViewById(R.id.tab3);
tabIntent1 = new Intent(this, Activity1.class);
tabIntent2 = new Intent(this, Activity2.class);
tabIntent3 = new Intent(this, Activity3.class);
mTabHost = getTabHost();
mTabHost.addTab(mTabHost.newTabSpec("tab1").setContent(tabIntent1)
.setIndicator("tab1"));
mTabHost.addTab(mTabHost.newTabSpec("tab2").setContent(tabIntent2)
.setIndicator("tab2"));
mTabHost.addTab(mTabHost.newTabSpec("tab3").setContent(tabIntent3)
.setIndicator("tab3"));
tab1.setBackgroundColor(Color.RED);
tab1.setOnClickListener(this);
tab2.setOnClickListener(this);
tab3.setOnClickListener(this);
}
/**
* 下面按钮的默认未选中背景
*/
private void setDefaultImage() {
// TODO Auto-generated method stub
tab1.setBackgroundColor(Color.WHITE);
tab2.setBackgroundColor(Color.WHITE);
tab3.setBackgroundColor(Color.WHITE);
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
setDefaultImage();
switch (v.getId()) {
case R.id.tab1:
tabIntent1.putExtra("tv1","点击TabWidget跳转滴");
tab1.setBackgroundColor(Color.RED);
mTabHost.setCurrentTabByTag("tab1");
break;
case R.id.tab2:
tabIntent2.putExtra("tv1","点击TabWidget跳转滴");
tab2.setBackgroundColor(Color.RED);
mTabHost.setCurrentTabByTag("tab2");
break;
case R.id.tab3:
tabIntent3.putExtra("tv1","点击TabWidget跳转滴");
tab3.setBackgroundColor(Color.RED);
mTabHost.setCurrentTabByTag("tab3");
break;
}
}
@Override
// 接口回调
public void onRefresh(int page, HashMap<String, Object> map) {
// TODO Auto-generated method stub
setDefaultImage();
switch (page) {
case 1:
byValue(tabIntent1, map);
tab1.setBackgroundColor(Color.RED);
mTabHost.setCurrentTabByTag("tab1");
break;
case 2:
byValue(tabIntent2, map);
tab2.setBackgroundColor(Color.RED);
mTabHost.setCurrentTabByTag("tab2");
break;
case 3:
byValue(tabIntent3, map);
tab3.setBackgroundColor(Color.RED);
mTabHost.setCurrentTabByTag("tab3");
break;
}
}
/**
* 用来传值
* @param intent
* @param map
*/
private void byValue(Intent intent,HashMap<String, Object> map){
if(map!=null){
intent.putExtra("tv1", map.get("tv1").toString());
}else{
intent.putExtra("tv1", "");
}
}
子项的Activity调用:
Util.getActivityByName("MainActivity").onRefresh(2, map);
就可以了!!!
下面让大家看下我实现的效果:
上面的标签是显示从哪跳转过来的,输入框可自己输入参数,可以跳出TabActivity,在外面在跳入任意TabActivity子项
以上就是用接口实现的方法,如有疑问欢迎提出!!!
本人 原创.如需参考请注明博客地址...
http://blog.csdn.net/wang_yubin
源码 我已上传请
点击我