- 浏览: 101602 次
- 性别:
- 来自: 南昌
最新评论
-
wang1114wang1114:
...
.9.png图片制作 -
m__point:
代码中明明只有下拉刷新嘛,哪儿有上拉刷新??
上拉和下拉刷新列表(自定义listview) -
kenlistian:
不错,做的非常好,适合新手学习
popupWindow弹出式窗口 -
q694119254:
你个2人 数组没排序怎么办
从数组中查找任何一个数字所在的位置(索引) -
ilysys:
没必要这么复杂,http://blog.csdn.net/il ...
以树形方式展现出该目录中的所有子目录和文件
转自:http://www.iteye.com/topic/1116261
在android中实现菜单功能有多种方法。
Options Menu:用户按下menu Button时显示的菜单。
Context Menu:用户长时间按下屏幕,所显示出来的菜单也称为上下文菜单。
Submenu:子菜单。
但是有时候这些内置的菜单并不能满足我们功能,这就需要自己自定义一种菜单。接下来我说的这种就是通过TabHost与RadioGroup结合完成的菜单。这也是很常用的一种底部菜单做法。先上图:
首先看布局文件:
- <?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;
- }
- }
- }
源码下载:
- BottomMenu1.rar (126.9 KB)
- 下载次数: 136
发表评论
-
关于Ant多渠道批量打包总结
2013-04-27 17:24 937doc文档,附带源码 -
item嵌套button使listview onitemClick事件不响应
2012-06-08 11:21 2430解决方法:让button失去焦点,设置android:focu ... -
Android2.2 API中文文档——Android View的xml属性理解
2012-05-17 13:30 1256java.lang.Object android.vi ... -
上拉和下拉刷新列表(自定义listview)
2012-05-09 16:05 3478自定义listview: package cn.net.i ... -
ProgressBar的使用(注意小细节)
2012-04-27 15:31 1163做项目的时候希望滚动圈出现在中间,在布局文件中,如果使用的线性 ... -
Gallery 模仿Flash广告栏
2012-04-26 10:57 1187转自:http://androiddada.iteye.com ... -
popupWindow弹出式窗口
2012-04-23 14:50 2534转自:http://www.eoeandr ... -
.9.png图片制作
2012-04-18 11:23 38089转载请注明出自”百度MUX” 本文链接:ht ... -
activity生命周期
2012-04-17 17:45 778引用 转载文章:http://www.cnblogs.co ... -
listview圆角实现
2012-04-10 11:16 1153<?xml version="1.0&qu ... -
listview实现单选功能
2012-04-06 10:23 1312package com.xiaoming; impo ... -
android相对布局的属性
2012-02-05 15:07 1037android:layout_above:将该控件的底部置于给 ... -
Android中ListView分页加载数据
2011-12-27 17:25 843[url] 文章转自:http://www.open-open ... -
Intent中的四个重要属性——Action、Data、Category、Extras
2011-12-19 10:19 832http://www.cnblogs.com/wiseking ... -
dialog对话框
2011-12-17 19:38 784http://www.cnblogs.com/tqj-zyy/ ... -
Android预定义样式
2011-12-17 19:28 1104对于能够显示文字的控件(如TextView EditText ... -
LayoutInflater的使用
2011-12-17 18:42 844LayoutInflater用处很大,具体参考http://w ... -
Android系统默认的布局方式
2011-12-16 20:43 1228项目当中自己定义的布局方式可以通过R.layout.xxx访问 ...
相关推荐
TabHost实现底部菜单, 底部菜单选项卡主要是通过TabHost和RadioGroup实现
以下是如何使用`RadioGroup`实现底部菜单栏的步骤: 1. **布局设计**:首先,在XML布局文件中创建`RadioGroup`,并为每个底部菜单项添加`RadioButton`。每个`RadioButton`应包含相应的图标和文本描述。例如: ```...
本教程将详细介绍如何利用`RadioGroup`和`TabHost`来实现这样一个底部菜单栏。 `RadioGroup`是Android SDK中的一个布局容器,它允许你创建一组单选按钮(RadioButton)。在这个场景中,我们将使用`RadioGroup`作为...
RadioGroup提供了监听器来监听选中状态的变化,这对于实现底部菜单栏的切换逻辑非常有用。 在Android应用中,TabHost和RadioGroup结合使用可以实现类似底部导航栏的效果。具体步骤如下: 1. 首先,在布局文件中...
总结一下,`TabHost`和`RadioGroup`结合`Fragment`可以灵活地创建底部菜单。`TabHost`适合于较旧的应用或者需要独立活动的情况,而使用`RadioGroup`和`Fragment`更符合现代Android开发的最佳实践,且能更好地管理...
本文将详细讲解如何使用TabHost和RadioButton来实现这样一个底部菜单UI界面。 首先,我们需要理解TabHost和RadioButton的基本概念。TabHost是Android提供的一种容器组件,它可以将多个Tab(标签)组合在一起,每个...
在这个项目中,开发者使用了RadioGroup、Switch、Fragment以及TabHost等组件来构建一个底部菜单栏。 1. **RadioGroup**: RadioGroup是Android中用于管理多个RadioButton的容器,它允许用户在多个选项中选择一个。在...
本文将深入探讨如何实现“Android开发登录及主页面底部菜单”这一主题,结合`RadioGroup`和`TabHost`等关键组件来创建高效且直观的用户交互。 首先,我们从登录界面开始。登录页面通常包括用户名和密码输入框,以及...
二、通过RadioGroup和RadioButton实现底部菜单栏 另一种实现方式是不使用TabWidget,而是使用RadioGroup配合RadioButton,这样更灵活,可以自定义更多的交互和动画效果。 1. **布局设计**:在XML布局文件中,创建...
Android 底部菜单的实现方式有多种,包括使用 TabHost+Fragment、RadioGroup+Fragment、FragmentTabHost+Fragment 等。每种方式都有其优缺,开发者需要根据实际情况选择合适的实现方式。 在 Android 中, ...
以上就是Android开发中实现微信底部菜单栏的几种常见方法。根据项目需求和个人喜好,可以选择适合的方案进行实现。在实际开发中,还可以结合其他组件或库,如BottomNavigationView,进一步优化用户体验。
本篇文章将介绍如何利用TabHost实现一个具有类似微信底部菜单栏功能的组件,包括显示未读消息计数的功能。 首先,TabHost是Android SDK提供的一种用于创建带有选项卡的Activity的组件。它由两部分组成:TabWidget和...
在Android开发中,TabHost是实现底部导航栏的经典组件,常与RadioGroup和PopupWindow结合使用,以创建功能丰富的交互式界面。本文将详细讲解如何使用这三个组件来构建一个动态、用户友好的应用。 首先,TabHost是...
通过以上步骤,我们可以实现一个与微信类似的底部菜单栏,不仅提供功能切换,还能实时显示未读消息数量,从而提供更好的交互体验。在实际开发中,可以根据项目需求进行进一步的定制和优化,比如增加动画效果,调整...
- 如果使用`BottomNavigationView`,还需关注其与`NavController`的集成,以实现Jetpack导航组件的特性。 总结来说,虽然`TabHost`在当前的Android开发中已逐渐被取代,但它仍然是理解Android选项卡式界面历史的...
RadioButton通常与RadioGroup配合使用,用户在多个选项间进行选择,每次只能选中一个,这种设计常见于切换不同的功能模块。 3. **Android实现导航菜单左右滑动效果**:这种效果是通过手势(左右滑动)来切换菜单项...