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

Android 活动条ActionBar的详解及实例代码

程序员文章站 2024-03-31 11:25:52
android 活动条actionbar的详解 图一 图二 图三 图四 图五 actionbar其提供的功能总结 图...

android 活动条actionbar的详解

图一
Android 活动条ActionBar的详解及实例代码
图二
Android 活动条ActionBar的详解及实例代码
图三
Android 活动条ActionBar的详解及实例代码
图四
Android 活动条ActionBar的详解及实例代码
图五
Android 活动条ActionBar的详解及实例代码

actionbar其提供的功能总结

图一使用actionbar显示选项菜单项

            menu_mainxml代码

启用程序图标导航

如何添加action view

  • 图二activity代码区
  • menu_mainxml代码
  • clockxml

图三使用actionbar实现tab导航

  • 创建actionbar实现tab导航步骤
  • mainactivity代码
  • dummyfragmentjava代码

图四android 30之前的fragment支持

  • mainxml代码
  • mainactivity代码

图五使用actionbar实现下拉式导航

  • 创建actionbar实现下拉导航步骤
  • mainactivity代码区

actionbar是android 3.0的重要更新之一。所以现在只要目标版本高于11,默认就会启动actionbar。

actionbar其提供的功能总结:

  1. 显示选项菜单的菜单项
  2. 使用程序图标作为返回home主屏或向上导航操作
  3. 提供交互式view作为action view
  4. 提供基于tab的导航方式,可用于切换多个fragment
  5. 提供基于下拉导航方式

隐藏actionbar,使用过的朋友应该都知道,在androidmanifest.xml中直接定义noactionbar即可关闭actionbar,不过这种方法关闭actionbar的话后续就无法再使用actionbar。所以一般我们用第二种代码隐藏的方式来进行对actionbar的操作:

1.getactionbar();
2.show():显示actionbar
3.hide():隐藏actionbar

图一使用actionbar显示选项菜单项

menu_main.xml代码:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:title="@string/font_size"
    android:showasaction="always|withtext"
    android:icon="@drawable/font">
    <menu>
      <!-- 定义一组单选菜单项 -->
      <group android:checkablebehavior="single">
        <!-- 定义多个菜单项 -->
        <item
          android:id="@+id/font_10"
          android:title="@string/font_10"/>
        <item
          android:id="@+id/font_12"
          android:title="@string/font_12"/>
        <item
          android:id="@+id/font_14"
          android:title="@string/font_14"/>
        <item
          android:id="@+id/font_16"
          android:title="@string/font_16"/>
        <item
          android:id="@+id/font_18"
          android:title="@string/font_18"/>
      </group>
    </menu>
  </item>
  <!-- 定义一个普通菜单项 -->
  <item android:id="@+id/plain_item"
     android:showasaction="always|withtext"
     android:title="@string/plain_item">
  </item>
  <item android:title="@string/font_color"
     android:showasaction="always"
     android:icon="@drawable/color">
    <menu>
      <!-- 定义一组允许复选的菜单项 -->
      <group>
        <!-- 定义三个菜单项 -->
        <item
          android:id="@+id/red_font"
          android:title="@string/red_title"/>
        <item
          android:id="@+id/green_font"
          android:title="@string/green_title"/>
        <item
          android:id="@+id/blue_font"
          android:title="@string/blue_title"/>
      </group>
    </menu>
  </item>
</menu>

启用程序图标导航

// 设置是否显示应用程序图标    
actionbar.setdisplayshowhomeenabled(true); 
// 将应用程序图标设置为可点击的按钮             
actionbar.sethomebuttonenabled(true);    
// 将应用程序图标设置为可点击的按钮,并在图标上添加向左箭头       
actionbar.setdisplayhomeasupenabled(true); 
//通过传入的int类型常量来控制该actionbar的显示选项,只显示箭头和customview显示出来
actionbar.setdisplayoptions(actionbar.display_home_as_up | actionbar.display_show_custom);

如何添加action view

actionbar上除了可以显示普通的action item之外,还可以显示普通的ui组件,有如下两种方式:

1.定义action item时使用android:actionviewclass属性指定aciton view的实现类
2.定义action item时使用android:actionlayout属性指定action view对应的视图

图二activity代码区:

public class mainactivity extends activity {
  @override
  public void oncreate(bundle savedinstancestate)
  {
    super.oncreate(savedinstancestate);
    setcontentview(r.layout.main);
  }

  @override
  public boolean oncreateoptionsmenu(menu menu)
  {
    getmenuinflater().inflate(r.menu.menu_main, menu);
    return true;
  }
}

menu_main.xml代码:

<?xml version="1.0" encoding="utf-8" ?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
  <item
    android:id="@+id/search"
    android:orderincategory="100"
    android:showasaction="always"
    android:actionviewclass="android.widget.searchview"/>
  <item
    android:id="@+id/progress"
    android:orderincategory="100"
    android:showasaction="always"
    android:actionlayout="@layout/clock"
    />
