最近搞个毕业设计,想搞个底部菜单的效果,可是网上找了很多代码,各有不同,感觉很乱,于是想写篇博客总结一下,方便日后查询.\
第一次方法:使用tabhost+ActivityGroup实现菜单及分页效果
首先,是主xml布局-->main.xml
代码如下:
从代码可知,要实现tabhost必须要有三个部分:TabHost,TabWidget,Framelayout.
1.最外层的TabHost可以自定义id也可以使用系统id@android:id/tabhost,我这使用的是自定义id,其中的区别后面会有说明,只要是Tabhost函数的获取方式不同.
2,tabwidget 是存放你的菜单的参数.,id必须为系统id @android:id/tabs
3.FrameLayout 是存放你的分页的参数,id必须为系统id @android:id/tabcontent ,
然后下面各个分页的xml (这里我们弄三个分页)
tab1.xml
tab3.xml
布局都非常简单.只有一个textview,然后显示不同文字;
接下来是菜单的布局文件,tabmini.xml (布局也很简单)
public class M1 extends ActivityGroup implements OnTabChangeListener {
private TabHost host;
private ViewFlipper flipper = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.tab1);
host = (TabHost) findViewById(R.id.tabhost); // 上面提到过,由于我们用的是自定义的tabhost的id,所以用FindViewById找到TabHost.
// 但是如果你用的是系统的id,就必须该activity继承TabActivity,然后通过getTabHost()方法找到TabHost
host.setup(); // 该方法是为了初始化我们的TabHost的几个参数,上面有将
host.setup(this.getLocalActivityManager());
host.setCurrentTab(1); // 默认为分页1
Intent intent1 = new Intent(this, BodyActivity.class);
Intent intent2 = new Intent(this, Information.class);
Intent intent3 = new Intent(this, ModeActivity.class);
host.addTab(host.newTabSpec("tab1")
.setIndicator(createview(R.drawable.seek, "扫描签到"))
.setContent(intent1)); // 将一下括号内的三个参数,第一个是设置标签也得名字,只要不重复就行,第二个是设置菜单的样式,我们这里是一个图片加文字的样式,,第三个是设置菜单选中时要显示的activity
// !!!!!!需要注意的是,网上有人第三个参数传递的是id,这样的后果是虽然能正常显示各个分页,但每个分页没有功能,应为只是纯粹加载视图, 要让每个页面有功能,必须传intent!!!
host.addTab(host
.newTabSpec("tab3")
.setIndicator(createview(R.drawable.tab_myzone_opacity, "个人信息"))
.setContent(intent2));
host.addTab(host.newTabSpec("tab4")
.setIndicator(createview(R.drawable.mode, "签到生成"))
.setContent(intent3));
host.setOnTabChangedListener(this);
}
public View createview(int id, String str) {
View view1 = LayoutInflater.from(this).inflate(R.layout.tab_mini, null); // 这里是加载我们菜单布局,并且给菜单赋值
ImageView imageView1 = (ImageView) view1.findViewById(R.id.imageView1);
TextView textView1 = (TextView) view1.findViewById(R.id.textView1);
imageView1.setImageResource(id);
textView1.setText(str);
return view1;
}
/**
* 判断分页是否被选中
*
* @param tabHost
*/
public void updateTab(TabHost tabHost) {
for (int i = 0; i < tabHost.getTabWidget().getChildCount(); i++) {
View view = tabHost.getTabWidget().getChildAt(i);
// ImageView imageView = (ImageView) view
// .findViewById(R.id.imageView1);
// TextView textView = (TextView) view.findViewById(R.id.textView1);
if (tabHost.getCurrentTab() == i) {
view.setBackgroundResource(R.color.hs); // 选中时,该部分菜单,背景颜色改变
} else {
view.setBackgroundResource(R.color.grgray);
}
}
}
最后还是附上效果图吧
声明:以上纯手写,有错勿喷,自行参考