在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());
}
当内容发生改变时它会调用这个方法,来更新列表或者其他视图,而这个方法中需要实例化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;
}
}
}
这个应该没有什么好难理解的。OK该睡了。有什么问题留言!
- 大小: 247 KB
分享到:
相关推荐
下面我们将深入探讨Android底部菜单的设计原则、实现方式以及可能涉及的关键技术。 1. **设计规范**: - 底部菜单通常包含3到5个主要操作,每个图标和对应的标签清晰地表示了其功能。 - 图标应简洁且易于识别,...
这个“Android底部菜单栏”教程是为初学者设计的,旨在帮助他们理解如何在Android应用中实现这一功能。我们将主要探讨TabHost组件,它是Android早期版本中用来实现标签页式导航的一种方式。 首先,我们需要了解底部...
总结来说,"android底部菜单中间部分凸起"是通过自定义样式和选中事件监听来实现的,而"微信底部带数目显示菜单"则是通过自定义菜单项视图或者使用BadgeView来完成的。这两个特性都是为了提升用户体验,提供清晰的...
本示例中的“android底部凸起导航菜单”是利用`FrameLayout`来实现的,它具有类似`RadioGroup`的交互效果,即点击某个选项时会显示高亮状态,提供清晰的用户反馈。 `FrameLayout`是Android的一种布局容器,它允许子...
里面有引导页和登录页面供大家参考。Android底部菜单和侧滑菜单的综合应用,大家不下载的可以去看源码http://blog.csdn.net/u012600997/article/details/50686472
消息数提醒通常需要与应用的数据模型相结合,当有新消息时,通过`BadgeView`或者在底部菜单图标上添加一个小红点来显示未读消息的数量。 3. 使用第三方库:还有一些第三方库,如`BottomBar`和`Material Design ...
在Android应用开发中,底部菜单(Bottom Navigation)是一种常见的用户界面元素,用于提供在多个主要功能之间快速切换的途径。这种设计模式遵循Material Design规范,旨在提高用户体验,让用户能够轻松地访问应用...
标题“android activitygroup底部菜单”指的是在Android应用中,使用ActivityGroup来实现底部菜单的功能。底部菜单通常由几个图标按钮组成,点击不同的按钮可以切换到相应的功能页面,而不会每次都完全退出当前...
总的来说,创建Android底部菜单栏涉及到布局设计、菜单资源定义、事件监听以及可能的样式定制。开发者需要对Android的UI组件和生命周期有深入理解,才能构建出用户体验良好的底部导航功能。通过不断实践和优化,我们...
在Android应用开发中,底部菜单(Bottom Navigation)是常见的用户界面元素,用于提供主要功能间的快速切换。本文将深入探讨如何进行底部菜单的架构设计以及封装实现,参考自...
在Android应用开发中,底部菜单(Bottom Navigation)是一种常见的用户界面元素,用于提供主要功能间的快速切换。这种设计模式在Android Material Design规范中被广泛推荐,可以提高用户体验,使用户能够轻松地在...
在Android的应用中,经常会见到底部菜单.而在企业级的Android应用中,也存在同样的需求,但与微信这些大众软件的区别在于企业级的Android应用由于UI页面很多,每个页面都需要有底部菜单,而且每个页面的底部菜单按钮...
在Android应用开发中,底部菜单栏(通常称为TabBar或BottomNavigationView)是用户界面不可或缺的一部分,它为用户提供了一种在不同功能模块之间切换的方式。本文将深入探讨如何使用RadioGroup结合Fragment来实现...
总之,创建一个Android底部菜单栏需要理解`BottomNavigationView`的工作原理,以及如何结合`MenuItem`和`Fragment`来响应用户的交互。同时,掌握好Android布局管理、事件监听和数据绑定等基本概念也是必不可少的。...
通过以上步骤,我们可以成功地创建一个仿微信底部菜单栏,不仅提供了基本的导航功能,还实现了字体显示隐藏和菜单项的动态缩放,极大地提升了应用的交互性和美观性。在开发过程中,不断优化和迭代,将使这个底部菜单...
在Android应用开发中,创建一...总的来说,通过TabHost实现的Android底部菜单栏仿微博效果是一种基础方法,适用于学习和简单的应用。然而,为了提供更现代的用户体验,开发者应当考虑使用Android官方推荐的组件和技术。
在Android应用开发中,底部菜单(Bottom Navigation)是一种常见的交互元素,它位于屏幕的底部,通常包含三到五个图标,每个图标对应一个主要的功能模块。这种设计使得用户可以方便地在不同页面之间切换,提高了用户...
在Android应用开发中,底部菜单栏(Bottom Navigation Bar)是一种常见的用户界面元素,它提供了一种方便用户在多个主要功能之间切换的方式。本资源聚焦于使用`TabHost`组件来实现这种底部菜单栏功能。`TabHost`是...
在Android应用开发中,创建一个底部菜单栏是十分常见的需求,它可以帮助用户在多个功能之间进行切换。本篇文章将深入探讨如何使用`RadioGroup`组件来实现这样的底部导航菜单栏。 `RadioGroup`是Android SDK提供的一...