`

TabHost与RadioGroup结合完成的菜单

阅读更多
TabHost与RadioGroup结合完成的菜单,记录下
转自:http://www.iteye.com/topic/1116261

效果图:


首先看布局文件:

<?xml version="1.0" encoding="UTF-8"?>
<TabHost android:id="@android:id/tabhost" android:layout_width="fill_parent" android:layout_height="fill_parent"
  xmlns:android="http://schemas.android.com/apk/res/android">
    <LinearLayout 
    	android:orientation="vertical" 
    	android:layout_width="fill_parent" 
    	android:layout_height="fill_parent">
        <FrameLayout 
        	android:id="@android:id/tabcontent" 
        	android:layout_width="fill_parent" 
        	android:layout_height="0.0dip" 
        	android:layout_weight="1.0" />
        <TabWidget 
        	android:id="@android:id/tabs" 
        	android:visibility="gone" 
        	android:layout_width="fill_parent" 
        	android:layout_height="wrap_content" 
        	android:layout_weight="0.0" />
        <RadioGroup 
        	android:gravity="center_vertical" 
        	android:layout_gravity="bottom" 
        	android:orientation="horizontal" 
        	android:id="@+id/main_radio" 
        	android:background="@drawable/maintab_toolbar_bg" 
        	android:layout_width="fill_parent" 
        	android:layout_height="wrap_content">
            <RadioButton 
            	android:id="@+id/radio_button0" 
            	android:tag="radio_button0" 
            	android:layout_marginTop="2.0dip" 
            	android:text="@string/alarm" 
            	android:drawableTop="@drawable/icon_1" 
            	style="@style/main_tab_bottom" />
            <RadioButton 
            	android:id="@+id/radio_button1" 
            	android:tag="radio_button1" 
            	android:layout_marginTop="2.0dip" 
            	android:text="@string/message" 
            	android:drawableTop="@drawable/icon_2" 
            	style="@style/main_tab_bottom" />
            <RadioButton 
            	android:id="@+id/radio_button2" 
            	android:tag="radio_button2" 
            	android:layout_marginTop="2.0dip" 
            	android:text="@string/photo" 
            	android:drawableTop="@drawable/icon_3" 
            	style="@style/main_tab_bottom" />
            <RadioButton 
            	android:id="@+id/radio_button3" 
            	android:tag="radio_button3" 
            	android:layout_marginTop="2.0dip" 
            	android:text="@string/music" 
            	android:drawableTop="@drawable/icon_4" 
            	style="@style/main_tab_bottom" />
            <RadioButton 
            	android:id="@+id/radio_button4" 
            	android:tag="radio_button4" 
            	android:layout_marginTop="2.0dip" 
            	android:text="@string/setting" 
            	android:drawableTop="@drawable/icon_5" 
            	style="@style/main_tab_bottom" />
        </RadioGroup>
    </LinearLayout>
</TabHost>


需要注意的是,如果用TabHost这个控件,其中有几个ID是必须这么写的,android:id="@android:id/tabhost   ;android:id="@android:id/tabcontent" ;android:id="@android:id/tabs" ;之所以要这么写是因为在TabHost这个类中。需要实例化上述这个ID的控件。看源码:

在TabActivity中有么个方法:

@Override
public void onContentChanged() {
	super.onContentChanged();
	mTabHost = (TabHost) findViewById(com.android.internal.R.id.tabhost);

	if (mTabHost == null) {
		throw new RuntimeException(
				"Your content must have a TabHost whose id attribute is " +
				"'android.R.id.tabhost'");
	}
	mTabHost.setup(getLocalActivityManager());
}

private void ensureTabHost() {
	if (mTabHost == null) {
		this.setContentView(com.android.internal.R.layout.tab_content);
	}
}


当内容发生改变时它会调用这个方法,来更新列表或者其他视图,而这个方法中需要实例化TabHost,所以必须通过ID为tabhost实例化。

再看看TabHost这个类中,
public void setup() {
	mTabWidget = (TabWidget) findViewById(com.android.internal.R.id.tabs);
	if (mTabWidget == null) {
		throw new RuntimeException(
				"Your TabHost must have a TabWidget whose id attribute is 'android.R.id.tabs'");
	}

	// KeyListener to attach to all tabs. Detects non-navigation keys
	// and relays them to the tab content.
	mTabKeyListener = new OnKeyListener() {
		public boolean onKey(View v, int keyCode, KeyEvent event) {
			switch (keyCode) {
				case KeyEvent.KEYCODE_DPAD_CENTER:
				case KeyEvent.KEYCODE_DPAD_LEFT:
				case KeyEvent.KEYCODE_DPAD_RIGHT:
				case KeyEvent.KEYCODE_DPAD_UP:
				case KeyEvent.KEYCODE_DPAD_DOWN:
				case KeyEvent.KEYCODE_ENTER:
					return false;

			}
			mTabContent.requestFocus(View.FOCUS_FORWARD);
			return mTabContent.dispatchKeyEvent(event);
		}

	};

	mTabWidget.setTabSelectionListener(new TabWidget.OnTabSelectionChanged() {
		public void onTabSelectionChanged(int tabIndex, boolean clicked) {
			setCurrentTab(tabIndex);
			if (clicked) {
				mTabContent.requestFocus(View.FOCUS_FORWARD);
			}
		}
	});

	mTabContent = (FrameLayout) findViewById(com.android.internal.R.id.tabcontent);
	if (mTabContent == null) {
		throw new RuntimeException(
				"Your TabHost must have a FrameLayout whose id attribute is "
						+ "'android.R.id.tabcontent'");
	}
}


这个方法,是在增加选项卡之前由系统调用。在这个方法中需要通过tabs 这个ID实例化一个TabWidget,通过tabcontent这个ID实例化一个FrameLayout,用来放置选项卡内容。所以这两个ID也是固定的。

在上述布局文件中隐藏了系统默认的Widget,取而代之的是带有图片的Button。

看一下主要代码:

package com.iteye.androidtoast;

import android.app.TabActivity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.RadioGroup;
import android.widget.RadioGroup.OnCheckedChangeListener;
import android.widget.TabHost;

public class MainActivity extends TabActivity implements OnCheckedChangeListener{
    /** Called when the activity is first created. */
	private TabHost mHost;
	private RadioGroup radioderGroup;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.maintabs);
        //实例化TabHost
        mHost=this.getTabHost();
        
        //添加选项卡
        mHost.addTab(mHost.newTabSpec("ONE").setIndicator("ONE")
        			.setContent(new Intent(this,OneActivity.class)));
        mHost.addTab(mHost.newTabSpec("TWO").setIndicator("TWO")
        		.setContent(new Intent(this,TwoActivity.class)));
        mHost.addTab(mHost.newTabSpec("THREE").setIndicator("THREE")
        		.setContent(new Intent(this,ThreeActivity.class)));
        mHost.addTab(mHost.newTabSpec("FOUR").setIndicator("FOUR")
        		.setContent(new Intent(this,FourActivity.class)));
        mHost.addTab(mHost.newTabSpec("FIVE").setIndicator("FIVE")
        		.setContent(new Intent(this,FiveActivity.class)));
        
        radioderGroup = (RadioGroup) findViewById(R.id.main_radio);
		radioderGroup.setOnCheckedChangeListener(this);
    }
	@Override
	public void onCheckedChanged(RadioGroup group, int checkedId) {
		switch(checkedId){
		case R.id.radio_button0:
			mHost.setCurrentTabByTag("ONE");
			break;
		case R.id.radio_button1:
			mHost.setCurrentTabByTag("TWO");
			break;
		case R.id.radio_button2:
			mHost.setCurrentTabByTag("THREE");
			break;
		case R.id.radio_button3:
			mHost.setCurrentTabByTag("FOUR");
			break;
		case R.id.radio_button4:
			mHost.setCurrentTabByTag("FIVE");
			break;
		}		
	}
}
  • 大小: 247 KB
分享到:
评论
1 楼 cafedog 2012-06-27  
项目正要做类似于这个东西的demo,学习了,受益匪浅!

相关推荐

    android开发之tabhost+radiogroup

    在Android应用中,TabHost和RadioGroup结合使用可以实现类似底部导航栏的效果。具体步骤如下: 1. 首先,在布局文件中设置一个TabHost,并在其中添加多个Tab(标签页)。 2. 每个Tab对应一个RadioGroup,每个...

    使用 RadioGroup和TabHost 实现底部菜单栏

    在Android应用开发中,...总之,`RadioGroup`和`TabHost`是构建Android底部菜单栏的经典方法,它们结合了简单易用和功能强大,虽然现代开发中已有更先进的替代方案,但了解这种基础实现方式对开发者来说仍然很有价值。

    Android 使用RadioGroup实现底部菜单栏

    本篇文章将深入探讨如何使用`RadioGroup`组件来实现这样的底部导航菜单栏。 `RadioGroup`是Android SDK提供的一种布局管理器,主要用于管理一组`RadioButton`控件。`RadioButton`通常用于在多个选项中选择一个,而`...

    tabHost实现底部菜单

    总结一下,`TabHost`和`RadioGroup`结合`Fragment`可以灵活地创建底部菜单。`TabHost`适合于较旧的应用或者需要独立活动的情况,而使用`RadioGroup`和`Fragment`更符合现代Android开发的最佳实践,且能更好地管理...

    RadioGroup和RadioButton实现FragmentTabHost导航效果

    `FragmentTabHost`是一个特殊的`TabHost`,它将`Tab`与`Fragment`结合,使得在不同的`Tab`上显示不同的`Fragment`内容。 首先,让我们详细了解`RadioGroup`和`RadioButton`。`RadioGroup`是一个布局容器,它可以...

    android 实现底部菜单

    总结,通过结合使用TabHost和RadioButton,我们可以创建一个可定制的底部菜单UI,让用户在多个功能模块间自由切换。在实际开发过程中,要根据项目需求灵活运用这些组件,实现更丰富的交互体验。

    Android开发登录及主页面底部菜单

    本文将深入探讨如何实现“Android开发登录及主页面底部菜单”这一主题,结合`RadioGroup`和`TabHost`等关键组件来创建高效且直观的用户交互。 首先,我们从登录界面开始。登录页面通常包括用户名和密码输入框,以及...

    TabDemo.rar

    在Android开发中,TabHost是实现底部导航栏的经典组件,常与RadioGroup和PopupWindow结合使用,以创建功能丰富的交互式界面。本文将详细讲解如何使用这三个组件来构建一个动态、用户友好的应用。 首先,TabHost是...

    新浪微博tab菜单

    在Android应用开发中,"新浪微博tab菜单"是一个常见的界面元素,用于展示多个功能模块并方便用户切换。...通过自定义`TabHost`和使用`RadioGroup`,开发者可以创建出符合自身需求且用户体验良好的tab菜单。

    android菜单条 仿网易新闻

    综上所述,模仿网易新闻的菜单条需要结合`TabHost`、自定义`RadioButton`和样式重写等技术。通过这种方式,我们可以创建一个功能齐全且美观的菜单栏,提供良好的用户交互体验。在实际开发中,还可以根据项目需求进行...

    android导航菜单集合

    RadioButton通常与RadioGroup配合使用,用户在多个选项间进行选择,每次只能选中一个,这种设计常见于切换不同的功能模块。 3. **Android实现导航菜单左右滑动效果**:这种效果是通过手势(左右滑动)来切换菜单项...

    Android开发之微信底部菜单栏实现的几种方法汇总

    RadioGroup用于展示菜单选项,而ViewPager负责处理页面的滑动切换。当ViewPager中的页面改变时,通过监听器更新RadioGroup中对应的RadioButton状态;反之,当RadioGroup中的选项被选中时,通过监听器切换ViewPager到...

    Android 仿新浪微博TabBar

    总的来说,实现一个Android版的新浪微博TabBar需要结合`TabHost`、`RadioButton`以及自定义布局和事件处理,从而创建出具有下拉菜单效果的多视图导航。通过熟练掌握这些知识点,开发者能够构建出更加丰富和交互性强...

    Android 使用FragmentTabHost实现底部菜单功能

    Android 底部菜单的实现方式有多种,包括使用 TabHost+Fragment、RadioGroup+Fragment、FragmentTabHost+Fragment 等。每种方式都有其优缺,开发者需要根据实际情况选择合适的实现方式。 在 Android 中, ...

    Android 中常见控件参考手册-中文版

    Android是谷歌开发的一种基于Linux内核的开放源代码的移动操作系统,广泛用于智能手机和平板电脑等移动设备。...此外,通过XML布局文件与Java或Kotlin代码的结合,可以实现更加复杂和动态的用户界面。

    Android 中常见控件参考手册

    - **使用**:通常与`OnCheckedChangeListener`结合使用,监听选中状态变化。 #### RadioGroup 和 RadioButton 单项选择 - **类结构**:`RadioGroup`是容器类,用于容纳多个`RadioButton`,确保同时只有一个被选中...

    黑马程序员 安卓学院 万元哥项目经理 分享220个代码实例

    |--对话框与进度条结合用法 |--屏幕之Activity全屏 |--屏幕之横竖屏切换 |--屏幕之调节屏幕亮度 |--屏幕相关之Display类获取屏幕尺寸和分辨率 |--屏幕适配之ScrollView |--屏幕适配之像素dp和px之间转换 |--工具类之...

Global site tag (gtag.js) - Google Analytics