</menu>

clock.xml

<?xml version="1.0" encoding="utf-8" ?>
<analogclock
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
/>

图三使用actionbar实现tab导航

创建actionbar实现tab导航步骤:

1.调用actionbar的setnavigationmode(actionbar.navigation_mode_tabs)方法使用tab导航方式

2.调用actionbar的add()方法添加多个tab标签,并为每个tab标签添加事件监听器

mainactivity代码:

public class mainactivity extends activity implements
  actionbar.tablistener
{
  private static final string selected_item = "selected_item";
  @override
  public void oncreate(bundle savedinstancestate)
  {
    super.oncreate(savedinstancestate);
    setcontentview(r.layout.main);
    final actionbar actionbar = getactionbar();
    // 设置actionbar的导航方式:tab导航
    actionbar.setnavigationmode(actionbar.navigation_mode_tabs);
    // 依次添加三个tab页,并为三个tab标签添加事件监听器
    actionbar.addtab(actionbar.newtab().settext("第一页")
      .settablistener(this));
    actionbar.addtab(actionbar.newtab().settext("第二页")
      .settablistener(this));
    actionbar.addtab(actionbar.newtab().settext("第三页")
      .settablistener(this));
  }
  @override
  public void onrestoreinstancestate(bundle savedinstancestate)
  {
    if (savedinstancestate.containskey(selected_item))
    {
      // 选中前面保存的索引对应的fragment页
      getactionbar().setselectednavigationitem(
          savedinstancestate.getint(selected_item));
    }
  }
  @override
  public void onsaveinstancestate(bundle outstate)
  {
    // 将当前选中的fragment页的索引保存到bundle中
    outstate.putint(selected_item,
        getactionbar().getselectednavigationindex());
  }
  @override
  public void ontabunselected(actionbar.tab tab,
    fragmenttransaction fragmenttransaction)
  {
  }
  // 当指定tab被选中时激发该方法
  @override
  public void ontabselected(actionbar.tab tab,
    fragmenttransaction fragmenttransaction)
  {
    // 创建一个新的fragment对象
    fragment fragment = new dummyfragment();
    // 创建一个bundle对象,用于向fragment传入参数
    bundle args = new bundle();
    args.putint(dummyfragment.arg_section_number,
        tab.getposition() + 1);
    // 向fragment传入参数
    fragment.setarguments(args);
    // 获取fragmenttransaction对象
    fragmenttransaction ft = getfragmentmanager()
        .begintransaction();
    // 使用fragment代替该activity中的container组件
    ft.replace(r.id.container, fragment);
    // 提交事务
    ft.commit();
  }
  @override
  public void ontabreselected(actionbar.tab tab,
    fragmenttransaction fragmenttransaction)
  {
  }
}

dummyfragment.java代码:

简单的fragment,只显示一个textview组件

public class dummyfragment extends fragment
{
  public static final string arg_section_number = "section_number";
  // 该方法的返回值就是该fragment显示的view组件
  @override
  public view oncreateview(layoutinflater inflater, viewgroup container,
     bundle savedinstancestate)
  {
    textview textview = new textview(getactivity());
    textview.setgravity(gravity.center_horizontal);
    // 获取创建该fragment时传入的参数bundle
    bundle args = getarguments();
    // 设置textview显示的文本
    textview.settext(args.getint(arg_section_number) + "");
    textview.settextsize(30);
    // 返回该textview
    return textview;
  }
}

图四android 3.0之前的fragment支持

android3.0之前的fragment不是继承自app.fragment,而是继承自v4.app.fragment。除此之外,v4.app.fragment还提供如下配套类:

1.fragmentactivity
2.viewpager
3.fragmentpageradapter
4.pagertitlestrip

main.xml代码:

<?xml version="1.0" encoding="utf-8" ?>
<android.support.v4.view.viewpager
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/pager"
  android:layout_width="match_parent"
  android:layout_height="match_parent">
  <!-- 定义导航状态条组件 -->
  <android.support.v4.view.pagertitlestrip
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="top"
    android:background="#33b5e5"
    android:textcolor="#fff"
    android:paddingtop="4dp"
    android:paddingbottom="4dp" />
</android.support.v4.view.viewpager>

mainactivity代码:

