欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android底部菜单简单应用

程序员文章站 2023-12-21 21:08:40
在android中实现菜单功能有多种方法。 options menu:用户按下menu button时显示的菜单。 context menu:用户长时间按下屏幕,所...

在android中实现菜单功能有多种方法。
options menu:用户按下menu button时显示的菜单。
context menu:用户长时间按下屏幕,所显示出来的菜单也称为上下文菜单。
submenu:子菜单。
但是有时候这些内置的菜单并不能满足我们功能,这就需要自己自定义一种菜单。接下来我说的这种就是通过tabhost与radiogroup结合完成的菜单。这也是很常用的一种底部菜单做法。先上图:

Android底部菜单简单应用

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

上一篇:

下一篇: