关于自定义TabHost的使用和注意事项

最近搞个毕业设计,想搞个底部菜单的效果,可是网上找了很多代码,各有不同,感觉很乱,于是想写篇博客总结一下,方便日后查询.\

第一次方法:使用tabhost+ActivityGroup实现菜单及分页效果

首先,是主xml布局-->main.xml

代码如下:

<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/tabhost"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <RelativeLayout
        android:id="@+id/linearLayout1"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" >

        <TabWidget
            android:id="@android:id/tabs"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true" >
        </TabWidget>

        <FrameLayout
            android:id="@android:id/tabcontent"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent" >
        </FrameLayout>

    </RelativeLayout>

</TabHost>

从代码可知,要实现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

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:gravity="center"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="我是tab1" />

</LinearLayout>

tab2.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:gravity="center"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="我是tab2" />

</LinearLayout>
tab3.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:gravity="center"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="我是tab3" />

</LinearLayout>

布局都非常简单.只有一个textview,然后显示不同文字;


接下来是菜单的布局文件,tabmini.xml  (布局也很简单)

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:background="@color/grgray"
    android:gravity="center_horizontal"
    android:orientation="vertical" >

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/kaoqin" />

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
         />

</LinearLayout>

然后是主程序代码了

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);
			}

		}

	}






详细说明代码中都有了,记得上面的activity继承的是 ActivityGroup 而不是activity,因为我们在此activity中装载不同的activity分页


最后还是附上效果图吧







声明:以上纯手写,有错勿喷,自行参考











  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值