public class mainactivity extends fragmentactivity
  implements actionbar.tablistener
{
  viewpager viewpager;
  actionbar actionbar;
  @override
  public void oncreate(bundle savedinstancestate)
  {
    super.oncreate(savedinstancestate);
    setcontentview(r.layout.main);
    // 获取actionbar对象
    actionbar = getactionbar();
    // 获取viewpager
    viewpager = (viewpager) findviewbyid(r.id.pager);
    // 创建一个fragmentpageradapter对象,该对象负责为viewpager提供多个fragment
    fragmentpageradapter pageradapter = new fragmentpageradapter(
      getsupportfragmentmanager())
    {
      // 获取第position位置的fragment
      @override
      public fragment getitem(int position)
      {
        fragment fragment = new dummyfragment();
        bundle args = new bundle();
        args.putint(dummyfragment.arg_section_number, position + 1);
        fragment.setarguments(args);
        return fragment;
      }
      // 该方法的返回值i表明该adapter总共包括多少个fragment
      @override
      public int getcount()
      {
        return 3;
      }
      // 该方法的返回值决定每个fragment的标题
      @override
      public charsequence getpagetitle(int position)
      {
        switch (position)
        {
          case 0:
            return "第一页";
          case 1:
            return "第二页";
          case 2:
            return "第三页";
        }
        return null;
      }
    };
    // 设置actionbar使用tab导航方式
    actionbar.setnavigationmode(actionbar.navigation_mode_tabs);
    // 遍历pageradapter对象所包含的全部fragment
    // 每个fragment对应创建一个tab标签
    for (int i = 0; i < pageradapter.getcount(); i++)
    {
      actionbar.addtab(actionbar.newtab()
        .settext(pageradapter.getpagetitle(i))
        .settablistener(this));
    }
    // 为viewpager组件设置fragmentpageradapter
    viewpager.setadapter(pageradapter); // ①
    // 为viewpager组件绑定事件监听器
    viewpager.setonpagechangelistener(
      new viewpager.simpleonpagechangelistener()
      {
        // 当viewpager显示的fragment发生改变时激发该方法
        @override
        public void onpageselected(int position)
        {
          actionbar.setselectednavigationitem(position);
        }
      });
  }
  @override
  public void ontabunselected(actionbar.tab tab,
    fragmenttransaction fragmenttransaction)
  {
  }
  // 当指定tab被选中时激发该方法
  @override
  public void ontabselected(actionbar.tab tab,
     fragmenttransaction fragmenttransaction)
  {
    viewpager.setcurrentitem(tab.getposition()); // ②
  }
  @override
  public void ontabreselected(actionbar.tab tab,
    fragmenttransaction fragmenttransaction)
  {
  }
}

图五使用actionbar实现下拉式导航

创建actionbar实现下拉导航步骤

1:调用actionbar的actionbar.setnavigationmode (actionbar.navigation_mode_list)方法设置下拉列表导航方式

2:调用actionbar的setlistnavigationcallbacks(spinneradapter adapter,actionbar.onnavigationlistener callback)方法添加多个列表项,并为每个列表项设置监听事件。

mainactivity代码区:

public class mainactivity extends activity implements
    actionbar.onnavigationlistener
{
  private static final string selected_item = "selected_item";
  @override
  public void oncreate(bundle savedinstancestate)
  {
    super.oncreate(savedinstancestate);
    setcontentview(r.layout.main);
    final actionbar actionbar = getactionbar();
    // 设置actionbar是否显示标题
    actionbar.setdisplayshowtitleenabled(true);
    // 设置导航模式,使用list导航
    actionbar.setnavigationmode(actionbar.navigation_mode_list);
    // 为actionbar安装arrayadapter
    actionbar.setlistnavigationcallbacks(
      new arrayadapter<string>(this,
        android.r.layout.simple_list_item_1,
        android.r.id.text1, new string[]
        {"第一页","第二页","第三页" }), this);
  }
  @override
  public void onrestoreinstancestate(bundle savedinstancestate)
  {
    if (savedinstancestate.containskey(selected_item))
    {
      // 选中前面保存的索引对应的fragment页
      getactionbar().setselectednavigationitem(
          savedinstancestate.getint(selected_item));
    }
  }
  @override
  public void onsaveinstancestate(bundle outstate)
  {
    // 将当前选中的fragment页的索引保存到bundle中
    outstate.putint(selected_item,
        getactionbar().getselectednavigationindex());
  }
  // 当导航项被选中时激发该方法
  @override
  public boolean onnavigationitemselected(int position, long id)
  {
    // 创建一个新的fragment对象
    fragment fragment = new dummyfragment();
    // 创建一个bundle对象,用于向fragment传入参数
    bundle args = new bundle();
    args.putint(dummyfragment.arg_section_number, position + 1);
    // 向fragment传入参数
    fragment.setarguments(args);
    // 获取fragmenttransaction对象
    fragmenttransaction ft = getfragmentmanager().begintransaction();
    // 使用fragment代替该activity中的container组件
    ft.replace(r.id.container, fragment);
    // 提交事务
    ft.commit();
    return true;
  }
}

android中actionbar的使用基本到这里,今后有项目中遇到问题还会及时更新。有问题欢迎留言。

 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!