Android底部菜单简单应用
程序员文章站
2023-12-21 21:08:40
在android中实现菜单功能有多种方法。
options menu:用户按下menu button时显示的菜单。
context menu:用户长时间按下屏幕,所...
在android中实现菜单功能有多种方法。
options menu:用户按下menu button时显示的菜单。
context menu:用户长时间按下屏幕,所显示出来的菜单也称为上下文菜单。
submenu:子菜单。
但是有时候这些内置的菜单并不能满足我们功能,这就需要自己自定义一种菜单。接下来我说的这种就是通过tabhost与radiogroup结合完成的菜单。这也是很常用的一种底部菜单做法。先上图:
xml代码
<?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; } } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。